

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

# 將 Amazon SNS 事件散發至 AWS 事件分叉管道
<a name="sns-fork-pipeline-as-subscriber"></a>


|  | 
| --- |
| 對於事件封存和分析，Amazon SNS 現在建議使用其與 Amazon Data Firehose 的原生整合。您可以訂閱 Firehose 交付串流至 SNS 主題，這可讓您將通知傳送至封存和分析端點，例如 Amazon Simple Storage Service (Amazon S3) 儲存貯體、Amazon Redshift 資料表、Amazon OpenSearch Service (OpenSearch Service) 等。搭配使用 Amazon SNS 與 Firehose 交付串流是全受管且無程式碼的解決方案，不需要您使用 AWS Lambda 函數。如需詳細資訊，請參閱[散發到 Firehose 交付串流](sns-firehose-as-subscriber.md)。 | 

您可以使用 Amazon SNS 建置事件驅動型應用程式，這些應用程式會使用訂閱者服務自動執行工作，以回應發佈者服務所觸發的事件。這個架構模式可讓服務更具重複使用性、互通性和可擴展性。不過，可能需要投入更多勞力將事件分支到管道中處理，以滿足常見的事件處理需求，例如事件儲存、備份、搜尋、分析和重播。

為了加速事件驅動型應用程式的開發，您可以向 Amazon SNS 主題訂閱 AWS 由事件分叉管道提供支援的事件處理管道。 AWS 事件分叉管道是一組開放原始碼[巢狀應用程式](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-nested-applications.html)，以[AWS 無伺服器應用程式模型](https://aws.amazon.com/serverless/sam/) (AWS SAM) 為基礎，您可以直接從[AWS 事件分叉管道套件](https://serverlessrepo.aws.amazon.com/applications?query=aws-event-fork-pipelines) （選擇**顯示建立自訂 IAM 角色或資源政策的應用程式**) 中部署 AWS 。

如需 AWS 事件分叉管道使用案例，請參閱 [部署和測試 Amazon SNS 事件分支管道範例應用程式](sns-deploy-test-fork-pipelines-sample-application.md)。

**Topics**
+ [AWS 事件分叉管道的運作方式](#how-sns-fork-works)
+ [部署 AWS 事件分叉管道](#deploying-sns-fork-pipelines)
+ [部署和測試 Amazon SNS 事件分支管道範例應用程式](sns-deploy-test-fork-pipelines-sample-application.md)
+ [訂閱 Amazon SNS 主題 AWS 的事件分叉管道](sns-subscribe-event-fork-pipelines.md)

## AWS 事件分叉管道的運作方式
<a name="how-sns-fork-works"></a>

AWS Event Fork Pipelines 是一種無伺服器設計模式。不過，它也是一組以 SAM AWS 為基礎的巢狀無伺服器應用程式 （您可以直接從 AWS Serverless Application Repository (AWS SAR) 部署到 ， AWS 帳戶 以豐富您的事件驅動平台）。因應您的架構要求，您可以單獨部署這些巢狀應用程式。

**Topics**
+ [事件儲存和備份管道](#sns-fork-event-storage-and-backup-pipeline)
+ [事件搜尋和分析管道](#sns-fork-event-search-and-analytics-pipeline)
+ [事件重播管道](#sns-fork-event-replay-pipeline)

下圖顯示由三個巢狀應用程式補充 AWS 的事件分叉管道應用程式。您可以根據您的架構需求，從 SAR 上的 AWS AWS 事件分叉管道套件獨立部署任何管道。

![\[AWS 事件分叉管道架構，顯示如何透過三個不同的管道篩選和處理 Amazon SNS 主題的事件：事件儲存和備份、事件搜尋和分析，以及事件重播。這些管道描述為垂直堆疊方塊，每個都獨立處理來自相同 Amazon SNS 主題的事件。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-fork-pipeline-as-subscriber-how-it-works.png)


每個管道都訂閱同一個 Amazon SNS 主題，讓它本身可在事件發佈到主題時平行處理這些事件。每個管道各自獨立，而且可以設定自己的[訂閱篩選政策](sns-subscription-filter-policies.md)。這可讓管道只處理它有感興趣的事件子集 (而不是發佈到該主題的所有事件)。

**注意**  
由於您將三個 AWS Event Fork Pipelines 與一般事件處理管道一起放置 （可能已訂閱 Amazon SNS 主題），因此您不需要變更目前訊息發佈者的任何部分，即可在現有工作負載中利用 AWS Event Fork Pipelines。

### 事件儲存和備份管道
<a name="sns-fork-event-storage-and-backup-pipeline"></a>

下圖顯示[事件儲存和備份管道](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~fork-event-storage-backup-pipeline)。您可以讓此管道訂閱您的 Amazon SNS 主題，以自動備份流經您系統的事件。

此管道包含緩衝 Amazon SNS 主題交付事件的 Amazon SQS 佇列、自動輪詢佇列中這些事件並將其推送至串流的 AWS Lambda 函數，以及持久備份串流載入事件的 Amazon S3 儲存貯體。 Amazon SNS 

![\[Fork-Event-Storage-Backup-Pipeline，旨在處理和備份來自 Amazon SNS 主題的事件。流程從事件發散到 Amazon SQS 佇列的 Amazon SNS 主題開始。 Amazon SQS 然後，Lambda 函數會處理這些篩選的事件，將它們轉送至 Data Firehose。Firehose 串流負責緩衝、轉換和壓縮事件，然後再將其載入 Amazon S3 備份儲存貯體。最後，Amazon Athena 可用來查詢儲存的資料。圖表使用一系列圖示和箭頭來說明從一個服務到下一個服務的流程，清楚地標記管道的每個元件。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-fork-event-storage-and-backup-pipeline.png)


若要微調 Firehose 串流的行為，您可以將它設定為將事件載入到儲存貯體之前，先緩衝、轉換和壓縮事件。隨著事件載入，您可以透過 Amazon Athena 使用標準 SQL 查詢來查詢儲存貯體。您也可以將管道設定為重複使用現有的 Amazon S3 儲存貯體，或建立新的儲存貯體。

### 事件搜尋和分析管道
<a name="sns-fork-event-search-and-analytics-pipeline"></a>

下圖顯示[事件搜尋和分析管道](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~fork-event-search-analytics-pipeline)。您可以讓此管道訂閱您的 Amazon SNS 主題，對搜尋網域中流經您系統的事件編製索引，然後對事件進行分析。

此管道包含緩衝 Amazon SNS 主題所交付事件的 Amazon SQS 佇列、輪詢佇列事件並將其推送至 串流的 AWS Lambda 函數、編製 Firehose 串流所載入事件索引的 Amazon OpenSearch Service 網域，以及存放無法在搜尋網域中編製索引之無效字母事件的 Amazon S3 儲存貯體。 Amazon SNS 

![\[AWS 架構中的事件搜尋和分析管道。從左側開始，Amazon SNS 主題會接收所有事件。然後，這些事件會透過代表「展開篩選事件」的虛線排入 Amazon SQS 佇列。從佇列中，事件由 Lambda 函數處理，然後轉送到 Data Firehose 串流。Data Firehose 會將事件導向兩個目的地：一個路由會導向 Amazon Elasticsearch Service 進行索引，另一個路由會將無法處理的或「無效字母」事件傳送至 Amazon S3 無效字母儲存貯體。在最右側，Elasticsearch Service 的輸出會饋送至 Kibana 儀表板，以進行分析和視覺化。整個流程是水平配置的，每個元件都由顯示資料流程方向的行連接。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-fork-event-search-and-analytics-pipeline.png)


若要調整 Firehose 串流的事件緩衝、轉換和壓縮，您可以設定此管道。

您也可以設定管道是否應該重複使用 中的現有 OpenSearch 網域， AWS 帳戶 或為您建立新的網域。隨著搜尋網域中編製事件的索引，您可以使用 Kibana 對您的事件進行分析，並即時更新視覺化儀表板。

### 事件重播管道
<a name="sns-fork-event-replay-pipeline"></a>

下圖顯示[事件重播管道](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~fork-event-replay-pipeline)。若要記錄您的系統在過去 14 天已處理的事件 (例如當您的平台需要從故障中復原時)，您可以讓此管道訂閱 Amazon SNS 主題，然後重新處理事件。

此管道包含緩衝 Amazon SNS 主題所交付事件的 Amazon SQS 佇列，以及從佇列輪詢事件並將其重新驅動至您一般事件處理管道的 AWS Lambda 函數，該管道也會訂閱您的主題。 Amazon SNS 

![\[流程圖格式的事件重播管道。從左到右，從 Amazon SNS 主題開始，該主題會將篩選的事件分佈到兩個平行程序。上方流程代表您的一般事件處理管道，其中包含處理事件的 Amazon SQS 佇列。標示為「fork-event-replay-pipeline」的較低流程包含 Amazon SQS 重播佇列，其中事件會在 Lambda 重播函數處理之前暫時存放。此 Lambda 函數能夠根據是否啟用或停用重播功能，將事件重新驅動到一般事件處理管道，或保留它們以進行重播。圖表也指出運算子可以控制啟用或停用事件重播功能。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-fork-event-replay-pipeline.png)


**注意**  
預設情況下，重播函數會停用，不會轉送您的事件。如果您需要重新處理事件，則必須啟用 Amazon SQS 重播佇列做為 AWS Lambda 重播函數的事件來源。

## 部署 AWS 事件分叉管道
<a name="deploying-sns-fork-pipelines"></a>

[AWS 事件分叉管道套件](https://serverlessrepo.aws.amazon.com/applications?query=aws-event-fork-pipelines) （選擇**顯示建立自訂 IAM 角色或資源政策的應用程式**) 可作為 中的一組公有應用程式 AWS Serverless Application Repository，您可以在其中使用[AWS Lambda 主控台](https://console.aws.amazon.com/lambda/)手動部署和測試這些應用程式。如需使用 AWS Lambda 主控台部署管道的資訊，請參閱 [訂閱 Amazon SNS 主題 AWS 的事件分叉管道](sns-subscribe-event-fork-pipelines.md)。

在生產案例中，我們建議在整體應用程式的 AWS SAM 範本中嵌入 AWS 事件分叉管道。巢狀應用程式功能可讓您將 資源新增至 `[AWS::Serverless::Application](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template.html#serverless-sam-template-application)` AWS SAM 範本，並參考 AWS SAR `ApplicationId`和巢狀應用程式的 `SemanticVersion` 。

例如，您可以將下列 YAML 程式碼片段新增至 AWS SAM 範本的 `Resources`區段，以使用事件儲存和備份管道做為巢狀應用程式。

```
Backup:   
    Type: AWS::Serverless::Application
  Properties:
    Location:
      ApplicationId: arn:aws:serverlessrepo:us-east-2:123456789012:applications/fork-event-storage-backup-pipeline
      SemanticVersion: 1.0.0
    Parameters: 
      #The ARN of the Amazon SNS topic whose messages should be backed up to the Amazon S3 bucket.
      TopicArn: !Ref MySNSTopic
```

當您指定參數值時，您可以使用 AWS CloudFormation 內部函數來參考範本中的其他資源。例如，在上述 YAML 程式碼片段中， `TopicArn` 參數會參考 AWS SAM 範本中其他位置`MySNSTopic`定義的`[AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html)`資源 。如需詳細資訊，請參閱*AWS CloudFormation 《 使用者指南*》中的[內部函數參考](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html)。

**注意**  
SAR AWS 應用程式的 AWS Lambda 主控台頁面包含**複製為 SAM 資源**按鈕，可將巢狀 AWS SAR 應用程式所需的 YAML 複製到剪貼簿。

# 部署和測試 Amazon SNS 事件分支管道範例應用程式
<a name="sns-deploy-test-fork-pipelines-sample-application"></a>

為了加速事件驅動型應用程式的開發，您可以向 Amazon SNS 主題訂閱 AWS 由事件分叉管道提供支援的事件處理管道。 AWS 事件分叉管道是一組開放原始碼[巢狀應用程式](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-nested-applications.html)，以[AWS 無伺服器應用程式模型](https://aws.amazon.com/serverless/sam/) (AWS SAM) 為基礎，您可以直接從[AWS 事件分叉管道套件](https://serverlessrepo.aws.amazon.com/applications?query=aws-event-fork-pipelines) （選擇**顯示建立自訂 IAM 角色或資源政策的應用程式**) 中部署 AWS 。如需詳細資訊，請參閱[AWS 事件分叉管道的運作方式](sns-fork-pipeline-as-subscriber.md#how-sns-fork-works)。

此頁面說明如何使用 AWS 管理主控台 部署和測試 AWS 事件分叉管道範例應用程式。

**重要**  
為了避免在您完成部署 AWS Event Fork Pipelines 範例應用程式之後產生不必要的成本，請刪除其 CloudFormation 堆疊。如需詳細資訊，請參閱 *AWS CloudFormation 使用者指南*中的[刪除 CloudFormation 主控台的堆疊](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)。

# AWS 事件分叉管道使用案例範例
<a name="example-sns-fork-use-case"></a>

下列案例說明使用 AWS Event Fork Pipelines 的事件驅動型無伺服器電子商務應用程式。您可以在 中使用此[範例電子商務應用程式](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~fork-example-ecommerce-checkout-api)， AWS Serverless Application Repository 然後使用 AWS Lambda 主控台將其部署在 AWS 帳戶 中，您可以在其中進行測試，並在 GitHub 中檢查其原始碼。

![\[整合 的無伺服器電子商務應用程式的架構 AWS 服務。它描述了從透過 API Gateway 下訂單的電子商務使用者到不同處理管道的流程，包括訂單儲存、搜尋分析和重播，展示如何透過 Amazon SNS、Lambda、Amazon SQS、DynamoDB 和 Kibana 管理和分析事件。\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/images/sns-fork-example-use-case.png)


此電子商務應用程式會透過 API Gateway 託管並由 AWS Lambda 函數 支援的 RESTful API 接收買方的訂單`CheckoutApiBackendFunction`。此函數將所有收到的訂單發佈到名為 `CheckoutEventsTopic` 的 Amazon SNS 主題，此主題又進而將訂單散發到四個不同的管道。

第一個管道是一般結帳處理管道，由電子商務應用程式的擁有者所設計和實作。此管道具有`CheckoutQueue`緩衝所有已接收訂單的 Amazon SQS 佇列、名為 的 AWS Lambda 函數`CheckoutFunction`，以輪詢佇列來處理這些訂單，以及`CheckoutTable`安全儲存所有已下訂訂單的 DynamoDB 資料表。

## 套用 AWS 事件分叉管道
<a name="applying-sns-fork-pipelines"></a>

電子商務應用程式的元件處理核心商業邏輯。不過，電子商務應用程式擁有者還需要解決下列問題：
+ **合規** 靜態加密安全、壓縮的備份，並淨化敏感資訊
+ **彈性** 在履行程序中斷時重播最近的訂單
+ **可搜尋性** 對已提交的訂單進行分析並產生指標

應用程式擁有者可以訂閱 `CheckoutEventsTopic`Amazon SNS 主題 AWS 的事件分叉管道，而不是實作此事件處理邏輯
+ [事件儲存和備份管道](sns-fork-pipeline-as-subscriber.md#sns-fork-event-storage-and-backup-pipeline) 設定為轉換資料以移除信用卡詳細資訊、緩衝資料 60 秒、使用 GZIP 來壓縮資料，以及使用 Amazon S3 的預設客戶受管金鑰來加密資料。此金鑰由 管理 AWS ，並由 AWS Key Management Service () 提供支援AWS KMS。

  如需詳細資訊，請參閱[《Amazon Data Firehose 開發人員指南》中的為您的目的地選擇 Amazon S3](https://docs.aws.amazon.com/firehose/latest/dev/create-destination.html#create-destination-s3)**[、Amazon Data Firehose 資料轉換](https://docs.aws.amazon.com/firehose/latest/dev/data-transformation.html)和[設定設定](https://docs.aws.amazon.com/firehose/latest/dev/create-configure.html)。
+ [事件搜尋和分析管道](sns-fork-pipeline-as-subscriber.md#sns-fork-event-search-and-analytics-pipeline)設定為索引重試持續時間 30 秒、使用儲存貯體來存放無法在搜尋網域中編製索引的訂單，以及使用篩選政策來限制可編製索引的訂單集。

  如需詳細資訊，請參閱《*Amazon Data Firehose 開發人員指南*》中的[為您的目的地選擇 OpenSearch Service](https://docs.aws.amazon.com/firehose/latest/dev/create-destination.html#create-destination-elasticsearch)。
+ 設定 [事件重播管道](sns-fork-pipeline-as-subscriber.md#sns-fork-event-replay-pipeline) 為使用電子商務應用程式擁有者所設計和實作的一般訂單處理管道的 Amazon SQS 佇列部分。

  如需詳細資訊，請參閱 *Amazon Simple Queue Service 開發人員指南*中的[佇列名稱與 URL](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-general-identifiers.html#queue-name-url)。

事件搜尋和分析管道的組態中設定下列 JSON 篩選政策。它只符合總金額為 100 USD 或更多金額的傳入訂單。如需詳細資訊，請參閱[Amazon SNS 訊息篩選](sns-message-filtering.md)。

```
{				
   "amount": [{ "numeric": [ ">=", 100 ] }]
}
```

使用 AWS 事件分叉管道模式，電子商務應用程式擁有者可以避免通常在為事件處理編碼不區分邏輯之後產生的開發開銷。相反地，她可以直接從 將 AWS 事件分叉管道部署 AWS Serverless Application Repository 到她的 AWS 帳戶。

# 步驟 1：部署範例 Amazon SNS 應用程式
<a name="deploy-sample-application"></a>

1. 登入 [AWS Lambda 主控台](https://console.aws.amazon.com/lambda/)。

1. 在導覽面板上，選擇 **Functions (函數)**，然後選擇 **Create function (建立函數)**。

1. 在 **Create function** (建立函數) 頁面上，執行下列動作：

   1. 選擇**瀏覽無伺服器應用程式存放庫**、**公有應用程式**、**顯示建立自訂 IAM 角色或資源政策的應用程式**。

   1. 搜尋 `fork-example-ecommerce-checkout-api`，然後選擇應用程式。

1. 在 **fork-example-ecommerce-checkout-api** 頁面上，執行下列動作：

   1. 在 **Application settings (應用程式設定)** 區段中，輸入 **Application name (應用程式名稱)** (例如，`fork-example-ecommerce-my-app`)。
**注意**  
為了在稍後輕鬆找到您的資源，請保留字首 `fork-example-ecommerce`。
對於每個部署，應用程式名稱必須是唯一的。如果您重複使用應用程式名稱，部署只會更新先前部署的堆疊 （而不是建立新的 CloudFormation 堆疊）。

   1. (選用) 輸入下列其中之一 **LogLevel** 設置來執行應用程序的 Lambda 函數：
      + `DEBUG`
      + `ERROR`
      + `INFO` (default)
      + `WARNING`

1. 選擇 **I acknowledge that this app creates custom IAM roles, resource policies and deploys nested applications. (我了解此應用程式會建立自訂 IAM 角色、資源政策及部署巢狀應用程式。)**，然後在頁面底部選擇 **Deploy (部署)**。

在**分叉範例電子商務的部署狀態*my-app***頁面上，Lambda 會顯示**您的應用程式正在部署**狀態。

在**資源**區段中， CloudFormation 開始建立堆疊，並顯示每個資源的 **CREATE\$1IN\$1PROGRESS** 狀態。程序完成時， CloudFormation 會顯示 **CREATE\$1COMPLETE** 狀態。

**注意**  
可能需要 20 到 30 分鐘才能部署完所有資源。

當部署完成時，Lambda 會顯示 **Your application has been deployed** (您的應用程式已經完成部署) 狀態。

# 步驟 2：執行 SNS 連結範例應用程式
<a name="execute-sample-application"></a>

1. 在 AWS Lambda 主控台的導覽面板上，選擇**應用程式**。

1. 在 **Applications (應用程式)** 頁面的搜尋欄位中，搜尋 `serverlessrepo-fork-example-ecommerce-my-app`，然後搜尋應用程式。

1. 在 **Resources (資源)** 區段中，執行下列動作：

   1. 若要尋找類型為 **ApiGateway RestApi** 的資源，請依 **Type (類型)** 排序資源 (例如 `ServerlessRestApi`)，然後展開資源。

   1. 將會顯示兩個巢狀資源，類型為 **ApiGateway Deployment** 和 **ApiGateway Stage**。

   1. 複製 **Prod API endpoint** 連結，並附加 `/checkout`，例如：

      ```
      https://abcdefghij.execute-api.us-east-2.amazonaws.com/Prod/checkout
      ```

1. 將下列 JSON 複製到名為 `test_event.json` 的檔案。

   ```
   {
      "id": 15311,
      "date": "2019-03-25T23:41:11-08:00",
      "status": "confirmed",
      "customer": {
         "id": 65144,		
   	 "quantity": 2,
         "price": 25.00,
         "subtotal": 50.00
      }]
   }
   ```

1. 若要將 HTTPS 請求傳送到您的 API 端點，請執行 `curl` 命令來傳遞範例事件承載當做輸入，例如：

   ```
   curl -d "$(cat test_event.json)" https://abcdefghij.execute-api.us-east-2.amazonaws.com/Prod/checkout
   ```

   API 會傳回以下空的回應，表示成功執行：

   ```
   { }
   ```

# 步驟 3：驗證 Amazon SNS 應用程式和管道效能
<a name="verify-sample-application-pipelines"></a>

## 步驟 1：驗證範例結帳管道的執行
<a name="verify-execution-checkout-pipeline"></a>

1. 登入 [Amazon DynamoDB 主控台](https://console.aws.amazon.com/dynamodb/)。

1. 在導覽面板上，選擇 **Tables (資料表)**。

1. 搜尋 `serverlessrepo-fork-example` 並選擇 `CheckoutTable`。

1. 在表格詳細資訊頁面，選擇 **Items (項目)**，然後選擇建立的項目。

   將會顯示存放的屬性。

## 步驟 2：驗證事件儲存和備份管道的執行
<a name="verify-execution-event-storage-backup-pipeline"></a>

1. 登入 [Amazon S3 主控台](https://console.aws.amazon.com/s3/)。

1. 在導覽面板上，選擇 **Buckets (儲存貯體)**。

1. 搜尋 `serverlessrepo-fork-example`，然後選擇 `CheckoutBucket`。

1. 瀏覽目錄階層，直到您找到副檔名為 `.gz` 的檔案為止。

1. 若要下載檔案，請選擇 **Actions (動作)**、**Open (開啟)**。

1. 基於合規理由，管道已設定 Lambda 函數來淨化信用卡資訊。

   若要驗證存放的 JSON 承載不包含任何信用卡資訊，請解壓縮檔案。

## 步驟 3：驗證事件搜尋和分析管道的執行
<a name="verify-execution-event-search-analytics-pipeline"></a>

1. 登入 [OpenSearch Service 主控台](https://console.aws.amazon.com/aos/)。

1. 在導覽面板的 **My domains (我的網域)** 下，選擇以 `serverl-analyt` 為字首的網域。

1. 管道已設定 Amazon SNS 訂閱篩選政策來設定數值相符條件。

   若要驗證事件編製索引是因為它參考的訂單的值高於 100 USD，請在 **serverl-analyt-*abcdefgh1ijk*** 頁面上選擇 **Indices (索引)**、**checkout\$1events**。

## 步驟 4：驗證事件重播管道的執行
<a name="verify-execution-event-replay-pipeline"></a>

1. 請登入 [Amazon SQS 主控台](https://console.aws.amazon.com/sqs/)。

1. 在佇列清單中，搜尋 `serverlessrepo-fork-example` 並選擇 `ReplayQueue`。

1. 選擇**傳送及接收訊息**。

1. 在 **Send and receive messages in fork-example-ecommerce-*my-app*...ReplayP-ReplayQueue-*123ABCD4E5F6*** (fork-example-ecommerce-my-app...ReplayP-ReplayQueue-123ABCD4E5F6 中傳送和接收訊息) 對話方塊中，選擇 **Poll for messages** (輪詢訊息)。

1. 若要驗證事件已排入佇列中，請在佇列中出現的訊息旁邊選擇 **More Details (更多詳細資訊)**。

# 步驟 4：模擬問題並重播事件以進行復原
<a name="simulate-issue-replay-events-for-recovery"></a>

## 步驟 1：啟用模擬問題並傳送第二個 API 請求
<a name="enable-simulated-issue-send-second-api-request"></a>

1. 登入 [AWS Lambda 主控台](https://console.aws.amazon.com/lambda/)。

1. 在導覽面板上，選擇 **Functions (函數)**。

1. 搜尋 `serverlessrepo-fork-example` 並選擇 `CheckoutFunction`。

1. 在 **fork-example-ecommerce-*my-app*-CheckoutFunction-*ABCDEF*...** 頁面的 **Environment variables (環境變數)** 區段中，將 **BUG\$1ENABLED** 變數設定為 **true**，然後選擇 **Save (儲存)**。

1. 將下列 JSON 複製到名為 `test_event_2.json` 的檔案。

   ```
   {
   	   "id": 9917,
   	   "date": "2019-03-26T21:11:10-08:00",
   	   "status": "confirmed",
   	   "customer": {
   	      "id": 56999,
   "quantity": 1,
   	      "price": 75.00,
   	      "subtotal": 75.00
   	   }]
   	}
   ```

1. 若要將 HTTPS 請求傳送到您的 API 端點，請執行 `curl` 命令來傳遞範例事件承載當做輸入，例如：

   ```
   curl -d "$(cat test_event_2.json)" https://abcdefghij.execute-api.us-east-2.amazonaws.com/Prod/checkout
   ```

   API 會傳回以下空的回應，表示成功執行：

   ```
   { }
   ```

## 步驟 2：驗證模擬資料損毀
<a name="verify-simulated-data-corruption"></a>

1. 登入 [Amazon DynamoDB 主控台](https://console.aws.amazon.com/dynamodb/)。

1. 在導覽面板上，選擇 **Tables (資料表)**。

1. 搜尋 `serverlessrepo-fork-example` 並選擇 `CheckoutTable`。

1. 在表格詳細資訊頁面，選擇 **Items (項目)**，然後選擇建立的項目。

   將會顯示存放的屬性，有些標記為 **CORRUPTED\$1 (毀損！)**

## 步驟 3：停用模擬問題
<a name="disable-simulated-issue"></a>

1. 登入 [AWS Lambda 主控台](https://console.aws.amazon.com/lambda/)。

1. 在導覽面板上，選擇 **Functions (函數)**。

1. 搜尋 `serverlessrepo-fork-example` 並選擇 `CheckoutFunction`。

1. 在 **fork-example-ecommerce-*my-app*-CheckoutFunction-*ABCDEF*...** 頁面的 **Environment variables (環境變數)** 區段中，將 **BUG\$1ENABLED** 變數設定為 **false**，然後選擇 **Save (儲存)**。

## 步驟 4：啟用重播以從問題中復原
<a name="enable-replay-recover-from-simulated-issue"></a>

1. 在 AWS Lambda 主控台的導覽面板上，選擇 **函數**。

1. 搜尋 `serverlessrepo-fork-example` 並選擇 `ReplayFunction`。

1. 展開 **Designer (設計工具)** 區段，選擇 **SQS** 圖磚，然後在 **SQS** 區段中選擇 **Enabled (已啟用)**。
**注意**  
需要大約 1 分鐘，Amazon SQS 事件來源觸發才會啟用。

1. 選擇**儲存**。

1. 若要查看復原的屬性，請返回 Amazon DynamoDB 主控台。

1. 若要停用重播，請返回 AWS Lambda 主控台並停用 的 Amazon SQS 事件來源觸發`ReplayFunction`。

# 訂閱 Amazon SNS 主題 AWS 的事件分叉管道
<a name="sns-subscribe-event-fork-pipelines"></a>

為了加速事件驅動型應用程式的開發，您可以向 Amazon SNS 主題訂閱 AWS 由事件分叉管道提供支援的事件處理管道。 AWS 事件分叉管道是一組開放原始碼[巢狀應用程式](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-nested-applications.html)，以[AWS 無伺服器應用程式模型](https://aws.amazon.com/serverless/sam/) (AWS SAM) 為基礎，您可以直接從[AWS 事件分叉管道套件](https://serverlessrepo.aws.amazon.com/applications?query=aws-event-fork-pipelines) （選擇**顯示建立自訂 IAM 角色或資源政策的應用程式**) 中部署 AWS 。如需詳細資訊，請參閱[AWS 事件分叉管道的運作方式](sns-fork-pipeline-as-subscriber.md#how-sns-fork-works)。

本節說明如何使用 AWS 管理主控台 部署管道，然後將 AWS 事件分叉管道訂閱 Amazon SNS 主題。開始之前，請[建立 Amazon SNS 主題](sns-create-topic.md)。

若要刪除構成管道的資源，請在 AWS Lambda 主控台的應用程式****頁面上尋找管道，展開 **SAM 範本區段**，選擇 **CloudFormation 堆疊**，然後選擇**其他動作**、**刪除堆疊**。

# 將事件儲存和備份管道部署和訂閱至 Amazon SNS
<a name="deploy-event-storage-backup-pipeline"></a>


|  | 
| --- |
| 對於事件封存和分析，Amazon SNS 現在建議使用其與 Amazon Data Firehose 的原生整合。您可以訂閱 Firehose 交付串流至 SNS 主題，這可讓您將通知傳送至封存和分析端點，例如 Amazon Simple Storage Service (Amazon S3) 儲存貯體、Amazon Redshift 資料表、Amazon OpenSearch Service (OpenSearch Service) 等。搭配使用 Amazon SNS 與 Firehose 交付串流是全受管且無程式碼的解決方案，不需要您使用 AWS Lambda 函數。如需詳細資訊，請參閱[散發到 Firehose 交付串流](sns-firehose-as-subscriber.md)。 | 

本教學課程說明如何部署[事件儲存和備份管道](sns-fork-pipeline-as-subscriber.md#sns-fork-event-storage-and-backup-pipeline)，並讓管道訂閱 Amazon SNS 主題。此程序會自動將與管道相關聯的 AWS SAM 範本轉換為 CloudFormation 堆疊，然後將堆疊部署到您的 AWS 帳戶。此程序還會建立和設定一組資源 (構成事件儲存和備份管道)，包括下列項目：
+ Amazon SQS 佇列
+ Lambda 函式
+ Firehose 交付串流
+ Amazon S3 備份儲存貯體

如需使用 Amazon S3 儲存貯體做為目的地設定串流的詳細資訊，請參閱《*Amazon Data Firehose API 參考*`[S3DestinationConfiguration](https://docs.aws.amazon.com/firehose/latest/APIReference/API_S3DestinationConfiguration.html)`》中的 。

如需轉換事件以及設定事件緩衝、事件壓縮和事件加密的詳細資訊，請參閱《*Amazon Data Firehose 開發人員指南*》中的[建立交付串流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)。

如需有關篩選事件的詳細資訊，請參閱本指南中的[Amazon SNS 訂閱篩選政策](sns-subscription-filter-policies.md)。

1. 登入 [AWS Lambda 主控台](https://console.aws.amazon.com/lambda/)。

1. 在導覽面板上，選擇 **Functions (函數)**，然後選擇 **Create function (建立函數)**。

1. 在 **Create function** (建立函數) 頁面上，執行下列動作：

   1. 選擇**瀏覽無伺服器應用程式存放庫**、**公有應用程式**、**顯示建立自訂 IAM 角色或資源政策的應用程式**。

   1. 搜尋 `fork-event-storage-backup-pipeline`，然後選擇應用程式。

1. 在 **fork-event-storage-backup-pipeline** 頁面上，執行下列動作：

   1. 在 **Application settings (應用程式設定)** 區段中，輸入 **Application name (應用程式名稱)** (例如，`my-app-backup`)。
**注意**  
對於每個部署，應用程式名稱必須是唯一的。如果您重複使用應用程式名稱，部署只會更新先前部署的堆疊 （而不是建立新的 CloudFormation 堆疊）。

   1. （選用） 針對 **BucketArn**，輸入要載入傳入事件的 Amazon S3 儲存貯體 ARN。如果您未輸入值，則會在 AWS 帳戶中建立新的 Amazon S3 儲存貯體。

   1. (選用) 對於 **DataTransformationFunctionArn**，輸入 Lambda 函數的 ARN，以透過此函數來轉換傳入的事件。如果您不輸入值，資料轉換會停用。

   1. (選用) 輸入下列其中之一 **LogLevel** 設置來執行應用程序的 Lambda 函數：
      + `DEBUG`
      + `ERROR`
      + `INFO` (default)
      + `WARNING`

   1. 對於 **TopicArn**，輸入 Amazon SNS 主題的 ARN，表示分支管道的此執行個體將訂閱此主題。

   1. (選用) 對於 **StreamBufferingIntervalInSeconds** 和 **StreamBufferingSizeInMBs**，輸入值來設定如何緩衝傳入的事件。如果您不輸入任何值，則會使用 300 秒和 5 MB。

   1. (選用) 輸入以下其中一個 **StreamCompressionFormat** 設定來壓縮傳入的事件：
      + `GZIP`
      + `SNAPPY`
      + `UNCOMPRESSED` (default)
      + `ZIP`

   1. （選用） 對於 **StreamPrefix**，輸入字串字首以命名存放在 Amazon S3 備份儲存貯體中的檔案。如果您不輸入值，則不會使用字首。

   1. (選用) 對於 **SubscriptionFilterPolicy**，使用 JSON 格式輸入 Amazon SNS 訂閱篩選政策，以用於篩選傳入的事件。篩選政策決定哪些事件會在 OpenSearch Service 索引中編製索引。如果您不輸入值，則不會使用篩選 (所有事件都編製索引)。

   1. (可選) 針對 **SubscriptionFilterPolicyScope**，請輸入字串 `MessageBody` 或 `MessageAttributes`，啟用以承載或屬性為基礎的訊息篩選。

   1. 選擇 **I acknowledge that this app creates custom IAM roles, resource policies and deploys nested applications. (我了解此應用程式會建立自訂 IAM 角色、資源政策及部署巢狀應用程式。)**，然後選擇 **Deploy (部署)**。

在**部署狀態*my-app***頁面上，Lambda 會顯示**您的應用程式正在部署**狀態。

在**資源**區段中， CloudFormation 開始建立堆疊，並顯示每個資源的 **CREATE\$1IN\$1PROGRESS** 狀態。程序完成時， CloudFormation 會顯示 **CREATE\$1COMPLETE** 狀態。

當部署完成時，Lambda 會顯示 **Your application has been deployed** (您的應用程式已經完成部署) 狀態。

發佈至 Amazon SNS 主題的訊息會自動儲存在事件儲存和備份管道佈建的 Amazon S3 備份儲存貯體中。

# 將事件搜尋和分析管道部署和訂閱至 Amazon SNS
<a name="deploy-event-search-analytics-pipeline"></a>


|  | 
| --- |
| 對於事件封存和分析，Amazon SNS 現在建議使用其與 Amazon Data Firehose 的原生整合。您可以訂閱 Firehose 交付串流至 SNS 主題，這可讓您將通知傳送至封存和分析端點，例如 Amazon Simple Storage Service (Amazon S3) 儲存貯體、Amazon Redshift 資料表、Amazon OpenSearch Service (OpenSearch Service) 等。搭配使用 Amazon SNS 與 Firehose 交付串流是全受管且無程式碼的解決方案，不需要您使用 AWS Lambda 函數。如需詳細資訊，請參閱[散發到 Firehose 交付串流](sns-firehose-as-subscriber.md)。 | 

本教學課程說明如何部署[事件搜尋和分析管道](sns-fork-pipeline-as-subscriber.md#sns-fork-event-search-and-analytics-pipeline)，並讓管道訂閱 Amazon SNS 主題。此程序會自動將與管道相關聯的 AWS SAM 範本轉換為 CloudFormation 堆疊，然後將堆疊部署到您的 AWS 帳戶。此程序還會建立和設定一組資源 (構成事件搜尋和分析管道)，包括下列項目：
+ Amazon SQS 佇列
+ Lambda 函式
+ Firehose 交付串流
+ Amazon OpenSearch Service 網域
+ Amazon S3 無法投遞儲存貯體

如需使用索引做為目的地設定串流的詳細資訊，請參閱《*Amazon Data Firehose API 參考*`[ElasticsearchDestinationConfiguration](https://docs.aws.amazon.com/firehose/latest/APIReference/API_ElasticsearchDestinationConfiguration.html)`》中的 。

如需轉換事件以及設定事件緩衝、事件壓縮和事件加密的詳細資訊，請參閱《*Amazon Data Firehose 開發人員指南*》中的[建立交付串流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)。

如需有關篩選事件的詳細資訊，請參閱本指南中的[Amazon SNS 訂閱篩選政策](sns-subscription-filter-policies.md)。

1. 登入 [AWS Lambda 主控台](https://console.aws.amazon.com/lambda/)。

1. 在導覽面板上，選擇 **Functions (函數)**，然後選擇 **Create function (建立函數)**。

1. 在 **Create function** (建立函數) 頁面上，執行下列動作：

   1. 選擇**瀏覽無伺服器應用程式存放庫**、**公有應用程式**、**顯示建立自訂 IAM 角色或資源政策的應用程式**。

   1. 搜尋 `fork-event-search-analytics-pipeline`，然後選擇應用程式。

1. 在 **fork-event-search-analytics-pipeline** 頁面上，執行下列動作：

   1. 在 **Application settings (應用程式設定)** 區段中，輸入 **Application name (應用程式名稱)** (例如，`my-app-search`)。
**注意**  
對於每個部署，應用程式名稱必須是唯一的。如果您重複使用應用程式名稱，部署只會更新先前部署的堆疊 （而不是建立新的 CloudFormation 堆疊）。

   1. (選用) 對於 **DataTransformationFunctionArn**，輸入 Lambda 函數的 ARN，以使用此函數來轉換傳入的事件。如果您不輸入值，資料轉換會停用。

   1. (選用) 輸入下列其中之一 **LogLevel** 設置來執行應用程序的 Lambda 函數：
      + `DEBUG`
      + `ERROR`
      + `INFO` (default)
      + `WARNING`

   1. (選用) 對於 **SearchDomainArn**，輸入叢集所在 OpenSearch Service 網域的 ARN，此叢集將設定所需的運算和儲存功能。如果您不輸入值，將會以預設組態建立新網域。

   1. 對於 **TopicArn**，輸入 Amazon SNS 主題的 ARN，表示分支管道的此執行個體將訂閱此主題。

   1. 對於 **SearchIndexName**，輸入事件搜尋和分析的 OpenSearch Service 索引名稱。
**注意**  
索引名稱有下列配額：  
不得包含大寫字母
不得包含下列字元：`\ / * ? " < > | ` , #`
開頭不得為下列字元：`- + _`
不得為下列字元：`. ..`
長度不得超過 80 個字元
長度不得超過 255 個位元組
不得包含冒號 (從 OpenSearch Service 7.0 開始)

   1. (選用) 輸入下列其中一項 OpenSearch Service 索引輪換期間的 **SearchIndexRotationPeriod** 設定：
      + `NoRotation` (default)
      + `OneDay`
      + `OneHour`
      + `OneMonth`
      + `OneWeek`

      索引輪換會將時間戳記附加到索引名稱，方便看出舊資料已過期。

   1. 對於 **SearchTypeName**，輸入 OpenSearch Service 類型的名稱，以組織索引中的事件。
**注意**  
OpenSearch Service 類型名稱可以包含任何字元 (null 位元組除外)，但開頭不得為 `_`。
若是 OpenSearch Service 6.x，每個索引僅能使用一個類型。如果您為已有其他類型的現有索引指定新類型，Firehose 會傳回執行時間錯誤。

   1. (選用) 對於 **StreamBufferingIntervalInSeconds** 和 **StreamBufferingSizeInMBs**，輸入值來設定如何緩衝傳入的事件。如果您不輸入任何值，則會使用 300 秒和 5 MB。

   1. (選用) 輸入以下其中一個 **StreamCompressionFormat** 設定來壓縮傳入的事件：
      + `GZIP`
      + `SNAPPY`
      + `UNCOMPRESSED` (default)
      + `ZIP`

   1. （選用） 對於 **StreamPrefix**，輸入字串字首以命名存放在 Amazon S3 無效字母儲存貯體中的檔案。如果您不輸入值，則不會使用字首。

   1. （選用） 對於 **StreamRetryDurationInSecons**，輸入 Firehose 無法在 OpenSearch Service 索引中為事件編製索引之案例的重試持續時間。如果您不輸入值，則會使用 300 秒。

   1. (選用) 對於 **SubscriptionFilterPolicy**，使用 JSON 格式輸入 Amazon SNS 訂閱篩選政策，以用於篩選傳入的事件。篩選政策決定哪些事件會在 OpenSearch Service 索引中編製索引。如果您不輸入值，則不會使用篩選 (所有事件都編製索引)。

   1. 選擇 **I acknowledge that this app creates custom IAM roles, resource policies and deploys nested applications. (我了解此應用程式會建立自訂 IAM 角色、資源政策及部署巢狀應用程式。)**，然後選擇 **Deploy (部署)**。

在**部署狀態*my-app 搜尋***頁面上，Lambda 會顯示**您的應用程式正在部署**狀態。

在**資源**區段中， CloudFormation 開始建立堆疊，並顯示每個資源的 **CREATE\$1IN\$1PROGRESS** 狀態。程序完成時， CloudFormation 會顯示 **CREATE\$1COMPLETE** 狀態。

當部署完成時，Lambda 會顯示 **Your application has been deployed** (您的應用程式已經完成部署) 狀態。

發佈到 Amazon SNS 主題的訊息會在由事件搜尋和分析管道佈建的 OpenSearch Service 索引中自動編製索引。如果管道無法為事件編製索引，它會將它存放在 Amazon S3 無效字母儲存貯體中。

# 使用 Amazon SNS 整合部署事件重播管道
<a name="deploy-event-replay-pipeline"></a>

本教學課程說明如何部署[事件重播管道](sns-fork-pipeline-as-subscriber.md#sns-fork-event-replay-pipeline)，並讓管道訂閱 Amazon SNS 主題。此程序會自動將與管道相關聯的 AWS SAM 範本轉換為 CloudFormation 堆疊，然後將堆疊部署到您的 AWS 帳戶。此程序還會建立和設定一組資源 (構成事件重播管道)，包括 Amazon SQS 佇列和 Lambda 函數。

如需有關篩選事件的詳細資訊，請參閱本指南中的[Amazon SNS 訂閱篩選政策](sns-subscription-filter-policies.md)。

1. 登入 [AWS Lambda 主控台](https://console.aws.amazon.com/lambda/)。

1. 在導覽面板上，選擇 **Functions (函數)**，然後選擇 **Create function (建立函數)**。

1. 在 **Create function** (建立函數) 頁面上，執行下列動作：

   1. 選擇**瀏覽無伺服器應用程式存放庫**、**公有應用程式**、**顯示建立自訂 IAM 角色或資源政策的應用程式**。

   1. 搜尋 `fork-event-replay-pipeline`，然後選擇應用程式。

1. 在 **fork-event-replay-pipeline** 頁面上，執行下列動作：

   1. 在 **Application settings (應用程式設定)** 區段中，輸入 **Application name (應用程式名稱)** (例如，`my-app-replay`)。
**注意**  
對於每個部署，應用程式名稱必須是唯一的。如果您重複使用應用程式名稱，部署只會更新先前部署的堆疊 （而不是建立新的 CloudFormation 堆疊）。

   1. (選用) 輸入下列其中之一 **LogLevel** 設置來執行應用程序的 Lambda 函數：
      + `DEBUG`
      + `ERROR`
      + `INFO` (default)
      + `WARNING`

   1. (選用) **對於 ReplayQueueRetentionPeriodInSeconds**，輸入 Amazon SQS 重播佇列保留訊息的時間量 (以秒為單位)。如果您不輸入值，則會使用 1,209,600 秒 (14 天)。

   1. 對於 **TopicArn**，輸入 Amazon SNS 主題的 ARN，表示分支管道的此執行個體將訂閱此主題。

   1. 對於 **DestinationQueueName**，輸入 Amazon SQS 佇列的名稱，供 Lambda 重播函數將訊息轉送到此佇列。

   1. (選用) 對於 **SubscriptionFilterPolicy**，使用 JSON 格式輸入 Amazon SNS 訂閱篩選政策，以用於篩選傳入的事件。篩選政策決定緩衝哪些事件來重播。如果您不輸入值，則不會使用篩選 (緩衝所有事件來重播)。

   1. 選擇 **I acknowledge that this app creates custom IAM roles, resource policies and deploys nested applications. (我了解此應用程式會建立自訂 IAM 角色、資源政策及部署巢狀應用程式。)**，然後選擇 **Deploy (部署)**。

在**部署狀態*my-app 重播***頁面上，Lambda 會顯示**您的應用程式正在部署**狀態。

在**資源**區段中， CloudFormation 開始建立堆疊，並顯示每個資源的 **CREATE\$1IN\$1PROGRESS** 狀態。程序完成時， CloudFormation 會顯示 **CREATE\$1COMPLETE** 狀態。

當部署完成時，Lambda 會顯示 **Your application has been deployed** (您的應用程式已經完成部署) 狀態。

發佈到 Amazon SNS 主題的訊息會在由事件重播管道佈建的 Amazon SQS 佇列中自動緩衝以重播。

**注意**  
在預設情況下會停用重播。若要啟用重播，請導覽到 Lambda 主控台的函數頁面，展開 **Designer** (設計工具) 區段，選擇 **SQS** 圖磚，然後在 **SQS** 區段中，選擇 **Enabled** (已啟用)。