如何配置Amazon CDK,在Lambda函数部署后自动触发其执行?
实现CDK部署后自动调用Lambda函数
可以通过AWS CDK的**自定义资源(Custom Resource)**实现部署完成后自动调用Lambda函数,以下是具体实现方案:
核心思路
利用AwsCustomResource构造,在CloudFormation部署的「创建」或「更新」阶段,调用Lambda的Invoke API触发目标函数执行。无需额外编写辅助Lambda,直接通过CDK配置即可完成。
代码示例(TypeScript)
假设你已经定义了目标Lambda函数targetLambda,只需添加以下代码:
import * as cdk from 'aws-cdk-lib'; import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as cr from 'aws-cdk-lib/custom-resources'; import { Construct } from 'constructs'; export class MyStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // 你的目标Lambda函数(已存在) const targetLambda = new lambda.Function(this, 'TargetLambda', { runtime: lambda.Runtime.NODEJS_20_X, handler: 'index.handler', code: lambda.Code.fromAsset('lambda'), }); // 部署后自动调用Lambda的自定义资源 new cr.AwsCustomResource(this, 'InvokePostDeploy', { // 首次部署时调用 onCreate: { service: 'Lambda', action: 'invoke', parameters: { FunctionName: targetLambda.functionName, InvocationType: 'Event', // 异步调用,不阻塞部署;如需同步用RequestResponse // 如需传参,添加Payload字段:Payload: JSON.stringify({ foo: 'bar' }) }, physicalResourceId: cr.PhysicalResourceId.of(`Invoke-${targetLambda.functionName}-${Date.now()}`), }, // 更新部署时也调用 onUpdate: { service: 'Lambda', action: 'invoke', parameters: { FunctionName: targetLambda.functionName, InvocationType: 'Event', }, physicalResourceId: cr.PhysicalResourceId.of(`Invoke-${targetLambda.functionName}-${Date.now()}`), }, // 授予自定义资源调用Lambda的权限 policy: cr.AwsCustomResourcePolicy.fromStatements([ new cdk.aws_iam.PolicyStatement({ actions: ['lambda:InvokeFunction'], resources: [targetLambda.functionArn], }), ]), }); } }
关键配置说明
- InvocationType:选
Event时为异步调用,CloudFormation无需等待执行结果,部署流程不会被阻塞;选RequestResponse为同步调用,若Lambda执行失败会导致部署中断,适合需要验证执行结果的场景。 - PhysicalResourceId:每次部署生成唯一ID,确保CloudFormation会触发调用操作(避免因资源ID重复跳过执行)。
- 权限配置:必须为自定义资源授予
lambda:InvokeFunction权限,否则无法调用目标Lambda。
内容的提问来源于stack exchange,提问作者Ken Yip
相关产品推荐
相关产品推荐

