如何在AWS Vault父配置文件子shell中切换子账户角色?
问题场景
你通过AWS Vault管理多账户权限,仅parent配置关联的账户有IAM用户(密钥存储在AWS Vault),child1、child2等子配置通过source_profile关联parent实现角色切换。当前每次操作子账户都要单独启动aws-vault exec childX子shell,操作繁琐;但尝试在parent的子shell中用aws s3 ls --profile child1时,会报错:
The source profile "parent" must have credentials.
错误原因
AWS Vault启动parent子shell时,是将临时凭证注入环境变量,而非写入~/.aws/credentials文件。默认情况下,AWS CLI读取子配置(如child1)时,会从credentials文件中查找source_profile的凭证,无法识别环境变量中的临时凭证,因此报错。
解决方案
方法1:修改AWS配置,让子Profile读取环境变量凭证
在每个子profile的配置中添加credential_source = Environment,这样CLI会优先从环境变量中获取parent的临时凭证,无需依赖credentials文件。同时注意修正配置中的拼写错误:role_arm应为role_arn。
修改后的~/.aws/config示例:
[default] region = eu-west-2 output = json [profile parent] mfa_serial = arn:aws:iam::111111111111:mfa/my-device [profile child1] source_profile = parent include_profile = parent role_arn = arn:aws:iam::222222222222:role/child1_role credential_source = Environment [profile child2] source_profile = parent include_profile = parent role_arn = arn:aws:iam::333333333333:role/child2_role credential_source = Environment
修改后,启动parent子shell即可直接用--profile切换子角色:
aws-vault exec parent aws s3 ls --profile child1 > ~/bucket-list/child1.json aws s3 ls --profile child2 > ~/bucket-list/child2.json
方法2:无需进入子shell,直接批量执行命令
如果需要频繁批量操作多个子账户,可以不用单独进入子shell,直接通过aws-vault exec传递命令:
# 单个子账户命令 aws-vault exec child1 -- aws s3 ls > ~/bucket-list/child1.json # 批量处理脚本示例(适合12个账户的场景) #!/bin/bash PROFILES=("child1" "child2" "child3" "child4") # 替换为你的所有子profile for PROFILE in "${PROFILES[@]}"; do aws-vault exec "$PROFILE" -- aws s3 ls > ~/bucket-list/"$PROFILE".json done
将上述脚本保存为batch-s3-ls.sh,赋予执行权限后一键运行即可完成所有账户的存储桶列表导出。
方法3:简化STS AssumeRole操作(备选)
如果不想修改配置,可以用AWS CLI的assume-role命令结合环境变量自动注入,比如:
# 在parent子shell中执行,获取child1角色凭证 CREDS=$(aws sts assume-role --role-arn arn:aws:iam::222222222222:role/child1_role --role-session-name child1-session) # 导出临时凭证到环境变量 export AWS_ACCESS_KEY_ID=$(echo "$CREDS" | jq -r '.Credentials.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS" | jq -r '.Credentials.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo "$CREDS" | jq -r '.Credentials.SessionToken') # 此时直接执行命令即可使用child1角色 aws s3 ls > ~/bucket-list/child1.json
这种方法需要安装jq解析JSON,适合临时场景,但批量操作不如前两种方法高效。
内容的提问来源于Stack Exchange,提问作者David Gard

