AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

Terraform の backend を S3 にする

ロケ地

  • Terraform 1.3.6
  • hashicorp/aws 4.45.0

Error loading state

state がローカルやんけ! と気づいて、 backend "s3" を書いて、リモートに手動でバケットを作成 (設定は名前以外、全部変更なしのアクセスきつきつでオッケー)。

後に terraform init -migrate-state したら Error loading state が無限に出るようになってしまった。

Initializing the backend...
Backend configuration changed!

Terraform has detected that the configuration specified for the backend
has changed. Terraform will now check for existing state in the backends.

╷
│ Error: Error loading state:
│     AccessDenied: Access Denied
│     status code: 403, request id: XXXXXXXXXXXXXXXX, host id: なんかなげーの
│
│ Terraform failed to load the default state from the "s3" backend.
│ State migration cannot occur unless the state can be loaded. Backend
│ modification and state migration has been aborted. The state in both the
│ source and the destination remain unmodified. Please resolve the
│ above error and try again.

結局何をやっても解決しないし、本番運用しているわけでもないので、 rm -rf .terraform* してローカルを綺麗にしてしまった。

これで再度 terraform init して、 S3 に state を設置できるようになった。

shared_credentials_file

これは単純な疑問なんだけど、 provider backendprofile~/.aws/credentials で指定したプロファイル名を書くだけだと動作しなくて、[default] を見ちゃうのはバグなんすかね……?

それぞれセットで shared_credentials_file = ~/.aws/credentials を書かないと、指定したプロファイル (とクレデンシャル) を参照してくれなくてハマってしまった。

で、shared_credentials_file を使うと以下の Warning が出る。

│ Warning: Attribute Deprecated
│
│   with provider["registry.terraform.io/hashicorp/aws"],
│   on providers.tf line 4, in provider "aws":
│    4:   shared_credentials_file = "~/.aws/credentials"
│
│ Use shared_credentials_files instead.
│
│ (and one more similar warning elsewhere)

動作はするので無視すればいいんだけど、v4 系は本来 shared_credentials_files らしい。 けど、そちらを指定するとエラーで死ぬ。

│ Error: Incorrect attribute value type
│
│   on providers.tf line 4, in provider "aws":
│    4:   shared_credentials_files = "~/.aws/credentials"
│
│ Inappropriate value for attribute "shared_credentials_files": list of string required.

期待した動作とちゃうやんけ! と言ってる外人兄貴もいるんだけど、その後クローズされてるしなん、なんだろうこれ。

github.com