🕌
Terraformのstateがs3に置かれるようになっているかをチェックする
backend configがs3に設定されているかをチェックしたい
みなさんは、作られたリソースを変更しようとしたら、stateがs3上になかったといった経験をしたことがあるでしょうか。私は現在新卒2年目ですが、すでに数回経験しています。
前提
以下を想定しています。
- 複数人がTerraformを使って開発する
- 開発者が手動で
terraform plan
やterraform 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で議論されていますが、すぐには実装されなそうです。
ローカルの.terraform
以下に作られるterraform.tfstate
ファイルを使ってチェックしています。
#!/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