AWS CDK中如何配置A账号实体扮演B账号角色以访问目标资源
AWS CDK中如何配置A账号实体扮演B账号角色以访问目标资源
看起来你现在的核心问题是:CloudFormation执行角色(A账号里那个CDK自动创建的cfn-exec-role)没有权限扮演B账号的跨账号角色,而且执行ACM的changeResourceRecordSets操作时,还是用了默认的CFN执行角色身份,导致权限不足。我帮你一步步拆解解决:
第一步:确认B账号角色的信任策略配置正确
你提到B账号的角色允许A账号来扮演它,那这个角色的信任策略必须明确授权A账号的CFN执行角色(或者A账号根账号,更安全的是指定具体角色)调用sts:AssumeRole。比如B账号角色的信任策略应该是这样的:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::A_ACCOUNT_ID:role/cdk-asdsfghjjkkl-cfn-exec-role-123456789-us-east-1" }, "Action": "sts:AssumeRole" } ] }
把A_ACCOUNT_ID替换成你的A账号ID,后面的角色ARN就是你错误信息里那个CFN执行角色的ARN。如果暂时不确定具体角色,也可以先允许A账号根账号来扮演("arn:aws:iam::A_ACCOUNT_ID:root"),测试通过后再缩小权限范围。
第二步:给A账号的CFN执行角色添加AssumeRole权限
默认情况下,CDK创建的CFN执行角色没有权限调用sts:AssumeRole访问其他账号的角色,所以你需要在A账号的CDK栈中给这个角色添加权限:
from aws_cdk import aws_iam as iam, Stack from constructs import Construct class YourStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # B账号的跨账号角色ARN b_account_role_arn = "<你的B账号角色ARN>" # 获取A账号的CFN执行角色 cfn_exec_role = iam.Role.from_role_arn( self, "CfnExecRole", role_arn=f"arn:aws:iam::{self.account}:role/cdk-{self.stack_name}-cfn-exec-role-{self.region}" ) # 给CFN执行角色添加AssumeRole权限 cfn_exec_role.add_to_policy( iam.PolicyStatement( actions=["sts:AssumeRole"], resources=[b_account_role_arn] ) )
第三步:操作跨账号资源时指定使用B账号的角色
当你需要执行像changeResourceRecordSets这类跨账号的ACM操作时,不能用默认的CFN执行角色身份,必须明确指定使用B账号的角色。这里推荐用CDK的AwsCustomResource来封装API调用,因为原生的ACM L2构造可能不直接支持跨账号角色切换:
from aws_cdk import custom_resources as cr # 先获取B账号的角色 cross_account_role = iam.Role.from_role_arn( self, "CrossAccountRole", role_arn=b_account_role_arn ) # 创建CustomResource来调用ACM的changeResourceRecordSets API,指定用B账号角色执行 acm_record_set_updater = cr.AwsCustomResource( self, "AcmRecordSetUpdater", on_create=cr.AwsSdkCall( service="ACM", action="changeResourceRecordSets", parameters={ # 替换成你的实际参数,比如HostedZoneId、ChangeBatch等 "HostedZoneId": "YOUR_HOSTED_ZONE_ID", "ChangeBatch": { "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { # 你的记录集配置 } } ] } }, # 指定要扮演的B账号角色ARN assumed_role_arn=b_account_role_arn, region="us-east-1" # 资源所在的区域 ), # 给CustomResource的执行角色添加AssumeRole权限 policy=cr.AwsCustomResourcePolicy.from_statements([ iam.PolicyStatement( actions=["sts:AssumeRole"], resources=[b_account_role_arn] ) ]) )
常见误区提醒
- 别搞反信任策略方向:很多人会在A账号的角色上配置允许AssumeRole,但实际上必须在B账号的角色上配置信任策略,允许A账号的主体来扮演它。
- 不要忽略执行角色的权限:不管是CFN执行角色还是CustomResource的执行角色,都需要显式添加
sts:AssumeRole权限到目标角色ARN。 - 跨账号操作必须显式指定角色:CDK默认会用当前栈的执行角色,所以跨账号资源操作一定要明确指定要切换的角色。
备注:内容来源于stack exchange,提问作者Nikolaisyl
相关产品推荐
相关产品推荐

