Atlantis で安全かつ効率的に Terraform の組織運用を実現する
この記事は、Magic Moment Advent Calendar 2024 8 日目の記事です。
こんにちは!
Magic Moment でソフトウェアエンジニアをやっている Miyake です。
私は普段バックエンドアプリケーション開発の傍ら、クラウドインフラの整備や DevOps の推進などを進めています。
今回その業務の一環として、Terraform を安全かつ効率的に運用できる Atlantis というツールを導入したので、その機能や運用についてご紹介したいと思います。
弊社のインフラ管理体制
弊社ではインフラとして Google Cloud をメインに利用しており、プロダクトのインフラリソースのほぼ全てを Terraform で管理しています。
Terraform に触れるメンバーは特に限定しているわけではなく、機能リリースの過程で必要に応じて誰でもインフラ構築にコミットできます。
Atlantis 導入前の課題
Atlantis を導入する以前は、以下のような運用で行っていました。
- Terraform 定義の修正 Pull Request を出す。
- ローカルで実行した plan 結果をコメントに貼る
- 修正コミットの度に plan 実行し貼り付ける
- レビュー受けを問題なければ main ブランチにマージする
- 「ローカルから apply」or「Cloud Build が走り apply」
このような運用体制において、以下のような課題がありました。
- terraform plan/apply の証跡を残す仕組みが取りづらい
- ローカルで plan/apply した結果を Pull Request にコメントする運用していたが、漏れることがあった。
- 変更差分が多いと転記が面倒。
- 全メンバーに強権限を付与する必要がある
- ローカルから terraform plan/apply する上で全メンバーに Google Cloud リソースの編集権限を与える必要があった
- main ブランチが正しい状態かの保証がなかった
- マージ後 apply が失敗することがあり、その場合修正 PR を出す必要がある。
- 修正している間、main ブランチが不正の状態になってしまい、その間に他の人の作業 PR がマージされてしまうと色々と大変。
- 複数人での作業が制御できない
- 同じ Terraform プロジェクト(ディレクトリ)を複数人で作業している場合に、互いに気づくことができない
このような課題を解決するために Atlantis を導入しました。
Atlantis とは
Atlantis とは、Terraform の効率的なワークフローを実現するためのツールです。
GitHub を始めとする VCS の Pull Request 上のコメントで terraform plan/apply コマンドを実行し、その結果を記録できます。
OSS ツールであり、Self Host して利用します(今年2024年に CNCF Sandbox Project として採用され、今後の発展にも期待できるツールです)。
Atlantis が先の課題をいかに解決できるか、主要機能の紹介とともに説明したいと思います。
Atlantis の機能・メリット
Pull Request 上で Terraform コマンドの実行と結果の記録ができる
Atlantis の基本的な機能として Pull Request のコメントにより、Terraform コマンドを実行します。
Pull Request 上で terraform plan
や terraform apply
といったコメントを打つと、GitHub Webhook で Atlantis にリクエストが飛び、Atlantis のマシン上でコマンドが実行されます。
※ -d
は apply を実行するディレクトリを指定する Atlantis のコマンドオプションです。
Atlantis がリクエストを受け付けると 👀 スタンプがつくのが分かりやすくて地味に気に入ってます。
そしてコマンド実行が完了すると、その結果を Atlantis がコメントで出力してくれます。
※ デフォルトでは atlantis plan
といった形で atlantis コマンドを実行するのですが、弊社ではオプション設定で terraform
というコマンド名で実行できるようにしています。
このベースとなる機能設計により、以下のメリットがありました。
- Terraform コマンドの実行履歴が自然と残る
- Terraform のローカルインストール・バージョン管理が不要
- Atlantis は各ディレクトリの Terraform のバージョンを自動検知し実行してくれます
- 権限管理を Atlantis の実行サービスアカウントに集約できる
- 各メンバーにリソースの変更に必要な強権限を付与必要がなくなります
承認からの適用のプロセスを仕組み化できる
Atlantis で apply 実行する際に、レビューで Approve をもらっていることを強制できます。
実際に Approve を貰う前に apply しようとするとエラーが出てキャンセルされます。
また設定により、「最新のコミットで Approve をもらっていること」や「main ブランチの内容が反映されていること」を強制できるため、Terraform に慣れていないメンバーがいる場合でも安心して運用ができます(※例えば、追加の修正コミットのレビュー・承認プロセスのすり抜けなどが防げます)。
ロック機能により複数人の同時作業でも安心
Atlantis は Terraform のロック機能とは別に、独自のロック機能を提供しています。
Terraform は実行中のプロセスに対してロックを取るのに対して、Atlantis は作業中の Pull Request に対してロックを取るため、複数人での同時利用によるコマンドの実行を防ぐことができます。
具体的には、ある Pull Request で plan を実行するとロックされ、他の Pull Request で plan コメントをした場合にエラーとなります。
ロックは Terraform ディレクトリ単位で取得されるため、tf ファイルの修正ディレクトリが別であれば並列で作業を進めることは可能です。
またロックは terraform unlock
コメントでアンロックできるので、もし優先して apply したい内容がある場合は、メンバー同士でコミュニケーションを取り、譲り合う形をとっています。
適用からマージのプロセスにより main ブランチが保護される
Atlantis 導入前は main ブランチにマージした後に CI/CD パイプラインで自動 apply していたため、失敗した場合の再実行コストが高かったり、不正な状態の tf 定義が main ブランチに反映されてしまうことに課題感がありました。
Atlantis では apply 後に Pull Request をマージするという機能上のプロセスがあるため、先のロック機能と合わせて正常な main ブランチの状態を維持できます。
更に紹介したい Atlantis の便利機能
Atlantis を導入するモチベーションとしては、先に説明した課題があったのですが、導入する中で見つけた便利な機能があるので、簡単に紹介したいと思います。
自動で差分があったディレクトリを判別してくれる
Terraform を運用する際に、環境ごとやリソースの種類ごとにディレクトリを分割することがあると思います。
Atlantis は plan コマンドを実行する際に、Pull Request にコミットされた差分のある作業ディレクトリを判別し、そのディレクトリ全てに対して自動で plan を実行してくれます。
これにより state ファイルの分割を目的としたディレクトリ分割に対しても抵抗なく踏み切れます。
ワークフローをカスタマイズできる
Atlantis で通常の plan/apply コマンドを上書きして、コンテキストに応じたワークフローのカスタマイズを実現できます。
例えば弊社では、機能の開発環境ごとに terraform workspace を切りクラウド環境の構築するのを自動化したりしています。
具体的には、機能の開発環境ごとのベースブランチに対して Pull Request が出された際に、ベースブランチを元に workspace を切って plan/apply を実行するといった具合です。
また、Atlantis はデフォルトではマルチクラウド対応はできないのですが、弊社ではワークフローのカスタマイズによって対応しています。
Atlantis のセットアップ
基本的には Installation Guide を参考にしていただくのが良いと思います。
一番面倒なのが Self Host 先ですが、弊社では GCE インスタンスにデプロイする Terraform Module(runatlantis/terraform-gce-atlantis)があったのでそれを利用しています(これのおかげで簡単にセットアップできました)。
とりあえず基本的な機能を試してみたいという方は Test Drive というローカルで実行できるアプリケーションがあるので、そちらをおすすめします。
Terraform Cloud との比較
Terraform の効率的な管理ツールとして他に Terraform Cloud が挙げられると思います。
筆者自体 Terraform Cloud は利用したことがないのですが、調査・比較する中で、以下の点から Atlantis を採用しました。
- Terraform の承認・適用・記録プロセスが Pull Request 上で完結するのが魅力的
- 運用に合わせてワークフローを柔軟にカスタマイズできる
- 低コストで始められ、スケールした際にコストメリットがある
- Atlantis のセットアップ・管理が結構楽だった(Terraform Module のおかげ)
最後に
気づけば Atlantis の宣伝みたいに少々長めの記事になってしまいました 😅
ただ実際に導入してみて、組織で Terraform を運用する上では欠かせないツールであると日々感じており、心からおすすめできるツールです。
本記事が Terraform の運用改善を考えている方の助けになれば幸いです。
次回のアドベントカレンダーは @morishin の 【後編】社内ラジオはいいぞ! - 社内ラジオを支える技術たち です。お楽しみに!
Discussion