👏

(DynamoDB不要) S3のみのTerraformリモートバックエンド(v1.10.0追加 S3 ステートロック機能)試してみた

2024/12/18に公開

こんにちは!ばーやんです!
Terraform v1.10.0でリリース(2024/11/27)されたS3を用いたステートファイルのロック機能を試してみました!

従来機能 DynamoDBを使ったステートロック

AWSでリモートバックエンドを使う場合、
ステートロック機能を有効にするにはDynamoDBが必要でした。

backend.tf
terraform {
  backend "s3" {
    bucket         = "terraform-state-bucket"
    key            = "test/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-lock-table" #ここでDynamoDBテーブルを指定
  }
}

従来機能の課題

リモートバックエンドの設定にS3とDynamoDBを作成する必要があり、少々面倒でした

新機能 S3を用いたステートロック

以下公式ドキュメントです。
https://developer.hashicorp.com/terraform/language/backend/s3

dynamodb_table = "my-terraform-lock-table"と書いていたところを
use_lockfile = trueにするだけでよさそうです。

実際にやってみた

0. Terraform v1.10.xをインストール

https://developer.hashicorp.com/terraform/install

1. S3バケットを作成

2. Terraformバックエンドの設定を記述

main.tfに以下記述

backend.tf
terraform {
  backend "s3" {
    bucket        = "handson-remote-backend-baayan"
    key           = "test/terraform.tfstate"
    region        = "ap-northeast-1"
-    dynamodb_table = "terraform-lock-table" # DynamoDBテーブルの指定を削除
+    use_lockfile  = true # use_lockfileを = true 追加
  }
}

3. 認証情報の設定を行い、terraform init

日本語訳 with GPT o1
PS C:\Terraform\terraform> terraform init
バックエンドを初期化しています...
"S3" バックエンドの設定に成功しました! このバックエンド構成が変更されない限り、
Terraformは自動的にこのバックエンドを使用します。
プロバイダープラグインを初期化しています...
Terraformの初期化が正常に完了しました!
これでTerraformを使い始めることができます。変更点を確認するには、"terraform plan" を実行して、インフラに必要な変更を確認してみてください。Terraformの全てのコマンドが正常に動作します。
もし、モジュールやバックエンドの設定を変更した場合には、このコマンドを再度実行して
作業ディレクトリを再初期化してください。もし忘れた場合、他のコマンドがその変更を検知し、
必要であれば再初期化を促すメッセージが表示されます。

特にステートロックについての言及はないけどS3で設定できたみたい

続いてVPCを作成してステートロック用ファイルがどのようにできるかみてみる

4. VPCの作成

main.tfに以下追記

main.tf
provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_vpc" "remote_state_test_vpc" {
  cidr_block           = "10.0.0.0/24"
  enable_dns_hostnames = false
  enable_dns_support   = true

  tags = {
    Name = "handson-vpc"
  }
}

5.ステートロックファイルの確認

プロバイダ追加したのでterraform init
そしてapply (良い子はplanをしよう)

apply前の確認まで完了、
もしS3でのステートロックが効いていればいればこの時点でtfstateファイルのステートロック用ファイルができているはず・・・S3バケットを確認してみる


できている!素敵!

続いてapplyを完了しステートロック用ファイルがどのようになるか見てみる(おそらく消えるはず)


消えている。初回のapplyなので代わりにtfstateファイルができている。

確かにS3だけでステートロックができていそうである。

6. ロックが効いているか確認

上記の状態で別窓を開き terraform apply を実行してみる

エラーとなった、しっかりロックが効いている!

まとめ

Terraform v1.10.xで追加された新機能 S3でのステートロック機能を試してみました。
use_lockfile = true
だけでDynamoDB不要でステートロックできるのは簡単で嬉しいですね!

なおまだ実験的な機能のようで近いバージョンで使い方が変わる可能性があるのでその点は注意が必要そうです!

以上ばーやんでした!

Discussion