CDK部署aws-eventbridge-lambda未创建Lambda函数是否符合预期?
问题结论
你对@aws-solutions-constructs/aws-eventbridge-lambda构造的用途认知没有偏差,这个构造的默认能力就是同时创建EventBridge定时规则、目标Lambda函数、调用权限、CloudWatch日志组等配套资源,最终只生成EventBridge规则完全是配置错误导致的,具体问题和修复方案如下:
具体错误点
- 核心错误:CDK流水线未添加TimedLambdaStack的部署阶段
你编写的TimedPipelineStack仅定义了CodePipeline本身的资源,没有通过addStage方法添加承载业务资源的部署阶段,也没有把TimedLambdaStack加入流水线的部署范围。CDK Pipelines默认只会部署流水线自身所在的栈,不会自动识别项目下的其他栈,你当前看到的孤立EventBridge规则属于之前测试残留或其他栈的资源,根本不是TimedLambdaStack合成出来的。 - 语法错误:TypeScript代码误用注释符
你在installCommands配置块中用#作为行注释符,这是Python的注释语法,TypeScript/JavaScript的合法单行注释为//,这行带#的代码会直接触发TS编译错误。如果流水线没有配置严格的编译失败拦截,就会生成残缺的CloudFormation模板,只能合成出部分资源。 - 依赖问题:未正确声明solutions constructs包依赖
你把@aws-solutions-constructs/aws-eventbridge-lambda的安装命令注释掉了,如果package.json中没有显式声明这个依赖,流水线执行npm ci时不会安装对应包,CDK合成时找不到构造定义,也会导致资源生成不全。
修复步骤
- 第一步:本地安装依赖并更新package.json
在项目根目录执行以下命令,把solutions constructs包正式加入项目依赖:npm install @aws-solutions-constructs/aws-eventbridge-lambda
执行完成后确认package.json的dependencies节点下存在对应包条目,后续流水线执行npm ci时会自动安装所有依赖,不需要在installCommands中单独写安装命令。 - 第二步:修正流水线代码,添加业务栈部署阶段
修复注释语法问题,同时新增部署阶段把TimedLambdaStack纳入流水线部署范围,参考代码如下:
import * as cdk from 'aws-cdk-lib'; import * as codecommit from 'aws-cdk-lib/aws-codecommit'; import { Construct } from 'constructs'; import {CodeBuildStep, CodePipeline, CodePipelineSource} from "aws-cdk-lib/pipelines"; import { TimedLambdaStack } from './timed-lambda-stack'; export class TimedPipelineStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const repo = new codecommit.Repository(this, 'TimedRepo', { repositoryName: "TimedRepo" }); const pipeline = new CodePipeline(this, 'Pipeline', { pipelineName: 'TimedLambdaPipeline', synth: new CodeBuildStep('SynthStep', { input: CodePipelineSource.codeCommit(repo, 'master'), installCommands: [ 'npm install -g aws-cdk' ], commands: [ 'npm ci', 'npm run build', 'npx cdk synth' ] }) }); // 新增应用部署阶段,加载定时Lambda栈 const appDeployStage = pipeline.addStage(new cdk.Stage(this, 'AppDeploy')); new TimedLambdaStack(appDeployStage, 'TimedLambdaStack'); } }
- 第三步:清理残留资源后重新部署
先删除之前生成的包含孤立EventBridge规则的无效CloudFormation栈,再把修复后的代码推送到CodeCommit的master分支,等流水线全流程执行完成后,即可在新生成的栈中看到Lambda函数、IAM执行角色、CloudWatch日志组、EventBridge规则的完整资源链路。
补充验证:本地可以先执行
npx cdk synth命令,检查生成的CloudFormation模板中是否包含AWS::Lambda::Function类型的资源,如果本地产物里就没有Lambda资源,优先检查本地依赖安装是否正常、TS编译是否有报错。
内容的提问来源于stack exchange,提问作者Dan Tony
相关产品推荐
相关产品推荐

