使用 Amazon EventBridge 和 Amazon Serverless Application Model 模板 - Amazon EventBridge
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon EventBridge 和 Amazon Serverless Application Model 模板

您可以在 EventBridge 控制台中手动构建和测试规则,这有助于在开发过程中完善事件模式。但是,一旦您准备好部署应用程序,使用 Amazon SAM 等框架一致地启动所有无服务器资源则更加方便。

我们将使用此示例应用程序来研究如何使用 Amazon SAM 模板构建 EventBridge 资源。此示例中的 template.yaml 文件是一个 Amazon SAM 模板,其中定义了四个 Amazon Lambda 函数,并展示了将 Lambda 函数与 EventBridge 集成的两种不同方式。

有关此示例应用程序的演练,请参阅创建 Amazon EventBridge 示例应用程序

可通过两种方式将 EventBridge 和 Amazon SAM 模板配合使用。对于由一条规则调用一个 Lambda 函数的简单集成,建议使用组合模板方法。如果您的路由逻辑很复杂,或者要连接到 Amazon SAM 模板之外的资源,那么分开的模板方法是更好的选择。

组合模板

第一种方法使用 Events 属性来配置 EventBridge 规则。以下示例代码定义了一个事件,它调用您的 Lambda 函数。

注意

此示例自动在默认事件总线上创建规则,每个 Amazon 账户中都有默认事件总线。要将规则与自定义事件总线关联,可以将 EventBusName 添加到模板中。

atmConsumerCase3Fn: Type: AWS::Serverless::Function Properties: CodeUri: atmConsumer/ Handler: handler.case3Handler Runtime: nodejs12.x Events: Trigger: Type: CloudWatchEvent Properties: Pattern: source: - custom.myATMapp detail-type: - transaction detail: result: - "anything-but": "approved"

此 YAML 代码等同于 EventBridge 控制台中的一个事件模式。在 YAML 中,您只需要定义事件模式,Amazon SAM 会自动创建具有所需权限的 IAM 角色。

分开的模板

在 Amazon SAM 中定义 EventBridge 配置的第二种方法,模板对资源进行了更明确的分隔。

  1. 首先,您要定义 Lambda 函数:

    atmConsumerCase1Fn: Type: AWS::Serverless::Function Properties: CodeUri: atmConsumer/ Handler: handler.case1Handler Runtime: nodejs12.x
  2. 接下来,使用 AWS::Events::Rule 资源定义规则。这些属性定义了事件模式,也可以指定目标。您可以明确定义多个目标。

    EventRuleCase1: Type: AWS::Events::Rule Properties: Description: "Approved transactions" EventPattern: source: - "custom.myATMapp" detail-type: - transaction detail: result: - "approved" State: "ENABLED" Targets: - Arn: Fn::GetAtt: - "atmConsumerCase1Fn" - "Arn" Id: "atmConsumerTarget1"
  3. 最后,定义一个 AWS::Lambda::Permission 资源,向 EventBridge 授予调用目标的权限。

    PermissionForEventsToInvokeLambda: Type: AWS::Lambda::Permission Properties: FunctionName: Ref: "atmConsumerCase1Fn" Action: "lambda:InvokeFunction" Principal: "events.amazonaws.com" SourceArn: Fn::GetAtt: - "EventRuleCase1" - "Arn"