利用Pulumi建構AWS Elastic Beanstalk環境

每次建構AWS雲端環境都要花你很多時間嗎?利用Infrastructure as Code (IaC)工具Pulumi自動化你的AWS雲端環境部署流程吧!本文將帶你學會如何撰寫Pulumi Code以架設AWS Elastic Beanstalk的環境。

Daniel Hu
7 min readNov 19, 2019

透過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/

我們公司的部署流程中分別會用到:

  1. S3
  2. ECR
  3. 對應上EB的ServiceRole和IamInstanceProfile
  4. EB Application
  5. 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) 告訴我,我們可以一起研究解決方法!

--

--