1. はじめに
TerraformでS3バックエンドを利用してterraform.tfstateを管理する際、これまではDynamoDBを併用してロックを行う構成がよく採用されていました。
DynamoDBテーブルを作成し、そこにロック情報を保存することで、複数のユーザーやCI/CDパイプラインが同時にstateを更新する競合を防ぐ仕組みです。
先日、会社のメンバーから
「DynamoDB使わなくてもstate管理できるよ。」
と教えてもらい、調べてみたところ、
Terraform v1.11.0のリリースにより、DynamoDBを利用したロックは非推奨(deprecated) とされ、S3自体の機能を利用したネイティブなstate lockが正式にサポートされていたようです。
公式のリリース情報を中心に背景情報などを整理してみました。
誰かの参考に慣れば嬉しいです。
2. S3のtfstate管理のネイティブサポートについて
従来、backend "s3" を利用する際には、S3 バケットで状態ファイルを管理しつつ、並行実行による競合を防ぐために DynamoDB を利用してロックを行うのが一般的でした。
Terraform v1.11 では、S3 バックエンド自体がロック機能を持つようになり、追加の DynamoDB リソースを用意せずにロック管理が可能となりました。
- 公式リリースノート: Terraform v1.11.0
3. 背景と実装の仕組み
この仕組みは、S3の 条件付き書き込み(conditional writes) を活用して実現されているそうです。
Terraformは操作開始時に.tflockファイルをS3に作成し、同一ファイルがすでに存在する場合は書き込みを拒否します。操作完了後に.tflockファイルを削除することでロックが解除されます。
4. GAまでの流れと今後の見通し
この変更は v1.10 系で実験的機能として導入され、その後 v1.11 で General Availability (GA) となりました。
Terraform 公式ドキュメントによると、今後は DynamoDB を利用したロックは非推奨となり、use_lockfile オプションを利用することが推奨されています。
ドキュメント内では DynamoDB を利用したロックが Deprecated と明記されており、将来的に削除される可能性も示唆されています。
5. 設定例
以下に、S3 バックエンドでの設定例を示します。DynamoDB テーブルを指定する必要がなくなり、代わりに use_lockfile = true を指定するだけでロックが有効になります。
terraform {
backend "s3" {
bucket = "your-bucket"
key = "terraform.tfstate"
region = "ap-northeast-1"
use_lockfile = true
}
}
6. まとめ
- Terraform v1.11 で S3 バックエンドにネイティブロックが追加された。
- DynamoDB を利用したロックは非推奨となり、
use_lockfileの利用が推奨されている。 - 公式ドキュメント上で非推奨が明記されており、将来的に DynamoDB サポートが削除される可能性がある。
今後は新規構成では DynamoDB を利用せず、use_lockfile を前提として設計していきましょう!
参考記事
- Terraform 公式ドキュメント
- v1.11.0リリースノート
- 参考にさせていただいた記事