BucketNotificationsHandler 因 lambda 版本而失败但 CDK 代码中没有 lambda

BucketNotificationsHandler failing for lambda version but no lambda in CDK code

我正在尝试通过 CDK 创建 CloudFormation 堆栈。我正在创建一个 S3 存储桶并监听它对 SNS 的创建通知。

但是我的 CloudfFormation 堆栈失败并出现错误:

nodejs10.x 的运行时参数不再支持创建或更新 AWS Lambda 函数。我们建议您在创建或更新函数时使用新的运行时 (nodejs14.x)。

BucketNotificationsHandlerXXXXXXX

Resource handler returned message: "The runtime parameter of nodejs10.x is no longer supported for creating or updating AWS Lambda functions. We recommend you use the new runtime (nodejs14.x) while creating or updating functions. (Service: Lambda, Status Code: 400, Request ID: XXXXXX, Extended Request ID: null)" (RequestToken: XXXXXXX, HandlerErrorCode: InvalidRequest)

我不确定这个 lambda 错误是从哪里出现的。以及如何更改其版本,因为我没有在此 CDK 中使用 lambda。

在 CDK 中使用的代码部分:

    const snsOutput = new sns.Topic(this, 'snsOutput',
                {topicName: `snsOutput`});  // sns creation

    const S3Output = new Bucket(this, "S3Output", {
                    bucketName: `S3Output`,
                    blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
                    lifecycleRules: [{ expiration: Duration.days(3) }],
                    removalPolicy: RemovalPolicy.DESTROY,
                });  // s3 creation
    // creating event for s3 to sns
    S3Output.addObjectCreatedNotification(new s3n.SnsDestination(snsOutput)); 
   

将您的 CDK 版本更新到最新版本

王子给出的答案是简答

长答案如下: 为了能够侦听传入的项目并将这些事件发布到通知服务,AWS 自动生成一个默认的 lambda(准确地说是单例 lambda)来为您处理此问题。 如果您幸运地拥有之前确实成功的堆栈,您可以通过 Cloudformation 查看它。在“资源”选项卡下,您可以看到实际上存在一个 Lambda 函数,类似于 'BucketNotificationHandler'.

如果您没有以前的堆栈,那么您仍然可以查看它。如果你正确地设置了你的 cdk,你一定已经完成了 'cdk bootstrap'。这会在您的帐户中产生一个具有可比较名称的小堆栈,例如 'CDK Toolkit' 或 'CDK Bootstrap'。 如果您查看此 Cloudformation 堆栈,在 Resources 选项卡下,您将找到一个存储桶资源(通常名为 'cdktoolkit-stagingbucket')。单击该存储桶资源的 link,您将进入一个 S3 存储桶,您的 CDK 使用该存储桶在 'cdk' 文件夹中存储 Cloudformation 变更集,并在 'assets' 文件夹中存储压缩代码文件(如果有) ] 文件夹。 单击进入 'cdk' 文件夹。在那里你会找到带有你(试图)部署(ed)的堆栈名称的文件夹,其中包含带时间戳的 yaml 文件。 Select 时间戳最接近您尝试部署的时间的 yaml 文件,然后单击列表顶部的 'Download' 按钮。 在此 yaml 文件(文件扩展名为“.yml”)中,您将看到 cloudformation 变更集,其中包含您在堆栈中定义的所有资源和自动生成的资源。 (不用说:这样的文件最好在可以格式化yaml的代码编辑器中查看,比如VS Code)。

只需搜索术语 'nodejs',您将很快找到使用 nodejs 作为运行时的资源,例如前面提到的自动生成的 BucketNotificationHandler lambda。您很可能会看到类似这样的内容:

"Runtime": "nodejs10.x"

这很可能是您的 cdk 版本在自动生​​成 lambda 时使用的默认 nodejs 版本。因此升级到更新的 CDK 版本很可能会增加用于自动生成的 lambda 的默认 nodejs 版本。

所以,是的,试一试,请让我知道这是否有效(将其标记为答案),因为我和我的同事在这里遇到了同样的问题,但我们不能简单地升级到新版本目前,因为我们依赖于一个不适用于较新的 cdk 版本的包。因此,我们进行了背景研究以确保这是手头的实际问题;)

有关谁创建此 Lambda 函数的简短摘要?

CDK 在内部使用它在存储桶上应用配置通知。它是存储桶上 运行 s3.putNotificationConfiguration 的自定义资源。您可以阅读更多详细信息 in this link


综上所述,有两种方法可以解决此问题:

  1. 将您的 aws-cdk 版本更新为 ^1.94.1 以上版本。 A fix 已经为此发布。注意:这可能不像看起来那么容易。由于与构造包的大量耦合,您可能面临解决 cynth 故障的困难。
  2. 或者,如果您想坚持使用当前版本的 cdk,您可以选择在 CDK 中使用逃生舱口。或者只需添加这些代码行就可以了:
const handler = Stack.of(this).node.tryFindChild('BucketNotificationsHandler050a0587b7544547bf325f094a3db834')?.node.defaultChild as cdk.CfnResource
handler.addPropertyOverride("Runtime", "nodejs12.x");

对上述代码片段的一点解释:使用 cdk escape hatch 我正在定位 lambda 处理程序的逻辑 ID,即 BucketNotificationsHandler050a0587b7544547bf325f094a3db834,然后明确覆盖运行时值为“nodejs12.x


希望这能帮助您解决问题。

我刚遇到这个问题,你需要做两件事。一种是更新您的 cdk。另一个是更新 requirements.txt 。在这里,我刚刚更新了 cdk 并且正在摸索为什么它不起作用。

npm update -g aws-cdk

更新 requirements.txt 然后

python3 -m pip install -r requirements.txt

现在一切正常。