Terraform で AWS SSO で認証できない問題 (2023/01)
Terraform Provider 側の問題 のようなので、そのうち対応されて解決されると思われますが、メモとして残しておきます。
2023/3/8 追記
2/10 にリリースされた v4.54.0 で修正されたようです。
ただ、まだ完璧には治っておらず、S3 を Remote State Backend に使う際は上手く動かないとのこと (これは Provider というより Terraform の問題ですね)
前提
AWS SSO (IAM Identity Center) で認証されたユーザを使って (そこからさらに Switch Role して、) AWS を設定しているような環境を想定しています。
問題
久しぶりに Terraform で AWS の設定を変えようと思って、
aws sso configure していざ terraform plan してみたら次のようなエラーがでてうまく Terraform が実行できなくなっていました。
╷
│ Error: configuring Terraform AWS Provider: loading configuration: profile "example" is configured to use SSO but is missing required configuration: sso_region, sso_start_url
│
│ with provider["registry.terraform.io/hashicorp/aws"],
│ on main.tf line 20, in provider "aws":
│ 20: provider "aws" {
│
╵
エラーメッセージから Profile 内に sso_start_url と sso_region の追加が必要なのかなと思って sso-session 句から転記しましたが、エラーメッセージが変わっただけで相変わらず Terraform が実行できませんでした。
╷
│ Error: configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.
│
│ Please see https://registry.terraform.io/providers/hashicorp/aws
│ for more information about providing credentials.
│
│ Error: failed to refresh cached credentials, the SSO session has expired or is invalid: open /home/example/.aws/sso/cache/<hash>.json: no such file or directory
│
│
│ with provider["registry.terraform.io/hashicorp/aws"],
│ on main.tf line 20, in provider "aws":
│ 20: provider "aws" {
│
╵
解決方法
sso-session を使わないような Profile を $HOME/.aws/config に追記し、それを使うように設定を変更しました。
具体的には次のような Profile を作っています。
[profile example/tf]
sso_account_id = 123456789012
sso_role_name = admin
sso_start_url = https://example.awsapps.com/start
sso_region = us-east-1
私の場合は環境変数 AWS_PROFILE を使っているので、この状態で
export AWS_PROFILE="example/tf"
を実行した状態で一旦 aws sso login を実施して、 Terraform 用 Profile のための認証すれば terraform plan が通るようになりました。
解決までにやったことなど
以前いじった10月下旬ごろには問題が起きてなかった記憶がおぼろげにあったので、
ひたすらエラーメッセージでググって、新しめの記事を見つけては、認証設定周りが怪しそう?となっていました。そこからもしやこの sso-session の設定が悪さをしているのでは?
となんとなく思い、試しに別 Profile を作って試してみたらうまく行った感じです。
その段階で改めて、 AWS CLI の CHANGELOG を眺めてみると、 2.9.0 で確かに
- enhancement:
sso login: Add--sso-sessionargument to enable direct SSO login with asso-session
と機能追加されたような記載があり、リリースタイミング的にもドンピシャだなと思った次第です。
ここまで調べておいて、 Provider の Issue 見ると普通に書いてありましたね...
とりあえずまずは Issue を眺めようね。はい。
Discussion
同じ問題で詰まっていたのですが、この記事のおかげで調べる時間が節約できました、ありがとうございます!