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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:07:54