AI エージェントに AWS 権限を渡すとき: aws-vault exec は途中で期限切れ、deny では止めきれない
Claude Code などのエージェントを長時間動かすなら、認証情報は SDK が自分で更新できる形(aws login のキャッシュ)で渡し、危ない操作は文字列の拒否リストではなく IAM ロールの権限で止める。
1. aws-vault exec で起動すると途中で切れる
aws-vault exec <profile> -- claude のように起動すると、一時的な認証情報が 起動した瞬間の環境変数(AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN)としてプロセスに渡る。セッションの期限が来ても環境変数は書き換わらないので、長いセッションの途中から AWS 呼び出しが ExpiredToken で失敗し始める。
AWS CLI の aws login で取ったものは ~/.aws/ 配下のキャッシュに置かれ、SDK が期限前に読み直して更新する。エージェント側は環境変数を持たず、プロファイル名だけ指定すればよい。
aws login --profile dev # ブラウザでサインイン、~/.aws/ にキャッシュ
AWS_PROFILE=dev claude # SDK / CLI がキャッシュから更新しながら使うコンテナの中でエージェントを動かす場合は、~/.aws/ を 読み取り専用 でマウントして共有する構成が紹介されている(例: -v ~/.aws:/home/agent/.aws:ro)。
2. deny に terraform destroy を書いても止まらないことがある
terraform destroy をClaude Code の権限設定の deny はコマンドを文字列で照合するため、オプションの位置や書き方が少し違う(terraform -chdir=infra destroy、terraform apply -destroy など)と拒否に当たらない。
確実に止めたいなら、エージェントが使う IAM ロールに 削除系の権限をそもそも付けない。例えば検証用ロールには Describe* / Get* / List* と作成系だけを許可し、Delete* や Terminate* は付けないか、明示的な Deny で落とす(明示 Deny が最優先になる理由は AWS IAM: 評価は「明示 Deny → 明示 Allow → 暗黙 Deny」 を参照)。deny リストは「うっかり」を減らす補助として残す。
注意点
- 読み取り専用マウントでも、コンテナ内からはキャッシュの認証情報を読める。渡すプロファイル自体を権限を絞ったロールにしておく。
- 組織で使うならアカウント単位の SCP で削除系をガードする手もある。
関連
- AI エージェント時代のシークレット受け渡し: 4 段階の考え方と道具
- AWS 設計の定石メモ: 人は Identity Center・システムは IAM ロール/VPC エンドポイント/Route 53 Resolver
出典
- @dkfj · 2026-10-31 (
aws-vault execとaws login、~/.aws/読み取り専用共有) - @dkfj · 2026-10-31 (
denyの文字列照合と IAM ロール側での制限) - 2 件とも書籍『生成AI時代のクレデンシャルとパーミッション設計』の紹介投稿。コマンド例とマウント例は筆者の補足。