Atlantis with AWS Fargate

Jeff Yen
7 min readJun 1, 2021

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或使用環境變數。

https://blog.gruntwork.io/a-comprehensive-guide-to-managing-secrets-in-your-terraform-code-1d586955ace1

把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上確認

總結

  1. 我們準備一個github帳號和他的token
  2. 準備一組AWS access_key和secret_key
  3. 把上面三個值存在AWS secrets manager
  4. 準備一個terraform module去 output 以上三個值
  5. 準備一個客製化的Atlantis with terragrunt docker image
  6. 準備改寫AWS atlantis module(github-complete)
  7. 使用terragrunt dependency功能把三個secrets傳入atlantis module

--

--