如何获取AWSCustomResource的响应并实现跨栈复用?
问题描述
我在stack-1中使用CustomResource调用S3的getObject接口,想了解能否将该API调用的响应在另一个栈stack-2中使用。相关代码如下:
const customResource = new AwsCustomResource(this, 'CustomResource', <AwsCustomResourceProps>{ onCreate: { service: 'S3', action: 'getObject', parameters: { Bucket: 'bucket_name', Key: `key` }, physicalResourceId: PhysicalResourceId.of(`CustomResource-${Date.now().toString()}`) // Always update physical ID so function gets executed }, role: Role.fromRoleArn(this, 'S3CrossAccountAccessRole', 'ROLE_ARN'), installLatestAwsSdk: false, logRetention: RetentionDays.ONE_WEEK }); console.log(customResource.getResponseField('Data.Body'));
目前CustomResource已创建成功,其对应的Lambda返回了Data.Body字段,但通过上述代码打印该响应时无输出。
解决方案
为什么console.log无输出?
CDK是声明式框架,customResource.getResponseField('Data.Body')返回的是一个Token——这是CloudFormation部署阶段用的占位符,并非运行时的实际值。在CDK synth/deploy过程中,Token还没被替换成真实的S3对象内容,所以直接console.log只会打印Token的标识字符串,看不到实际响应。
如何在stack-2中使用该响应?
可以通过CloudFormation输出(Outputs)+ 跨栈引用实现,步骤如下:
1. 在stack-1中导出响应字段
把CustomResource返回的Data.Body作为栈的输出导出:
new CfnOutput(this, 'S3ObjectBodyOutput', { value: customResource.getResponseField('Data.Body'), exportName: 'Stack1-S3ObjectBody' // 导出名需在AWS账户+区域内全局唯一 });
2. 在stack-2中导入输出值
使用Fn.importValue导入stack-1的导出值,之后就能在stack-2的资源配置里使用:
const importedS3Body = Fn.importValue('Stack1-S3ObjectBody'); // 示例:将值作为Lambda的环境变量 new Function(this, 'UseS3BodyFunction', { runtime: Runtime.NODEJS_18_X, handler: 'index.handler', code: Code.fromAsset('lambda'), environment: { S3_OBJECT_BODY: importedS3Body } });
注意事项
- 部署顺序:确保stack-1先于stack-2部署,或者在CDK应用中通过
stack2.addDependency(stack1)明确声明依赖,避免导入时输出还未创建。 - 大小限制:CloudFormation输出值最大支持4KB,如果S3对象内容超过这个限制,建议改为输出S3对象的Key,让stack-2自行调用S3 getObject接口读取内容。
- 自动更新:你设置了每次部署都更新CustomResource的物理ID,这会导致stack-1每次部署都会重新拉取S3对象内容,stack-2在下次部署时会自动获取更新后的值。
内容的提问来源于stack exchange,提问作者mohanakrishnavh
相关产品推荐
相关产品推荐

