AWS CDK受信任账户B如何凭证化部署至已引导账户A?
跨账户CDK部署凭证问题解决方案
问题回顾
已经在AWS账户A执行CDK引导时用--trust参数信任了账户B:
CDK_DEFAULT_ACCOUNT=A cdk bootstrap --trust B ...
但账户B里没有~/.aws目录、也没配置凭证环境变量的CodePipeline任务,执行cdk deploy到账户A时报错:
failed: Error: Need to perform AWS calls for account A, but the current credentials are for B
该CodePipeline动作的执行角色已经有管理员权限,现在要解决的是:受信任的账户B里的流程怎么拿到凭证,才能部署到已引导的账户A。
解决步骤
1. 确认跨账户引导配置生效
检查账户A里的CDK引导栈(通常名为cdk-toolkit)对应的执行角色——cdk-hnb659fds-cfn-exec-*-A,查看它的信任策略是否包含账户B的ID或ARN,确保信任关系已正确配置。
2. 配置CodePipeline角色的跨账户扮演权限
CodePipeline的执行角色需要具备扮演账户A中CDK执行角色的权限,操作如下:
- 在账户B的CodePipeline执行角色权限策略中,添加
sts:AssumeRole权限,允许其扮演账户A的CDK执行角色(ARN格式:arn:aws:iam::A:role/cdk-hnb659fds-cfn-exec-*-A) - 执行
cdk deploy时,直接指定目标账户的CDK执行角色ARN:
cdk deploy --role-arn arn:aws:iam::A:role/cdk-hnb659fds-cfn-exec-*-A
若想避免每次命令行指定,也可在CDK代码中配置默认部署角色:
// TypeScript示例 new cdk.Stack(app, 'MyStack', { env: { account: 'A', region: 'us-east-1' }, synthesizer: new cdk.DefaultStackSynthesizer({ deployRoleArn: 'arn:aws:iam::A:role/cdk-hnb659fds-cfn-exec-*-A', }), });
3. 通过STS获取临时凭证切换账户
如果CodePipeline任务允许设置环境变量,可以先获取账户A的临时凭证再执行部署:
- 调用STS命令获取临时凭证:
aws sts assume-role --role-arn arn:aws:iam::A:role/cdk-hnb659fds-cfn-exec-*-A --role-session-name cdk-deploy-session
- 将返回结果中的
AccessKeyId、SecretAccessKey、SessionToken设置为环境变量:
export AWS_ACCESS_KEY_ID=临时密钥ID export AWS_SECRET_ACCESS_KEY=临时密钥 export AWS_SESSION_TOKEN=临时会话令牌
- 再执行
cdk deploy命令
4. 检查执行角色的权限边界
如果CodePipeline的执行角色设置了权限边界,需确认该边界允许sts:AssumeRole操作,以及访问账户A中CDK相关资源的权限,避免权限边界限制了必要操作。
内容的提问来源于stack exchange,提问作者Ramón J Romero y Vigil
相关产品推荐
相关产品推荐

