使用cdk而非Sam

问题描述

AWS CDK为开发人员提供了出色的功能。使用CDK开发人员不仅可以管理整个基础架构,还可以管理安全性,代码管道,...

但是我最近在挣扎。我曾经使用SAM调试lambda进行本地调试。我知道如何设置CDK环境以及调试CDK应用程序本身。但是我不知道如何在CDK中调试lambda应用程序。

有人可以帮助我吗?

解决方法

自 2021 年 4 月 29 日起,提供了通过 SAM 调试 CDK 应用程序的附加选项。它处于预览阶段,但这篇博文涵盖了它:https://aws.amazon.com/blogs/compute/better-together-aws-sam-and-aws-cdk/

基本上,安装 AWS CLI 和 AWS CDK。安装 SAM CLI - 测试版,可在此处获得:https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-cdk-getting-started.html

然后你可以运行如下命令:

sam-beta-cdk build sam-beta-cdk local invoke sam-beta-cdk local invoke start-api 甚至用 sam-beta-cdk local start-lambda

模拟 Lambda 服务 ,

您可以按照here所述同时使用SAM和CDK。特别是:

  1. 运行您的AWS CDK应用并创建一个AWS CloudFormation模板

    cdk synth --no-staging > template.yaml

  2. 找到您的逻辑ID template.yaml中的Lambda函数。看起来像 MyFunction12345678,其中12345678代表一个8个字符的唯一字符 AWS CDK为所有资源生成的ID。右行 看起来应该像这样:Type: AWS::Lambda::Function

  3. 通过执行以下命令运行函数:

    sam local invoke MyFunction12345678 --no-event

,

如果使用的是VSCode,则可以设置启动操作以运行node中的当前文件以在本地对其进行测试。 您需要做的就是在您要测试的文件上按F5

您需要在处理程序文件的末尾添加以下内容,以便在node中执行时处理程序得以执行:

if (process.env.NODE_ENV === "development" && process.argv.includes(__filename)) {
  // Exercise the Lambda handler with a mock API Gateway event object.
  handler(({
    pathParameters: {
      param1: "test",param2: "code",},} as unknown) as APIGatewayProxyEvent)
    .then((response) => {
      console.log(JSON.stringify(response,null,2));
      return response;
    })
    .catch((err: any) => console.error(err));
}

将此添加到.vscode/launch.json中的启动配置中:

  "configurations": [
    {
      "name": "Current TS File","type": "node","request": "launch","args": ["${relativeFile}","-p","${workspaceFolder}/tsconfig.json"],"runtimeArgs": ["-r","ts-node/register","-r","tsconfig-paths/register","--nolazy"],"cwd": "${workspaceRoot}","internalConsoleOptions": "openOnSessionStart","envFile": "${workspaceFolder}/.env","smartStep": true,"skipFiles": ["<node_internals>/**","node_modules/**"]
    },

仅在使用Typescript时才需要ts-nodetsconfig-paths。如果还没有npm i -D ts-node tsconfig-paths,则必须添加它们。