Zenn
🍇

Terraform v1.11.0のS3 Native State Lockingについて

2025/03/05に公開

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"
      ]
    }
  ]
}

Discussion

ログインするとコメントできます