利用Pulumi建構AWS Elastic Beanstalk環境
每次建構AWS雲端環境都要花你很多時間嗎?利用Infrastructure as Code (IaC)工具Pulumi自動化你的AWS雲端環境部署流程吧!本文將帶你學會如何撰寫Pulumi Code以架設AWS Elastic Beanstalk的環境。
透過eb-cli來建構一個AWS Elastic Beanstalk Application和Environment雖然簡單又快速,但是當你需要同時建構很多個環境,又要保持該有的可維護性,你可能需要開始使用Infrastructure as Code (IaC)。如同對於IaC的討論中提到的,IaC能夠幫助開發團隊省去做同樣事情的時間,又能夠確保架設環境的品質。
在此,我們提供了一個常見的Terraform之外的選擇 — Pulumi,透過這篇文章的簡單操作就能了解我們選擇Pulumi的原因。Pulumi如何其他IaC服務,有相當完備的Doc和API,其中的服務項目繼承了老大哥Terraform,差別在於,Pulumi讓你使用你喜歡的語言(e.g. JS, Typescript, Go, C#, .NET, Python…etc)來撰寫你的IaC code。
本文將說到:
1. 如何註冊和安裝Pulumi
2. 建構一個Pulumi aws-typescript專案
3. 撰寫Pulumi Code以架設AWS Elastic Beanstalk部署環境
4. 設定環境變數(Environmental Variable)來簡化流程以適應各種環境
5. Pulumi Up正式建構環境
註冊和安裝Pulumi
Pulumi提供了多種註冊管道,包含Github、Gitlab、Atlassian (Bitbucket)等版控工具以及信箱作為註冊管道。
安裝的部分可以從官方文件中找到適合各種作業系統的安裝方式。以Mac OSX為例:
# 以下二選一# 可以用Homebrew來下載
$ brew install pulumi# 也可以直接跑Script(用brew就不需要執行這行囉!)
$ curl -fsSL <https://get.pulumi.com> | sh
確認是否下載成功可以執行:
$ pulumi version
若是順利,就可以在 pulumi-cli
中登入:
$ pulumi login
如果你在瀏覽器中的Pulumi是登入狀態,這段script會帶你進入瀏覽器然後將登入狀態帶到CLI當中。若看到這個畫面,就代表成功了:
建構一個Pulumi aws-typescript專案
順利登入pulumi-cli
之後,我們開始建立第一個Pulumi-AWS專案吧:
# 首先建立一個新的資料夾
$ mkdir my-pulumi-aws
$ cd my-pulumi-aws# 然後可以直接開始一個新專案並逐步輸入自己的設定
$ pulumi new
接著,Pulumi會開始問你一系列的問題,Project name和Stack name的部分,一個Project中會包含多個Stack,每個Stack都是用來建立不同環境的,例如dev, staging和prod。
# 這篇文章會以typescript來書寫,所以第一題請選
$ Please choose a template: aws-typescript$ project name: (my-pulumi-aws)
$ project description: A brief description of this project...
$ stack name: (dev)# 可以在這裡輸入你將要部署環境的AWS Region,在之後的設定檔中其實也還可以改
$ aws: region: The AWS region to deploy to: (us-east-1)
安裝完之後,Pulumi就為你建立好一個工作環境了。
撰寫Pulumi Code以架設AWS Elastic Beanstalk部署環境
Pulumi有非常完善的文件,能夠對應到不論AWS、Azure或Google Cloud的各種雲端服務。既然這篇文章要以AWS Elastic Beanstalk為例,我們就附上Pulumi/aws的文件:https://www.pulumi.com/docs/reference/pkg/nodejs/pulumi/aws/。
我們公司的部署流程中分別會用到:
- S3
- ECR
- 對應上EB的ServiceRole和IamInstanceProfile
- EB Application
- EB Environment
讓我們逐步來撰寫。首先來import必要的套件
接著,寫入環境變數(下一章會講到)
再來設定用來配合Elastic Beanstalk所需要的其他AWS設定
最後,設定Elastic Beanstalk的Application和Environment
除了寫在這裡的Code之外,也可以參考以下的連結來客製化你所需要的設定
設定環境變數(Environmental Variable)以適應各種環境
在開發中,常見的環境包含開發中的dev、測試用的staging以及上線版prod。Pulumi當然也知道我們有多種環境要設定,因此在每一個project中,我們可以寫多個stack,每一個stack分別用來儲存一種環境的變數。
在初始化(pulumi new)時,我們有填寫一個欄位:”stack name”,因此,在資料夾中我們能找到一個 Pulumi.{{stack-name}}.yaml
的檔案。我們也可以自己建立新的檔案,以我們公司的practice為例,我們會將所有的stack file放到 /project-root/stacks/
之下,分別將這些檔案取名為 Pulumi.dev.yaml
, Pulumi.stage.yaml
以及 Pulumi.prod.yaml
。
在這些檔案中,我們會寫入:
請在/.aws/credentials中設定profile然後在這段code中寫入 aws:profile: {{Your Profile Name}}
。
Pulumi Up正式建構環境
最後,終於來到期待的時刻,現在可以透過 pulumi up
正式建構AWS Elastic Beanstalk的環境了。如果把有 Pulumi.dev.yaml
檔案放到 /stacks/
資料夾之下的話,請使用這個script來設定:
$ pulumi up --config-file stacks/Pulumi.dev.yaml
輸入之後,Pulumi會開始檢查這些有沒有通過,沒問題的話就可以按下”Yes”然後給Pulumi一點時間將整個AWS的環境建立起來囉!
整個操作流程有非常多步驟,在設定上難免會發生些狀況,如果跟著這篇文章的操作有遇到什麼狀況,請不吝於寫封信 (daniel@skand.io) 告訴我,我們可以一起研究解決方法!