如何在代码打包中使用cfn参数?

How to use Cfn parameters in code bundling?

我需要将配置值从一个 CDK 堆栈传递到另一个堆栈,并在第二个堆栈的构造代码捆绑步骤中使用该值。例如。第一个堆栈是 S3 存储桶,第二个堆栈是 Lambda@Edge 函数,它不支持环境变量,并且需要在自定义构造中捆绑期间将 S3 存储桶名称嵌入代码中。当我这样做时,我会得到像 ${Token[TOKEN.214]} 这样的值,而不是真正的存储桶名称。

let bucket: Bucket

// This function builds and bundles the code for Lambda@Edge
buildLambdaCode(..., { env: { S3_BUCKET: bucket.bucketName } })

确实,CDK-generated 资源名称在 synth-time 是 Tokens at code-time, CloudFormation Refs,而“实际名称”仅在 deploy-time。因此,将存储桶名称传递给 Lambda@Edge 的选项是:

  1. 环境变量:默认方案,但是Lambda@Edge不支持*,如你所说
  2. SSM Parameter + SDK Call:另一种典型的解决方案,但增加的延迟违背了边缘功能的目的。
  3. CloudFront 自定义 Header:作为 in this SO Question. You can set customHeaders in CDK Cloudfront Origin constructs
  4. 硬编码存储桶名称:best-practice 上帝可能会原谅您在这种情况下设置显式 bucketName

* 实验性的cloudfront.experimental.EdgeFunction construct dangerously permits env var props (error or ignored at deploy?). The stable cloudfront.Function没有,与服务文档一致