

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

# 部署和測試 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`。