教學課程:使用 WebSocket API、Lambda 和 DynamoDB 建置無伺服器聊天應用程式 - Amazon API Gateway

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

教學課程:使用 WebSocket API、Lambda 和 DynamoDB 建置無伺服器聊天應用程式

在本教學課程中,您將使用 WebSocket API 建立無伺服器聊天應用程式。使用 WebSocket API,您可以支持客戶端之間的雙向通信。客户端無需輪詢來進行更新即可以接收訊息。

本教學課程需要約 30 分鐘的時間完成。首先,您將使用 AWS CloudFormation 範本建立可處理 API 請求的 Lambda 函數,以及用來儲存用戶端 ID 的 DynamoDB 資料表。然後,您將使用 API Gateway 主控台建立與 Lambda 函數整合的 WebSocket API。最後,您將測試 API 以確認是否能傳送和接收訊息。


      您在本教學課程中所建立 API 的架構概觀。用戶端會連線到您的 API Gateway  WebSocket  API。API 路由叫用 Lambda 函數,其用於處理客户端之間的訊息並從 DynamoDB 獲取連線訊息。

若要完成本教學課程,您需要一個 AWS 帳戶和具有主控台存取權限的 AWS Identity and Access Management 使用者。如需詳細資訊,請參閱 開始使用 API Gateway 的必要條件

您還需要 wscat 來連線到 API。如需詳細資訊,請參閱 使用 wscat 以連接到 WebSocket API 和將訊息傳送到其中

步驟 1:建立 Lambda 函數和 DynamoDB 資料表

下載並解壓縮的應用程式建立範本。 AWS CloudFormation您將使用此範本建立 Amazon DynamoDB 資料表,以存放您應用程式的用户端 ID。每個連線的用户端都有一個唯一 ID,我們將使用它作為資料表的分區索引鍵。此範本也建立 Lambda 函數,其用於更新 DynamoDB 中的客户端連線並處理傳送給連線客户端的訊息。

建立 AWS CloudFormation 堆疊的步驟
  1. 請在以下位置開啟 AWS CloudFormation 主控台。 https://console.aws.amazon.com/cloudformation

  2. 選擇 Create stack (建立堆疊),然後選擇 With new resources (standard) (使用新資源 (標準))

  3. 對於 Specify template (指定範本),選擇 Upload a template file (上傳範本檔案)

  4. 選取您下載的範本。

  5. 選擇 Next (下一步)。

  6. 針對 Stack name (堆疊名稱),輸入 websocket-api-chat-app-tutorial,然後選擇 Next (下一步)

  7. 針對 Configure stack options (設定堆疊選項),選擇 Next (下一步)

  8. 對於功能,請確認 AWS CloudFormation 可以在您的帳戶中建立 IAM 資源。

  9. 選擇建立堆疊

AWS CloudFormation 規定範本中指定的資源。完成資源佈建可能需要幾分鐘的時間。當 AWS CloudFormation 堆疊的狀態為「建立 _ 完成」時,您就可以繼續進行下一個步驟。

步驟 2:建立 WebSocket API

您將建立 WebSocket API 來處理用戶端連線,並將請求路由到您在步驟 1 中建立的 Lambda 函數。

若要建立 WebSocket API
  1. 在以下網址登入 API Gateway 主控台:https://console.aws.amazon.com/apigateway

  2. 選擇 Create API (建立 API)。然後對於 WebSocket API,選擇構建

  3. 對於 API name (API 名稱),輸入 websocket-chat-app-tutorial

  4. 對於 Route selection expression (路由選擇表達式),輸入 request.body.action。路由選取表達式用於決定當用戶端傳送訊息時 API Gateway 要叫用的路由。

  5. 選擇下一步

  6. 對於 Predefined routes (預先定義路由),選擇 Add $connect (新增 $connect)Add $disconnect (新增 $disconnect),以及 Add $default (新增 $default)$connect$disconnect 路由是 API Gateway 在用户端連線到 API 或中斷連線時自動叫用的特殊路由。當沒有其他路由與請求相符時,API Gateway 會叫用 $default 路由。

  7. 對於 Custom routes (自訂路由),選擇 Add custom route (新增自訂路由)。對於 Route key (路由金鑰),輸入 sendmessage。此自定義路由會處理傳送到已連線用户端的訊息。

  8. 選擇下一步

  9. Attach integrations (連接整合) 下,為每個路由和 Integration type (整合類型) 選擇 Lambda。

    對於 Lambda,請選擇您 AWS CloudFormation 在步驟 1 中建立的對應 Lambda 函數。每個函數的名稱會與一個路由相符。例如,對於 $connect 路由,選擇名為 websocket-chat-app-tutorial-ConnectHandler 的函數。

  10. 檢閱 API Gateway 為您建立的階段。依預設,API Gateway 會建立階段名稱 production,並自動將您的 API 部署到該階段。選擇下一步

  11. 選擇 Create and deploy (建立和部署)

步驟 3:測試您的 API

接著,您將測試您的 API 以確保其正常工作。若要連接至 API,請使用 wscat 命令。

取得 URL 來叫用您的 API
  1. 在以下網址登入 API Gateway 主控台:https://console.aws.amazon.com/apigateway

  2. 選擇您的 API。

  3. 選擇 Stages (階段),然後選擇 production (產品)

  4. 請記下您的 API WebSocket 網址。URL 看起來應該會像這樣:wss://abcdef123.execute-api.us-east-2.amazonaws.com/production

連線到您的 API
  1. 使用下列命令來連線到 API。當您連線到 API 時,API Gateway 會叫用 $connect 路由。當叫用此路由時,該路由會叫用可將連線 ID 存放在 DynamoDB 中的 Lambda 函數。

    wscat -c wss://abcdef123.execute-api.us-west-2.amazonaws.com/production
    Connected (press CTRL+C to quit)
  2. 開啟新的終端機並使用下列參數再次執行 wscat 命令。

    wscat -c wss://abcdef123.execute-api.us-west-2.amazonaws.com/production
    Connected (press CTRL+C to quit)

    這將為您提供兩個可交換訊息的已連線用户端。

傳送訊息
  • API Gateway 根據 API 的路由選擇表達式確定要叫用的路由。您的 API 的路由選擇表達式是 $request.body.action。因此,當您傳送以下訊息時 API Gateway 會叫用 sendmessage 路由:

    {"action": "sendmessage", "message": "hello, everyone!"}

    與叫用路由相關聯的 Lambda 函數會從 DynamoDB 收集用户端 ID。然後,該函數會叫用 API Gateway Management API 並將訊息傳送到這些用户端。所有連線的用户端都會收到下列訊息:

    < hello, everyone!
叫用您 API 的 $default 路由
  • 當用户端傳送與您定義路由不相符的訊息時,API Gateway 會叫用 API 的預設路由。與 $default 路由相關聯的 Lambda 函數會使用 API Gateway Management API 傳送其連線相關的用户端資訊。

    test
    Use the sendmessage route to send a message. Your info: {"ConnectedAt":"2022-01-25T18:50:04.673Z","Identity":{"SourceIp":"192.0.2.1","UserAgent":null},"LastActiveAt":"2022-01-25T18:50:07.642Z","connectionID":"Mg_ugfpqPHcCIVA="}
中斷與 API 的連線
  • 若要中斷與 API 的連線,請按 CTRL+C。當用户端從 API 中斷連線時,API Gateway 會叫用您 API 的 $disconnect 路由。您 API 的 $disconnect 路由 Lambda 整合會從 DynamoDB 中移除連線 ID。

步驟 4:清理

若要避免不必要的成本,請刪除您在此教學課程中建立的資源。下列步驟會刪除您的 AWS CloudFormation 堆疊和 WebSocket API。

若要刪除 WebSocket API
  1. 在以下網址登入 API Gateway 主控台:https://console.aws.amazon.com/apigateway

  2. APIs (API) 頁面上,選取 websocket-chat-app-tutorial API。依次選擇 Actions (動作)Delete (刪除),然後確認您的選擇。

刪除 AWS CloudFormation 堆疊的步驟
  1. 請在以下位置開啟 AWS CloudFormation 主控台。 https://console.aws.amazon.com/cloudformation

  2. 選取您的 AWS CloudFormation 堆疊。

  3. 選擇刪除,然後確認您的選擇。

後續步驟:自動化 AWS CloudFormation

您可以自動建立和清理本自學課程中涉及的所有 AWS 資源。如需建立此 API 和所有相關資源的 AWS CloudFormation 範本,請參閱聊天應用程式 .yaml。