🕌

Terraformのstateがs3に置かれるようになっているかをチェックする

2025/02/17に公開

backend configがs3に設定されているかをチェックしたい

みなさんは、作られたリソースを変更しようとしたら、stateがs3上になかったといった経験をしたことがあるでしょうか。私は現在新卒2年目ですが、すでに数回経験しています。

前提

以下を想定しています。

  • 複数人がTerraformを使って開発する
  • 開発者が手動でterraform planterraform applyをする

どうやって起こるのか

Terraformではstateをどこで管理するか設定することができます。https://developer.hashicorp.com/terraform/language/backend

デフォルトはlocalです。
そのため、何も設定されていない状態でterraform applyすると、リソースが作成され、stateはapplyした人のローカルに保存されます。

その後、違う人がterraform planを実行してみると、定義されたリソースを全て作成しようとするdiffが出てしまいます。

これを防ぐには以下のような記述が必要です。

terraform {
  backend "s3" {
    bucket = "" 
    key    = ""
    region = ""
    profile= ""
  }
}

backend configをチェックする

shell scriptでやります。
terraformコマンドにbackend configに関しての情報が得られるものがあれば良かったのですが、ありませんでした。
以下のissueで議論されていますが、すぐには実装されなそうです。
https://github.com/hashicorp/terraform/issues/19016

ローカルの.terraform以下に作られるterraform.tfstateファイルを使ってチェックしています。
https://developer.hashicorp.com/terraform/cli/init#working-directory-contents

#!/bin/bash

set -eux

if [ "$#" -ne 1 ]; then
    echo "directoryを指定してください"
    exit 1
fi

scope=$1
tfstate_file=$scope/.terraform/terraform.tfstate

if [ ! -f "$tfstate_file" ]; then
    echo "terraform.tfstateがありません。backend configが 's3' に設定されていません。"
    exit 1
fi

backend_config_type=$(jq -r '.backend.type' "$tfstate_file")

if [ "$backend_config_type" != "s3" ]; then
    echo "backend configがs3に設定されていません。"
    exit 1
fi

これをCIで実行してstateごとにチェックしています。

補足 tfstateファイルが作成されるタイミング

Terraformの公式ドキュメントを確認したところtfstateファイルが作成されるタイミングについては言及されていませんでした。
以下は自分の環境で実行してみて試した結果になります。

ローカルの場合

apply後に作られます

s3の場合

init後に作られます

Discussion