@shinyaz

AWS SSO の認証情報は Docker コンテナに直接渡せない

AWS SSO(IAM Identity Center)で認証している環境で Docker コンテナに ~/.aws をマウントしたら、SSO トークンの解決に失敗した。

Terminal (NG)
docker run -v "$HOME/.aws:/root/.aws:ro" my-image:latest
# Error when retrieving token from sso: Token has expired and refresh failed

SSO のトークンキャッシュはホスト側のプロセスに依存しているため、コンテナ内からは解決できない。boto3 から一時認証情報を取得して環境変数で渡す方法が確実だ。

Terminal (OK)
CREDS=$(python3 -c "
import json, boto3
creds = boto3.Session().get_credentials().get_frozen_credentials()
print(json.dumps({'AK': creds.access_key, 'SK': creds.secret_key, 'ST': creds.token}))
")
 
docker run -p 8080:8080 \
  -e AWS_ACCESS_KEY_ID=$(echo $CREDS | python3 -c "import sys,json; print(json.load(sys.stdin)['AK'])") \
  -e AWS_SECRET_ACCESS_KEY=$(echo $CREDS | python3 -c "import sys,json; print(json.load(sys.stdin)['SK'])") \
  -e AWS_SESSION_TOKEN=$(echo $CREDS | python3 -c "import sys,json; print(json.load(sys.stdin)['ST'])") \
  my-image:latest

本番では ECS タスクロールや EC2 インスタンスプロファイルを使えば認証情報の管理は不要になる。デプロイ編 第 1 回で詳しく扱っている。

共有する

田原 慎也

田原 慎也

ソリューションアーキテクト @ AWS

AWS ソリューションアーキテクトとして金融業界のお客様を中心に技術支援をしており、クラウドアーキテクチャや AI/ML に関する学びをこのサイトで発信しています。このサイトの内容は個人の見解であり、所属企業の公式な意見や見解を代表するものではありません。