1. 導入:なぜStateロックが「絶対必須」なのか
インフラ構成をコードで管理するIaCにおいて、Terraformの「Stateファイル(terraform.tfstate)」は、リソースの現状を記録する唯一のソースです。もし、複数のエンジニアが同時にterraform applyを実行してしまったらどうなるでしょうか。Stateファイルが不整合を起こし、最悪の場合、本番環境のリソースが意図せず削除されたり、管理不能に陥ったりする深刻な障害につながります。この「破壊」を未然に防ぐのが、Stateロック機構です。プロの現場では、CI/CDパイプラインや複数人開発において必須の安全装置といえます。
2. 基礎知識:Stateロックの仕組み
TerraformのStateロックとは、あるユーザーがapply処理を行っている間、他のユーザーが同じStateファイルに対して操作できないように制御する仕組みです。
これを実現するために、リモートバックエンド(S3など)にStateファイルを保存する際、併せて「DynamoDB」を利用します。DynamoDBのテーブルを「排他ロック用のフラグ保管庫」として使うことで、誰かが操作を開始した瞬間にそのテーブルにレコードを書き込み、他の処理をブロックします。これにより、競合による破損を物理的に防ぐことが可能です。
3. 実装:S3 + DynamoDBによるリモートバックエンドの構成
以下の手順で、Terraformの設定にリモートバックエンドを組み込みます。
手順:
1. S3バケットを作成し、Stateファイルを保存する場所を確保します。
2. DynamoDBテーブルを作成し、パーティションキーとして「LockID」という名前の文字列型カラムを指定します。
3. terraform設定ファイル(backend.tf等)に、作成したS3バケットとDynamoDBテーブルの情報を記述します。
4. サンプルプログラム:backend.tf の設定例
以下のコードは、バックエンドをS3とDynamoDBで構成するための設定です。Terraformのルートディレクトリに配置してください。
terraform {
backend "s3" {
# Stateファイルを保存するS3バケット名
bucket = "my-terraform-state-bucket"
# Stateファイルのパス
key = "prod/terraform.tfstate"
# リージョン指定
region = "ap-northeast-1"
# DynamoDBによるロック用テーブル名
dynamodb_table = "terraform-lock-table"
# 暗号化の有効化
encrypt = true
}
}
5. 応用・注意点:現場での運用Tips
・DynamoDBのテーブル設定: DynamoDBのテーブル作成時、パーティションキーの名称は必ず「LockID」としてください。これ以外の名前ではTerraformがロックを正しく検知できません。
・ロックの強制解除: 何らかの理由で処理が異常終了し、ロックが残ったままになる場合があります。その際はterraform force-unlock [ロックID] コマンドを使用して、手動でロックを解除する必要があります。ただし、他者が本当に作業していないか必ず確認してから実行してください。
・CI/CDとの連携: GitHub ActionsなどのCIツールから実行する場合でも、このロック機構は非常に有効です。自動デプロイと手動実行が重なった場合でも、ロックによって手動側のapplyが弾かれるため、安全性が確保されます。
・権限管理: DynamoDBへの書き込み権限がないと、そもそもapplyが実行できません。IAMロールの設定で、対象テーブルへのPutItem/GetItem/DeleteItem権限を適切に付与しておきましょう。

コメント