Atlantisのロック機能に入門する
はじめに
こんにちは。コンサルティング部の津谷です。前回Atlantisの基盤をECS Fargateで作成しました。作って終わりはもったいないので機能を少しずつ試してみようと思います。
Atlantisの基本的な機能は以前ブログにしてますのでそちらをご参照ください。
今回はAtlantisのロック機能を試してみます。atlantis.ymlの設定は以下の通りです。
version: 3
projects:
- name: vpc-project
dir: .
workspace: default
terraform_version: v1.6.0
autoplan:
when_modified:
- "*.tf"
- "*.tfvars"
enabled: true
ロックは、基本的に設定ファイルで指定した「ディレクトリ」「ワークスペース」単位で機能します。
ディレクトリはルート、ワークスペースもデフォルトで設定していますので、その場合のケース別でロック機能の可否について整理しました。環境、機能ごとにディレクトリ・ワークスペースを分ける場合のロック機能可否については別の機会に試します。
| 状況 | 結果 |
|---|---|
| PR#1でplan → 同じPR#1でapply | ロックはかからない |
| PR#1でplan中 → PR#2が同じくplan | ロックがかかる |
| PR#1でplanのまま放置 → PR#2がplan | ロックがかかる |
| PR#1でapply済み・未マージ → PR#2がplan | ロックがかかる |
| PR#1がマージ完了 → PR#2がplan | ロックはかからない |
| atlantis unlock実行 → PR#2がplan | ロックはかからない |
tfstateのバックエンドロック機能との棲み分け
tfstateをS3等で管理している場合は、ロック機能で守れるからいいのでは?と思うものですが排他制御における管理レイヤーが違うと考えると理解しやすいです。
以下の表で管理レイヤーについてまとめてみます。
| 項目 | Atlantisロック機能 | tfstateロック機能 |
|---|---|---|
| 目的 | 同じディレクトリ・ワークスペースでの作業競合を防ぐ | Terraform構成状態の同時編集(競合)を防ぐ |
| スコープ | atlantisコマンドでunlockするか、PR内でマージが完了するまで | terraform plan/applyの実行時 |
| 保護対象 | plan/apply時の作業整合性 | tfstateファイルの整合性 |
上記のように、Github上でのPRの論理競合はtfstateロックでは防げません。管理レイヤーが異なるため開発者体験を改善するためのロック機能がAtlantisのロック機能、Terraformリソースそのものの構成を制御するのがtfstateのロック機能と意識することにします。
terraform applyを試す
環境準備については以下のブログをご参照ください。
Atlantisの初期セットアップができている前提で検証を進めます。
Github上にローカルで記載したコードをpushすると、以下のように自動でプルリクエスト上でコメントとしてterraform plan結果を返してくれます。今回は簡単にVPCを1つ作成しています。

AtlantisのWebUIでステータスを確認してみます。

Jobsを確認するとStepはplanになっており、Locksを確認するとリポジトリ上のプルリクエスト上でロック操作が掛かっていることがわかります。

plan結果が問題ないということがわかりましたので、applyをしてみようと思います。
applyに関してもatlantisコマンドで実行することができ、チームメンバーがapply結果を確認することができます。atlantis applyをコメント上で実行すると、正常にVPCが作られました。

コンソール上でも正常に立ち上がっていますね。


WebUIを確認すると、Stepにapplyが追加されていますね。ステータスに関してはまだLock中です。
Atlantisのロック機能を検証する
ロック機能について、試していきます。先ほど作ったVPCのCIDRを変更してみます。ローカルでコードを記載して新規でプルリクエストを作成してみます。

そうすると、以下のエラーが出力されました。

planに失敗していますね。これは、プルリクエスト内でマージが完了していない処理があるためです。同じディレクトリ・ワークスペース上で処理をかけたためロックが掛かっている状態になります。
プルリクエスト内でplanを実行するには、処理中のタスクをunlockする必要があります。ここでの処理中のタスクとは、先ほどのVPC作成処理です。ステータスでも確認しましたがapply後もステータスはlockの状態です。ロックを解除するには、プルリクエストをマージさせるか、プルリク内のコメントでatlantis unlockを実行する必要があります。
試しにプルリクエスト内のコメントでatlantis unlockを実行しました。

そうすると、planが正常に動きました。

WebUIで確認してみると、更新した内容が出力されています。Stepはplan状態と出力されていますね。

さいごに
Atlantisのロック機能に入門し、基本的な機能の確認と検証を行いました。皆さんもぜひ試してみてください。







