问题描述
在我的 Lambda CDK 堆栈中,我想设置一个事件规则,每 10 分钟向我的 Lambda 发送一个事件。
这有效并以 lambda 作为目标部署规则
// ... setup lambdaFunction construct...
// -- EVENTBRIDGE RULES --
const meetingSyncEvent = {
path: "/v1/meeting/sync",httpMethod: "GET"
};
const eventTarget = new awsEventTarget.LambdaFunction(lambdaFunction,{
event: awsEvents.RuleTargetInput.fromObject(meetingSyncEvent)
});
/**
Todo how do I add target to ARN with alias/version
* */
const eventRule = new awsEvents.Rule(this,generateConstructName("event-rule"),{
enabled: true,description: "event to invoke GET /meeting/sync",ruleName: "meeting-sync-rule",targets : [
eventTarget
],schedule: awsEvents.Schedule.rate(EVENT_MEETING_SYNC_RATE)
});
// -- end EVENTBRIDGE RULES --
问题是这仅针对没有别名或版本的基本 ARN(实际上始终指向 $Latest)。 AWS 控制台中有此选项可为目标设置别名或版本(如下图),我如何在 CDK 中执行此操作?
aws console UI allows alias and version for target target arn has alias when configured through UI
解决方法
我找到了:事件规则采用 IFunction
类型,并且由于 IAlias
和 IVersion
都扩展了 IFunction
,所以我们可以采用我们为函数创建的别名,并提供别名作为函数参数(AWS 区分函数、别名函数和版本函数)
const lambdaAlias = lambdaFunction.latestVersion
.addAlias(ENVIRONMENT_UPPERCASE)
const eventTarget = new awsEventsTargets.LambdaFunction(lambdaAlias,{
event: awsEvents.RuleTargetInput.fromObject(meetingSyncEvent)
});
const eventRule = new awsEvents.Rule(this,"event-rule",{
enabled: true,description: `event to invoke GET /meeting/sync for ${FUNCTION_NAME}`,ruleName: `${FUNCTION_NAME}-invoke-meetingsync`,targets: [
eventTarget
],schedule: awsEvents.Schedule.rate(EVENT_MEETING_SYNC_RATE)
});