如何使用单个IAM角色通过CDK CLI跨多账号部署资源?
跨账号CDK部署的可行性与配置修正
这种跨账号部署方式是可行的,但你的配置逻辑搞反了,才导致权限报错。
问题根源分析
你当前的执行流程是:Jenkins先扮演目标部署账号(假设为Account B)的sample-role-arn,然后在这个角色权限下执行cdk deploy,但你把CDK_DEFAULT_ACCOUNT设为了另一个账号(比如Account A)。此时CDK会尝试直接用Account B的角色去操作Account A的资源,或者尝试自动扮演Account A的默认部署角色,但:
- Account B的角色本身没有Account A的资源操作权限
- 你只在Account A的角色里信任了Account B的角色,但没给Account B的角色添加
sts:AssumeRole访问Account A角色的权限,所以会触发sts:AssumeRole权限不足的报错。
正确的配置步骤
假设你要通过Account B的sample-role-arn,将资源部署到Account A,需要做以下配置:
在目标部署账号Account A创建部署角色
创建一个专门用于CDK部署的角色(比如cdk-deploy-role),其信任策略需允许Account B的sample-role-arn扮演它,示例信任策略:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:role/sample-role-arn" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "你的外部ID" } } } ] }同时给这个角色添加CDK部署所需的权限(比如
AdministratorAccess或更精细化的权限)。在Account B的sample-role-arn中添加权限
给sample-role-arn的权限策略添加允许扮演Account A的cdk-deploy-role的权限:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::AccountA-ID:role/cdk-deploy-role" } ] }修正CDK部署命令或代码
两种方式二选一:- 命令行指定角色:执行
cdk deploy时直接指定目标账号的部署角色:cdk deploy --all --role-arn arn:aws:iam::AccountA-ID:role/cdk-deploy-role - CDK代码中指定环境与角色:在Stack定义中明确目标账号和角色:
const targetStack = new TargetStack(app, 'TargetStack', { env: { account: 'AccountA-ID', region: 'us-east-1' }, role: Role.fromRoleArn(app, 'DeployRole', 'arn:aws:iam::AccountA-ID:role/cdk-deploy-role') });
- 命令行指定角色:执行
修正后的Jenkinsfile示例
script { withCredentials([string(credentialsId: "sample-role-arn", variable: 'ARN'), string(credentialsId: "sample-role-extid", variable: 'EXT_ID')]) { withAWS(role: "${ARN}", externalId: "${EXT_ID}", region: "${AWS_REGION}"){ sh ''' cdk deploy --all --role-arn arn:aws:iam::目标账号ID:role/cdk-deploy-role ''' } } }
内容的提问来源于stack exchange,提问作者Aniruddha
相关产品推荐
相关产品推荐

