You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 07:45:32