tfstateを環境変数で書くときはterragruntが使える
S3バケット名のsuffixについて で述べたように、S3バケット名に -<account-id>-<region> を付与することが多い。しかし、公開リポジトリでTerraformのS3 backendの設定を書くときに少し困ったことが起きる
- AWSのアカウントIDはできればハードコードしたくない
- 別に秘密の情報ではないので公開してもいいのだけど、何となく
- TerraformのS3 backendのS3バケット名は環境変数指定が使えず、隠したい場合は
-backend-configで指定する
解決策は -backend-config なのだけれど、CIとかを考えるとできれば環境変数の方が扱いやすい。
そこで、terragruntを使うという方法がある。State Backend | Terragruntにあるように、hclファイルからterraformのS3 backendブロックを生成するので、環境変数を使うことができる。
モチベーションの項目にも、backendでvariablesとかが使えないので、DRYにするのが難しい、ということが書いてある。
Unfortunately, the backend configuration does not currently support expressions, variables, or functions.
多分想定ユースケースはtfstateが大量にあるリポジトリなのだけど、S3のバケット名をTerraformに環境変数で渡したい時はterragruntを使えるという話。
ちなみにterragruntはmiseで以下のように入る。
mise use terragrunt@latest --pin
設定は例えば以下のようになる
remote_state {
backend = "s3"
config = {
bucket = get_env("TFSTATE_BUCKET")
key = "path/to/terraform.tfstate"
region = "ap-northeast-1"
use_lockfile = true
encrypt = true
}
}