AWS SSO の config を sso-session 形式に寄せる手順と Terraform の対応バージョン
参考: Session duration considerations for using identity sources, the AWS CLI, and AWS SDKs / hashicorp/terraform-provider-aws#28263
変換内容
各プロファイルの sso_start_url と sso_region を sso_session の 1 行に置き換え、[sso-session] セクションを足す。
[profile app-staging-readonly]
-sso_start_url = https://<id>.awsapps.com/start
-sso_region = us-east-1
+sso_session = my-sso
sso_account_id = <account-id>
sso_role_name = ReadOnlyAccess
region = ap-northeast-1
output = json
+
+[sso-session my-sso]
+sso_start_url = https://<id>.awsapps.com/start
+sso_region = us-east-1
+sso_registration_scopes = sso:account:accessregion と output は各プロファイルに残す。 [sso-session] に置けるのは SSO のキーだけで、プロファイルは [default] の値を引き継がない。
旧形式との違い
表1: 旧形式と sso-session 形式の違い
| 項目 | 旧形式 | sso-session 形式 |
|---|---|---|
sso_start_url / sso_region の置き場所 | プロファイルごと | [sso-session] セクションの 1 箇所 |
| トークンキャッシュのキー | start URL | セッション名 |
| アクセストークンの期限 | ログイン時に決まり、延びない | 1 時間。refresh token で自動更新される |
| 再ログインが要る間隔 | Identity Center のセッション時間 | Identity Center のセッション時間 |
| ログインのコマンド | aws sso login --profile <任意のプロファイル> | aws sso login --sso-session <セッション名> |
AWS CLI v2 は 2.9 以降が対応している。 これまで 8 時間ほどで再ログインを求められていて、寄せた後もこの間隔は Identity Center のセッション時間で決まる(設定値そのものは見ていない)。
Terraform 本体の対応状況
backend "s3" {} だけを書いた空のディレクトリで、存在しないバケットを指定して terraform init を流した結果。
表2: Terraform 本体のバージョン別の init 結果
| Terraform | 旧形式 | sso-session 形式 |
|---|---|---|
| 1.0.11 | 認証を通過(バケットが無いエラー) | is configured to use SSO but is missing required configuration |
| 1.4.6 | 認証を通過 | is configured to use SSO but is missing required configuration |
| 1.7.5 | 認証を通過 | 認証を通過 |
| 1.8.1 | 認証を通過 | 認証を通過 |
1.5 系と 1.6 系は試していない。 1.7.5 と 1.8.1 は、aws sso login --sso-session でログインするまで refresh cached SSO token failed になる。
使っている Terraform のバージョンを確かめる
state ファイルの terraform_version には最後に書き込んだ Terraform 本体のバージョンが残るが、state には秘密の値が入ることもあるので、そのキーだけを抜き出す。
AWS_PROFILE=app-production-readonly \
aws s3 cp s3://<state-bucket>/terraform.tfstate - | jq -r '.terraform_version'ローカルの .terraform/terraform.tfstate は backend の設定だけのファイルで、terraform_version は入っていない。
config を差し替えて確認する
AWS_CONFIG_FILE を指定すると、AWS CLI も Terraform もその config を読む。 本物の ~/.aws/config を書き換える前に、変換後の config で確認した。
export AWS_CONFIG_FILE=/path/to/config.sso
# sso-session 用のトークンを取る(旧形式のトークンは消えない)
aws sso login --sso-session my-sso
# 各プロファイルで認証が通るか
AWS_PROFILE=app-staging-readonly aws sts get-caller-identity
# provider 側の認証が通るか(読み取り専用の plan)
AWS_PROFILE=app-staging-readonly terraform plan -lock=falseキャッシュのキーが別なので、旧形式でログインしたままで確認できる。 ログアウトは要らない。