我想调试 lambda,但 cdk synth 不包含 Lambda 资源,当它由管道堆栈部署时

I want to dubug lambda, but cdk synth does not include Lambda Resource, when it is deployed by pipeline stack

我正在努力调试由 CDK 管理的 lambda。

我的CDK源和下面AWS提供的示例几乎一样

https://github.com/aws-samples/cdk-pipelines-demo/tree/typescript

源码结构如下:

--project_dir/
   |_cdk.json
   |_pipelines_webinar/
       |_lambda/
          |_handler.ts    <====== I WANT TO EXECUTE AND DEBUG ON LOCAL THIS.
   |_pipeline_stack.ts
   |_pipelines_webinar_stack.ts
   |_webservice_stage.ts

我认为它需要使用 SAM CLI 运行 并在本地调试。

但是,如果我 运行 cdk synth 来创建 SAM 模板, Lambda 函数(类型:AWS::Lambda::Function)在创建的 SAM 模板中不存在。

我认为这种行为是因为 lambda 是由 CDK 管道部署的。

重现该情况的方法如下:

git clone -b typescript https://github.com/aws-samples/cdk-pipelines-demo.git
cd cdk-pipelines-demo
npm install
cdk synth > template.yml

问。在这种情况下,有什么方法可以 运行 并在本地调试 lambda 吗?

在您给出的示例中,lambda 函数在部署在 WebServiceStage 管道阶段下的堆栈中实例化。对于流水线阶段,cdk synth 将函数捆绑在 cdk.out/ 内的 JSON 文件中,并包含对此模板的引用作为 template.yml 的一部分。 lambda 作为工件传入,这意味着它不会直接写入 template.yml

解决方法是创建一个新文件 lambda-app.ts 来实例化 PipelinesWebinar Stack

#!/usr/bin/env node
import 'source-map-support/register';
import { App } from '@aws-cdk/core';
import { PipelinesWebinarStack } from './pipelines_webinar/pipelines_webinar_stack';

const app = new App();

new PipelinesWebinarStack(app, 'PipelineStack');

app.synth();

然后用 tsc 编译它,并让 cdk synth 使用那个文件:-

cdk synth --app lambda-app.js --no-staging > template.yml

那么你应该可以在template.yml和运行

中找到逻辑ID
sam invoke local <logicalId>

在本地运行它