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

如何跨账号触发中心账号A中的自定义资源Lambda

跨账号部署自定义资源Lambda的实现方案

一、中心账号A的独立栈改造

将原自定义资源Lambda抽离为独立栈部署在账号A,保留其对DynamoDB的操作权限,同时配置跨账号调用权限,并输出服务令牌供其他账号应用栈使用。

核心代码调整

from aws_cdk import (
    aws_lambda as _lambda,
    aws_iam as _iam,
    custom_resources as cr,
    CfnOutput,
    Stack
)
from datetime import datetime

class CenterAccountCustomResourceStack(Stack):
    def __init__(self, scope, construct_id, **kwargs):
        super().__init__(scope, construct_id, **kwargs)

        # 定义自定义资源Lambda(保留原逻辑)
        cust_res_lambda = _lambda.Function(
            self, 'crLambda',
            runtime=_lambda.Runtime.PYTHON_3_8,
            code=_lambda.Code.from_asset('..'),
            handler='lambda.lambda_handler',
            function_name='customResourceLambda',
            layers=[..,..], 
        )

        # 保留对中心账号A DynamoDB的操作权限
        cust_res_lambda.add_to_role_policy(_iam.PolicyStatement(
            effect=_iam.Effect.ALLOW,
            actions=[
                'dynamodb:Query',
                'dynamodb:GetItem',
                'dynamodb:GetRecords',
                'dynamodb:PutItem',
                'dynamodb:UpdateItem',
                'dynamodb:BatchGetItem',
            ],
            resources=['arn:aws:dynamodb:XregionX:Xaccount-A-numX:table/stances']
        ))

        # 创建自定义资源Provider
        res_provider = cr.Provider(
            self,'crProvider',
            on_event_handler= cust_res_lambda
        )

        # 配置跨账号调用权限:通过AWS组织ID限制调用范围(无组织可移除Condition,需配合Lambda内部校验)
        cust_res_lambda.add_permission(
            'AllowCrossAccountInvocation',
            principal='*',
            action='lambda:InvokeFunction',
            condition=_iam.Condition(
                test='StringEquals',
                variable='aws:PrincipalOrgID',
                values=['你的AWS组织ID']
            )
        )

        # 输出Provider服务令牌,供其他账号应用栈引用
        CfnOutput(self, 'CustomResourceServiceToken',
            value=res_provider.service_token,
            export_name='CenterAccount-CustomResource-ServiceToken'
        )

二、应用栈(账号B/C/D)的适配

应用栈不再创建自定义资源Lambda,直接引用中心账号A输出的服务令牌触发跨账号Lambda执行。

核心代码调整

from aws_cdk import (
    custom_resources as cr,
    Stack,
    CfnParameter,
    aws_ssm as ssm
)
from datetime import datetime

class ApplicationStack(Stack):
    def __init__(self, scope, construct_id, **kwargs):
        super().__init__(scope, construct_id, **kwargs)

        # 方式1:通过部署参数传入中心账号A的服务令牌
        # service_token_param = CfnParameter(self, 'CenterServiceToken', type='String')
        # service_token = service_token_param.value_as_string

        # 方式2:从中心账号A的SSM参数读取(需提前在A账号存入令牌,并给B/C/D栈执行角色配置读取权限)
        service_token = ssm.StringParameter.value_for_string_parameter(
            self, '/center-account/custom-resource-service-token'
        )

        now = datetime.now()
        time = now.strftime("%H:%M:%S") # 强制每次栈部署触发自定义资源执行

        # 创建跨账号自定义资源
        cr.CustomResource(self, 'cust_res',
            service_token=service_token,
            properties={"prop1":"aa","prop2":"bb","res_id":time}
        )

三、安全强化措施

  1. Lambda内部账号校验:在lambda_handler中从event['RequestIdentity']['AccountId']获取调用账号,与DynamoDB中维护的允许账号列表对比,拒绝非法调用。
  2. 最小权限配置:确保中心账号A的Lambda角色仅拥有DynamoDB操作的必要权限,无冗余权限。
  3. 网络隔离:若Lambda部署在VPC内,需配置NAT网关或VPC端点保证跨账号调用的网络连通性。

四、关键注意事项

  • 响应格式合规:Lambda必须严格按照CloudFormation自定义资源规范返回结果,包含Status、Reason、PhysicalResourceId、Data字段,避免应用栈部署卡住。
  • 版本控制:给Lambda配置版本或别名,应用栈调用固定版本,避免Lambda更新导致部署异常。
  • 权限一致性:确保应用栈的CloudFormation执行角色被Lambda资源策略允许调用,无组织场景下必须通过Lambda内部逻辑做账号白名单校验。

内容的提问来源于stack exchange,提问作者user20358

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:40:22