123
準備好AWS Fargate,然後設定Atlantis和Github,然後藉由Terragrunt部署AWS資源。
事前準備
學習曲線應該由Terrafrom -> Terragrunt -> Atlantis。起碼要有terraform providers
相關的知識,畢竟要知道Atlantis是如何觸發Terrafrom去跑建制的流程。
前言
在之前GCP部署Atlantis通常是使用Atlantis的Helm chart部署到GKE上,這次因為換工作的緣故使用到AWS,就想嘗試官方推薦的AWS Fargate的terraform module
關於比較敏感的值,像是token, AccessKey在Amazon ECS上有兩個建議處理方式
1.AWS Secrets Manager secrets
2.AWS Systems Manager Parameter Store (SSM
Ref: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html
官方建議建立一個專用的atlantis-robot的GitHub帳號,然後記得準備一個token。
在後面github-complete module 我們會自行建立webhook
AWS官方atlantis terraform module就是用AWS Systems Manager Parameter 來儲存GitHub token.
主要的原因我認為有兩個
1. 可以限制存取權,先建立ecs_task_execution iam角色,再建立iam role policy 來限制ssm 的讀取權
2. 在ECS task設定不會顯示在Environment Variable,這樣一般使用者也不容易找到token
流程步驟
第一步先把token和密碼存放在AWS Secrets Manager,也可以用其他的方法,像是KMS或使用環境變數。
把access_key,secret_key和github_user_token存進去。
第二步準備一個terraform module(aws_secretsmanager_secret_version)去取得secrets manager的值
然後寫一個terragrunt.hcl去呼叫。 Github
第三步是生成有terragrunt binary的atlantis docker image。我會附帶兩個檔案repos.yaml和repos-destroy-func.yaml /opt/repos-destroy-func.yaml,這兩個是server-side repo設定檔。Github
我會用環境變數ATLANTIS_REPO_CONFIG去決定要用哪一個server-side repo設定檔
- repos.yaml是使用terragrunt run-all去跑設定,terragrunt run-all 原生是不支援plan -out,所以只能這樣跑
- 在terragrunt plan 加上 — terragrunt-non-interactive,是因為有時候會需要terragrunt 先幫忙建立s3 state bucket時,terragrunt會先詢問你(y/n),
這時候我們需要回答yes
- repos-destroy-func.yaml沒有跑run-all,但是有支援`atlantis plan — -destroy`去生成destroy plan然後可以跑atlantis apply去destroy。
第四步是使用AWS atlantis module,這裡我會改寫我會改寫裡面的github-complete 例子。Github
我這裡會使用terragrunt的寫法,我把一部分變數移到上層的common.tfvars,然後github token和AWS key使用dependency從第二步的module output引入,把值使用在environment variables。也使用ATLANTIS_REPO_CONFIG去使用repos.yaml。
terragrunt apply
check the task
open atlantis in browser
測試atlantis,在atlantis_allowed_repo的repo中做更新,新增一個VPC的terragrunt.hcl,然後PR。
- 在指定的資料夾下跑 terragrunt plan
atlantis plan -d terragrunt-atlantis-version/tperd/test/ap-southeast-1/BE/vpc-be
- 在指定的資料夾下跑 terragrunt apply
atlantis apply -d terragrunt-atlantis-version/tperd/test/ap-southeast-1/BE/vpc-be
ref: https://github.com/jeff51419/Atlantis-AWS-Fargate/pull/2
P.S. 我不小心把user和Atlantis robot帳號搞相反,所以看起來有點奇怪
你也可以在AWS VPC上確認
總結
- 我們準備一個github帳號和他的token
- 準備一組AWS access_key和secret_key
- 把上面三個值存在AWS secrets manager
- 準備一個terraform module去 output 以上三個值
- 準備一個客製化的Atlantis with terragrunt docker image
- 準備改寫AWS atlantis module(github-complete)
- 使用terragrunt dependency功能把三個secrets傳入atlantis module