

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

# 使用 Amazon Serverless Application Model 模板部署 Amazon EventBridge 资源
<a name="eb-use-sam"></a>

您可以在 EventBridge 控制台中手动构建和测试[规则](eb-rules.md)，这有助于完善[事件模式](eb-event-patterns.md)的开发过程。但是，一旦您准备好部署应用程序，使用 [Amazon SAM](https://docs.amazonaws.cn/serverless-application-model/latest/developerguide/what-is-sam.html) 等框架一致地启动所有无服务器资源则更加方便。

我们将使用此[示例应用程序](https://github.com/aws-samples/amazon-eventbridge-producer-consumer-example)来研究如何使用 Amazon SAM 模板来构建 EventBridge 资源。此示例中的 template.yaml 文件是一个 Amazon SAM 模板，它定义了四个[Amazon Lambda](https://docs.amazonaws.cn/lambda/latest/dg/welcome.html)函数，并显示了将 Lambda 函数与集成的两种不同方法。 EventBridge

有关此示例应用程序的演练，请参阅[教程：创建 Amazon EventBridge 示例应用程序](eb-tutorial-get-started.md)。

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

**Topics**
+ [组合模板](#eb-combined-template)
+ [分开的模板](#eb-separated-template)

## 组合模板
<a name="eb-combined-template"></a>

第一种方法使用`Events`属性来配置 EventBridge 规则。以下示例代码定义了一个[事件](eb-events.md)，它调用您的 Lambda 函数。

**注意**  
此示例自动在默认[事件总线上创建规则，该总线](eb-event-bus.md)存在于每个 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 角色。

## 分开的模板
<a name="eb-separated-template"></a>

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

1. 首先，您要定义 Lambda 函数：

   ```
   atmConsumerCase1Fn:
     Type: AWS::Serverless::Function
     Properties:
       CodeUri: atmConsumer/
       Handler: handler.case1Handler
       Runtime: nodejs12.x
   ```

1. 接下来，使用 `AWS::Events::Rule` 资源定义规则。这些属性定义了事件模式，也可以指定[目标](eb-targets.md)。您可以明确定义多个目标。

   ```
   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"
   ```

1. 最后，定义一个授予调 EventBridge 用目标权限的`AWS::Lambda::Permission`资源。

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