投稿

AWS SSO の config を sso-session 形式に寄せる手順と Terraform の対応バージョン

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:access

region と 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

キャッシュのキーが別なので、旧形式でログインしたままで確認できる。 ログアウトは要らない。