跨账号执行AWS ECS update-service报账号ID不匹配问题
问题根因
报错由两个核心配置错误导致:
- 跨账号角色扮演的角色归属配置反向。操作账号B的ECS资源时,授权角色必须创建在目标账号B中,信任策略配置为信任账号A的访问身份;当前
assume-role传入的角色ARN归属账号A,即使给该角色配置账号B为可信实体,信任方向也是错误的,无法获得账号B的资源操作权限。 - 仅将
assume-role的返回结果赋值给变量,未将接口返回的临时访问密钥、会话Token注入AWS CLI运行环境,CLI全程使用账号A本地原生凭证发起请求,未生效角色扮演身份,这是报错直接提示当前账号ID为Account_A_ID的直接原因。
正确操作步骤
1. 在账号B中创建合规的跨账号访问角色
- 登录账号B的IAM控制台新建角色,可信实体选择「AWS账号」,填入源账号A的账号ID,授权账号A的身份可以扮演该角色
- 给角色附加权限策略,至少包含
ecs:UpdateService等需要执行的ECS操作权限,资源范围明确覆盖要操作的目标集群、服务 - 记录该角色的完整ARN,格式为
arn:aws:iam::Account_B_ID:role/<自定义角色名>,注意ARN中的账号ID必须是账号B的ID。
2. 正确执行角色扮演并加载临时凭证
在账号A的操作环境中,先执行角色扮演命令,注意替换为账号B中创建的角色ARN:
temp_role=$(aws sts assume-role \ --role-arn arn:aws:iam::Account_B_ID:role/gocd-deploy-ecs-role \ --role-session-name "ecs-update-service")
执行完成后,解析返回结果中的临时凭证,导出为AWS CLI默认识别的环境变量(需要本地提前安装jq工具用于解析JSON返回值):
export AWS_ACCESS_KEY_ID=$(echo $temp_role | jq -r '.Credentials.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo $temp_role | jq -r '.Credentials.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo $temp_role | jq -r '.Credentials.SessionToken')
凭证加载完成后,可以执行aws sts get-caller-identity验证当前身份,如果返回的身份ARN归属账号B、且是刚才创建的角色会话,说明身份切换成功。
3. 执行ECS服务更新命令
跨账号调用AWS API时,建议所有资源参数都传入完整ARN,避免CLI在当前账号下检索资源导致匹配错误,调整后的命令如下:
aws ecs update-service \ --service arn:aws:ecs:us-east-1:Account_B_ID:service/good-cluster/cluster-service \ --cluster arn:aws:ecs:us-east-1:Account_B_ID:cluster/good-cluster \ --force-new-deployment
可选优化配置
如果需要频繁跨账号操作,可以直接在AWS CLI配置文件(一般路径为~/.aws/config)中添加跨账号角色的独立配置项,不用每次手动导出临时凭证:
[profile b-ecs-deploy] role_arn = arn:aws:iam::Account_B_ID:role/gocd-deploy-ecs-role source_profile = a-local-credential # 替换为本地存储账号A凭证的profile名 region = us-east-1
后续执行命令时只需要追加--profile b-ecs-deploy参数,CLI会自动完成角色扮演和凭证轮换。
前置检查项
执行操作前请确认以下配置没有遗漏:
- 账号B中角色的信任策略没有配置错误,信任主体确实为账号A的对应操作身份,不存在方向写反、账号ID填错的问题
- 账号B中角色的权限策略没有添加限制账号访问的条件键,资源范围正确覆盖目标ECS集群、服务
- 账号A中用于发起操作的IAM身份,本身已配置
sts:AssumeRole权限,允许扮演账号B中的对应角色 - 本地使用的AWS CLI版本没有过旧,避免跨账号API调用存在兼容问题
内容的提问来源于stack exchange,提问作者Paras Thakur
相关产品推荐
相关产品推荐

