如何使用 AWS CDK 为带有别名的 Lambda 设置 EventBridge 规则目标

问题描述

在我的 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 类型,并且由于 IAliasIVersion 都扩展了 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)
        });