

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 AWS Serverless Application Model 範本部署 Amazon EventBridge 資源
<a name="eb-use-sam"></a>

您可以在 EventBridge 主控台中手動建置和測試[規則](eb-rules.md)，這可在您精簡[事件模式](eb-event-patterns.md)時協助開發程序。不過，您準備好部署應用程式後，即可以更輕鬆地使用架構，例如 [AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html)，以一致地啟動所有無伺服器資源。

我們將使用此[範例應用程式](https://github.com/aws-samples/amazon-eventbridge-producer-consumer-example)來查看您可以使用 AWS SAM 範本來建置 EventBridge 資源的方式。此範例中的 template.yaml 檔案是定義四個[AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)函數的 AWS SAM 範本，並顯示將 Lambda 函數與 EventBridge 整合的兩種不同方式。

如需此範例應用程式的逐步解說，請參閱 [教學課程：建立範例 Amazon EventBridge 應用程式](eb-tutorial-get-started.md)。

 使用 EventBridge 和 AWS SAM 範本的方法有兩種。針對由一個規則調用一個 Lambda 函數的簡單整合，建議使用**組合範本**方法。如果您有複雜的路由邏輯，或您要連線到 AWS SAM 範本外部的資源，則**使用分隔範本**方法是更好的選擇。

**Topics**
+ [組合範本](#eb-combined-template)
+ [分離範本](#eb-separated-template)

## 組合範本
<a name="eb-combined-template"></a>

第一種方法會使用 `Events` 屬性來設定 EventBridge 規則。下列範例程式碼會定義調用 Lambda 函數的[事件](eb-events.md)。

**注意**  
此範例會自動在每個 AWS 帳戶中存在的預設[事件匯流排](eb-event-bus.md)上建立規則。若要將規則與自訂事件匯流排建立關聯，您可以將 `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 中，您只需定義事件模式，並 AWS SAM 自動建立具有所需許可的 IAM 角色。

## 分離範本
<a name="eb-separated-template"></a>

在 中定義 EventBridge 組態的第二個方法中 AWS 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. 最後，定義一個 `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"
   ```