如何使用 AWS CDK 为 Lambda 函数设置 EventBridge 规则目标并附带别名

4
在我的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控制台UI允许为目标设置别名和版本 通过UI配置时,目标ARN具有别名


我为此打开了一个功能请求 https://github.com/aws/aws-cdk/issues/12522,欢迎提出意见! - baumannalexj
1个回答

4
我找到了:事件规则需要类型为 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)
        });


请问您能否确认上述内容是否扩展了附加到此Lambda的IAM角色以允许‘events.amazonaws.com’调用Lambda函数? - demsey
这个事件调用了我的 Lambda,不起作用了吗?我没有为这个 Lambda 创建自定义角色,所以如果你给 Lambda 分配了一个自定义角色,你可能需要导入该角色并注入到 awsEvents.Rule 构造函数中。你能像上面那样尝试一下并告诉我们结果吗? - baumannalexj
@demsey - 不应该更新Lambda函数的IAM角色,而是应该更新函数资源策略。区别在于角色赋予Lambda执行操作的访问权限,而资源策略允许其他资源(例如此情况下的EventBridge)访问/调用函数。 - Sidharth Ramesh
@baumannalexj 你能分享文档的来源吗? - undefined
抱歉,阿希什,我在找到解决方案一个月后就停止了这个工作。我敢打赌当时没有文档,我要么是凭经验找到了解决方法,要么是查看了代码。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接