Docker環境でAWS SSOを使う:ホストの認証情報をコンテナに引き継ぐ方法
ローカル開発中に FastAPI や Node.js アプリを Docker 上で動かしていると、
AWS SDK(boto3 など)から S3 にアクセスした際に次のようなエラーが出ることがあります。
botocore.exceptions.NoCredentialsError: Unable to locate credentials
これは、コンテナの中に AWS の認証情報が届いていないためです。
この記事では、ホストで aws sso login 済みの情報をコンテナでも共有して使う方法を紹介します。
🧩 背景:AWS CLI の認証情報の仕組み
AWS CLI / SDK は以下の順で認証情報を探します:
- 環境変数(
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_SESSION_TOKEN) - コンテナロール(ECS/EKS)
~/.aws/credentials-
~/.aws/sso/cache/や~/.aws/cli/cache/(SSOやSTSのトークン)
SSO でログインした場合、セッション情報はホスト上の ~/.aws/sso/cache/ に保存されるため、
このディレクトリを コンテナにマウント することで再利用できます。
🗂️ SSOログイン情報の格納場所
| ディレクトリ | 用途 | 永続性 |
|---|---|---|
~/.aws/credentials |
アクセスキー認証(静的) | 永続 |
~/.aws/config |
プロファイル・SSO設定 | 永続 |
~/.aws/sso/cache/ |
aws sso login の一時トークン |
一時(数時間) |
~/.aws/cli/cache/ |
STS一時クレデンシャル | 一時(数時間) |
🐳 docker-compose.yml の設定例
services:
app:
build: .
volumes:
- ~/.aws:/root/.aws:ro # ホストのAWS設定を読み取り専用でマウント
environment:
- AWS_PROFILE=default # 使用するプロファイル名を指定
command: uvicorn main:app --host 0.0.0.0 --port 8000
ポイント:
-
:roは “read-only” の意味で、安全にマウントできます。 -
AWS_PROFILEは~/.aws/configに定義されたプロファイル名と合わせてください。
✅ 動作確認
1. ホスト側でログイン
aws sso login
aws sts get-caller-identity
2. コンテナ内で同じ確認
docker exec -it app bash
aws sts get-caller-identity
→ 同じアカウント情報が表示されればOK!
⚠️ 注意点
- SSOトークンの有効期限は数時間。期限切れ時は再ログインが必要です。
- 読み取り専用(
:ro)でマウントすることで、誤操作による上書きを防止。 - CI/CDや本番環境ではこの方法は避け、IAMロール(ECS/EKSロールなど)を使用してください。
🧠 なぜこれで動くのか
AWS SDK は OS のホームディレクトリ(~/.aws/)を自動的に参照します。
Dockerコンテナ内では通常 /root/ がホームディレクトリなので、
~/.aws → /root/.aws とマウントしておけば、CLI も boto3 も自然に認識します。