こんにちは、cto室のldrです。 Terraform v1.11.0でGAとなった機能の1つであるS3 Native State Lockingついて書きたいと思います。
v1.11.0
S3 native state locking is now generally available. The use_lockfile argument enables users to adopt the S3-native mechanism for state locking. As part of this change, we've deprecated the DynamoDB-related arguments in favor of this new locking mechanism. While you can still use DynamoDB alongside S3-native state locking for migration purposes, we encourage migrating to the new state locking mechanism.
S3バックエンドによる状態管理
DynamoDB
Terraformは、stateをAmazonS3の特定のバケット内の特定のキーに保存します。このバックエンドは、状態ロック機能もサポートしており、今までは専用のDynamoDBテーブルを用いて、 ロックの取得、解放、タイムアウトなどをDynamoDBのレコードで制御していました。
terraform { backend "s3" { bucket = "mybucket" key = "path/to/my/key" region = "us-east-1" dynamodb_table = "state-locking" } }
S3 native state locking
S3バックエンドにおいて、状態ファイルと同じバケットにロック用のファイル(通常は拡張子 .tflock)を作成し、ロック状態を管理するようになりました。 設定としてはuse_lockfile引数をtrueに設定することで有効化できます。
use_lockfile - (Optional) Whether to use a lockfile for locking the state file. Defaults to false.
terraform { backend "s3" { bucket = "mybucket" key = "path/to/my/key" region = "us-east-1" use_lockfile = true } }
必要なIAM権限
S3バケットに対して必要な権限
- s3:ListBucket: バケット上で状態が保存されるパスをリストできる必要があります。
- s3:GetObject: 状態ファイルの読み書きが必要です。
- s3:PutObject: 状態ファイルの読み書きが必要です。
- s3:DeleteObjec: ロックファイルを利用する場合に必要です。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::mybucket", "Condition": { "StringEquals": { "s3:prefix": "mybucket/path/to/my/key" } } }, { "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject"], "Resource": [ "arn:aws:s3:::mybucket/path/to/my/key" ] }, { "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"], "Resource": [ "arn:aws:s3:::mybucket/path/to/my/key.tflock" ] } ] }