首页 > 解决方案 > 我想对 lambda 进行调试,但 cdk 合成器在通过管道堆栈部署时不包含 Lambda 资源

问题描述

我正在努力调试由 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 模板,则创建的 SAM 模板中不存在 Lambda 函数(类型:AWS::Lambda::Function)。

我认为这种行为是因为 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?

标签: amazon-web-servicesaws-lambdaaws-cdkaws-codepipelineaws-sam-cli

解决方案


在您给出的示例中,lambda 函数在部署在WebServiceStage管道阶段下的堆栈中实例化。对于管道阶段cdk synth,将函数捆绑在内部的 JSON 文件中,cdk.out/并包含对此模板的引用作为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 合成器使用该文件:-

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

然后您应该能够在其中找到逻辑 IDtemplate.yml并运行

sam invoke local <logicalId>

在本地运行它


推荐阅读