如何跨账号触发中心账号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} )
三、安全强化措施
- Lambda内部账号校验:在
lambda_handler中从event['RequestIdentity']['AccountId']获取调用账号,与DynamoDB中维护的允许账号列表对比,拒绝非法调用。 - 最小权限配置:确保中心账号A的Lambda角色仅拥有DynamoDB操作的必要权限,无冗余权限。
- 网络隔离:若Lambda部署在VPC内,需配置NAT网关或VPC端点保证跨账号调用的网络连通性。
四、关键注意事项
- 响应格式合规:Lambda必须严格按照CloudFormation自定义资源规范返回结果,包含
Status、Reason、PhysicalResourceId、Data字段,避免应用栈部署卡住。 - 版本控制:给Lambda配置版本或别名,应用栈调用固定版本,避免Lambda更新导致部署异常。
- 权限一致性:确保应用栈的CloudFormation执行角色被Lambda资源策略允许调用,无组织场景下必须通过Lambda内部逻辑做账号白名单校验。
内容的提问来源于stack exchange,提问作者user20358
相关产品推荐
相关产品推荐

