AtlantisでTerraformの実行を自動化しよう!
はじめに
こんにちは!Hamee株式会社の tatsuo48 です。
Terraformの自動化ツールであるAtlantisについて書きます。
主に以下の事項について書きます。
- Atlantisとは何か?
- 基本的な使い方、運用TIPS
逆に以下については触れません
- Atlantisの内部仕様
- Atlantisの構築方法
- Installation Guideをご確認下さい
- GitHubAppをつかったやり方[1]がおすすめです。
Atlantisとは何か?
AtlantisとはTerraformの操作(plan
やapply
)をPRのコメントベースで実行可能にしてくれるツールです。
公式のTOP画像がわかりやすいのでそれを見ながら説明します。
PRを作成
Terrformのリソースを変更するようなPRを作成!
terraform plan
を自動実行
webhookなどを使ってPRが作成されたことを検知したAtlantisは、リポジトリをgit clone
してterraform plan
を実行!
実行結果をPRにコメントとして返してくれます。
terraform apply
を実行
実行結果を確認して問題がなければ、atlantis apply
とコメントします。
またまた、このコメントをwebhookなどで検知したAtlantisは、今度はterraform apply
を実行します。
そして、実行結果をこれまたPRにコメントとして返してくれます。
問題なければPRをマージして変更完了です🙌
GitHubActionやCircleCIでもできそうだけど?
はい!GitHubActionsでもterraform plan
やterrform apply
の自動化はできます。
以下のようなGitHubActionsや
terraform plan
結果通知のためのツールもあります
こういったツールを組みあわせて自動化した場合と比較してAtlantisには以下のようなメリットがあります。[2]
PR単位でのロック機構
AtlantisにはPR単位でロックする機能があります。
これにより複数人が同時並行でPRを作成した場合でも1つずつ順番に適用することが可能です。
Terraform自体にもロック機構はありますが、これはTerraformが並列実行されるのを避けるためにtfstateのロックを取るものです。よって、複数人が同時並行でPRを作成している場合、terraform plan
やterraform apply
のタイミングが異なれば、他のPRによる変更に気付かず、意図せずその変更を打ち消してしまう可能性があります。
Atlantisを使うと「他のPRがロックを持っているのでterraform plan
の自動実行ができなかったよ〜」とコメントで教えてくれるので気づくことができます。
terraform apply
コメントによるAtlantisではPRのコメントベースでterraformのCLI操作します。
実際にTerraformを触ったことがある方ならわかると思いますが、AWSのリソース作成などでterraform apply
が一発で決まることってどのくらいあるでしょうか?
リソース名に使える文字種の制限
、文字数制限
などに引っかかり、terraform apply
に失敗することも多いのではないでしょうか?
GitHubActionsなどで自動化するとPRのマージトリガーでterraform apply
していることも多いと思います。その場合、terraform apply
に失敗したら修正PRを出す必要がありました。
Atlantisを使うことで単一のPR上で試行錯誤しながら、上述のロック機構もあることで安全に何度もterraform apply
することが可能になります。
インフラリソースの操作権限をCIサービスに渡さずに済む
GitHubActionsなどを使って、AWSなどのインフラリソースをTerraformで作成する場合、比較的強めの権限を持ったIAMクレデンシャルをCIサービスに渡すことになるかと思います。
最小権限にするにしても、事前にどのAWSサービスを作成するかすべてを網羅することは難しいです。また、たとえそれができたとしても、新しいサービスを利用することになるたびに権限の調整をしていくことも手間です。
ということで比較的ガバっと強めの権限(IAM作れたり)を渡しがちです。
AtlantisのインフラをAWS内に作れば、IAMロールを使って権限を渡すことができます。こうすると、IAMクレデンシャルがAWS内でしか使われないのでCIサービスに渡した場合と比較しても安心です。[3]
使い方
基本的には構築したらもうそのまま使えますが、リポジトリにatlantis.yaml
という設定ファイルを置くことで挙動を変更することも可能です。
以下で、いくつか便利な使い方を紹介します。
1つのレポジトリに何個もtfstateがあるとき
以下のようにプロジェクトを分けることで、それぞれ別個にAtlantisを利用することができます。
version: 3
projects:
- name: ProjectA
dir: terraform/ProjectA
- name: ProjectB
dir: platform/ProjectB
terraform plan
してほしい
moduleに変更があったときも自動で1つのレポジトリの中にmoduleディレクトリを用意するケースもあると思います。
├── module
│ └── alb
│ └── main.tf
├── projectA
│ └── main.tf
└── projectB
└── main.tf
そういった場合はwhen_modified
に相対パスで以下のように指定することでmoduleディレクトリ配下に変更があったときにも自動プランが実行されるようになります。
version: 3
projects:
- name: ProjectA
dir: terraform/ProjectA
autoplan:
when_modified:
[
"*.tf",
"*.tfvars",
"../modules/*/*.tf",
]
enabled: true
- name: ProjectB
dir: platform/ProjectB
autoplan:
when_modified:
[
"*.tf",
"*.tfvars",
"../modules/*/*.tf",
]
enabled: true
terraform apply
完了したらマージもよろしく
先程のに足すとこんな感じですね〜
version: 3
automerge: true
projects:
- name: ProjectA
dir: terraform/ProjectA
autoplan:
when_modified:
[
"*.tf",
"*.tfvars",
"../modules/*/*.tf",
]
enabled: true
- name: ProjectB
dir: platform/ProjectB
autoplan:
when_modified:
[
"*.tf",
"*.tfvars",
"../modules/*/*.tf",
]
enabled: true
まとめ
日本語記事はあんまりなくて日本だとあんまり流行って無さそうで悲しいです。
この記事が普及の一助になれば幸いです🙌
Hamee Advent Calendar 2021、13日目の明日はyamakonaさんの「「ふりかえりガイドブック」から得たいつかやりたいふりかえり手法」です!
-
https://www.runatlantis.io/docs/access-credentials.html#github-app ↩︎
-
Atlantisのメリットとなる部分は、頑張れば自前で作ることもできるとは思いますが、多分大変です。 ↩︎
-
最近はOIDCを使ったセキュアに権限を渡す仕組みもあるので、GitHubActionsに関しては以前よりも安全に権限を渡せるようにはなってきています。
https://github.blog/changelog/2021-10-27-github-actions-secure-cloud-deployments-with-openid-connect/ ↩︎
Discussion