如何使用现有Lambda函数创建CDK部署后触发器?类型报错求解
如何用CDK原生方式为现有Lambda(IFunction)创建部署后触发器
问题背景
使用TypeScript开发CDK时,尝试通过triggers.Trigger创建部署后触发器并复用现有Lambda,但通过lambda.Function.fromFunctionArn()获取的是IFunction类型实例,而TriggerProps的handler参数要求传入具体的Function类型,导致类型不匹配报错:
Type 'IFunction' is missing the following properties from type 'Function': currentVersion, runtime, canCreatePermissions, _layers, and 37 more.ts(2740)
用户报错的代码:
const existingLambda = lambda.Function.fromFunctionArn( this, "myExistingLambdaID", "arn:aws:lambda:us-xxx-1:##########:function:myFunctionName" ); const ciTrigger = new triggers.Trigger(this, 'MyTrigger', { handler: existingLambda, });
CDK原生解决方案
方案1:使用CustomResource直接触发现有Lambda(推荐)
通过CDK的custom-resources模块实现部署后触发,无需额外Lambda转发,完全原生且满足需求:
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'; // 获取现有Lambda的IFunction实例 const existingLambda = lambda.Function.fromFunctionArn( this, "myExistingLambdaID", "arn:aws:lambda:us-xxx-1:##########:function:myFunctionName" ); // 创建自定义资源提供程序,将现有Lambda作为事件处理程序 const triggerProvider = new cr.Provider(this, 'TriggerProvider', { onEventHandler: existingLambda, }); // 创建自定义资源,部署完成后触发Lambda执行 new cdk.CustomResource(this, 'PostDeployTrigger', { serviceToken: triggerProvider.serviceToken, // 可选:传递自定义参数到Lambda properties: { TriggerContext: 'CDK_POST_DEPLOY' } });
说明
cr.Provider会自动为现有Lambda配置CloudFormation调用权限- 自定义资源会在CDK栈部署完成后触发Lambda执行,效果与
triggers.Trigger一致 - 无额外资源开销,完全基于CDK原生模块实现
方案2:通过转发Lambda适配triggers模块
如果坚持使用triggers模块,可以创建一个轻量转发Lambda作为类型适配层,调用现有Lambda:
import * as cdk from 'aws-cdk-lib'; import * as triggers from 'aws-cdk-lib/triggers'; import * as lambda from 'aws-cdk-lib/aws-lambda'; // 获取现有Lambda的IFunction实例 const existingLambda = lambda.Function.fromFunctionArn( this, "myExistingLambdaID", "arn:aws:lambda:us-xxx-1:##########:function:myFunctionName" ); // 创建转发Lambda,负责调用现有Lambda const forwarderLambda = new lambda.Function(this, 'TriggerForwarder', { runtime: lambda.Runtime.NODEJS_20_X, handler: 'index.handler', code: lambda.Code.fromInline(` const AWS = require('aws-sdk'); const lambdaClient = new AWS.Lambda(); exports.handler = async (event) => { await lambdaClient.invoke({ FunctionName: '${existingLambda.functionName}', Payload: JSON.stringify(event) }).promise(); }; `), }); // 给转发Lambda添加调用现有Lambda的权限 existingLambda.grantInvoke(forwarderLambda); // 使用triggers模块创建部署后触发器 const ciTrigger = new triggers.Trigger(this, 'MyTrigger', { handler: forwarderLambda, });
说明
- 转发Lambda仅做请求转发,资源开销极小
- 完美适配
triggers.Trigger的类型要求,保留该模块的原有特性
内容的提问来源于stack exchange,提问作者Patrick Cummins
相关产品推荐
相关产品推荐

