如何使用 boto3 以 lambda 函数为目标创建 eventbridge 规则?

问题描述

我想创建一个以 lambda 函数为目标的 AWS eventbridge 规则。名为“StartInstance”的 lambda 函数已通过控制台创建。

我创建了一个 python 脚本,它使用 boto3 库来创建这个 eventbridge 规则。我将一个 cron 表达式传递给这个规则,它会在特定的日期和时间调用 lambda 函数

下面是运行成功的python脚本代码

import boto3

eventclient = boto3.client('events')

response = eventclient.put_rule(
    Name='ec2scheduler',ScheduleExpression='cron(40 16 21 4 ? 2021)',State='ENABLED',Description='schedule ec2 start/stop'
)

response = eventclient.put_targets(
    Rule='ec2scheduler',Targets=[
        {
            'Id': 'StartInstance','Arn': 'arn:aws:lambda:us-east-1:965477548122:function:StartInstance'
        }
    ]
)

如您所见,传递给规则的 cron 表达式为:cron(40 16 21 4 ? 2021) 它应该在日期 2021 年 4 月 21 日格林威治标准时间 16:40 调用了“StartInstance”lambda 函数。但是,当时并没有调用 lambda 函数。我在 cloudwatch 日志中也没有看到为 lambda 函数生成的日志。当我通过 AWS Eventbridge 控制台在控制台中看到所需的目标和 cron 表达式时,上面创建的 eventbridge 规则对我来说看起来不错。但该规则在时机成熟时不会调用 lambda 函数

为什么会这样?

解决方法

TLDR:需要在 lambda 和 eventbridge 上建立权限/信任

说明

这里缺少一些东西:

首先:

当您从控制台添加规则和目标时,AWS 会执行创建 lambda 事件源映射的工作。在这种情况下,应将 EventBridge 规则配置为 lambda 函数的事件源。

create_event_source_mapping lambda API 将允许您显式添加此映射。这必须在您创建目标和规则后在代码中完成。

第二:

put_rule EventBridge API 的参数中,我没有看到提到 RoleArn。规则将使用的角色的 ARN 需要具有调用目标 lambda 函数的权限。

,

将策略 AmazonEventBridgeFullAccess 附加到角色。