本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
與 Amazon API Gateway 和 Amazon DynamoDB Streams 非同步處理事件
由 Andrea Meroni (AWS)、Alessandro Trisolini (AWS)、Nadim Majed ()AWS、Mariem Kthiri (AWS) 和 Michael Wallner (AWS) 建立
環境:PoC 或試行 | 技術:無伺服器 | |
AWS 服務:Amazon API Gateway、Amazon DynamoDBAmazon DynamoDB Streams、AWSLambda、Amazon SNS |
Summary
Amazon API Gateway 是一項完全受管的服務,開發人員可以使用它來建立、發佈、維護、監控和保護APIs任何規模。它可處理接受和處理最多數十萬個並行API呼叫時涉及的任務。
API Gateway 的重要服務配額是整合逾時。逾時是後端服務在傳回錯誤之前必須RESTAPI傳回回應的最長時間。對於同步工作負載,通常可接受 29 秒的硬限制。但是,該限制對想要將 API Gateway 與非同步工作負載搭配使用的開發人員來說是一項挑戰。
此模式顯示使用 API Gateway、Amazon DynamoDB Streams 和 非同步處理事件的範例架構 AWS Lambda。此架構支援使用相同的輸入參數執行平行處理任務,並使用基本 RESTAPI作為介面。在此範例中,使用 Lambda 作為後端會將任務持續時間限制為 15 分鐘。您可以使用替代服務來處理傳入事件 (例如),以避免此限制 AWS Fargate。
Projen
先決條件和限制
先決條件
作用中 AWS 帳戶
您的工作站上安裝了下列工具:
AWS Cloud Development Kit (AWS CDK) 工具組 2.85.0 版或更新版本
Docker
20.10.21 版或更新版本 Node.js
第 18 版或更新版本 Projen
0.71.111 版或更新版本 Python
3.9.16 版或更新版本
限制
DynamoDB Streams 建議的讀取器數目上限為兩個,以避免限流。
任務的最長執行時間受到 Lambda 函數的最長執行時間限制 (15 分鐘)。
並行任務請求的數量上限受限於 Lambda 函數的預留並行。
架構
架構
下圖顯示任務API與 DynamoDB Streams 的互動,以及事件處理和錯誤處理 Lambda 函數的互動,以及儲存在 Amazon 事件封存中的 EventBridge 事件。
典型的工作流程包括下列步驟:
您可以對 AWS Identity and Access Management (IAM) 進行身分驗證,並取得安全憑證。
您可以將HTTP
POST
請求傳送至/jobs
任務API端點,在請求內文中指定任務參數。任務API會傳回包含任務識別符的HTTP回應。
任務會將任務參數API放入 Amazon DynamoDB
jobs_table
資料表。jobs_table
DynamoDB 資料表 DynamoDB 串流會叫用事件處理 Lambda 函數。事件處理 Lambda 函數會處理事件,然後將任務結果放入
jobs_table
DynamoDB 資料表。為了確保一致的結果,事件處理函數實作最佳化鎖定機制。您傳送HTTP
GET
請求至/jobs/{jobId}
任務API端點,並將步驟 3 的任務識別符作為{jobId}
。任務會API查詢
jobs_table
DynamoDB 資料表以擷取任務結果。任務會API傳回包含任務結果的HTTP回應。
如果事件處理失敗,事件處理函數的來源映射會將事件傳送至錯誤處理 Amazon Simple Notification Service (Amazon SNS) 主題。
錯誤處理SNS主題會非同步地將事件推送至錯誤處理函數。
錯誤處理函數會將任務參數放入
jobs_table
DynamoDB 資料表。您可以透過傳送HTTP
GET
請求至任務API端點來擷取/jobs/{jobId}
任務參數。如果錯誤處理失敗,錯誤處理函數會將事件傳送至 Amazon EventBridge 封存。
您可以使用 重播封存的事件 EventBridge。
工具
AWS 服務
AWS Cloud Development Kit (AWS CDK) 是軟體開發架構,可協助您在程式碼中定義和佈建AWS雲端基礎設施。
Amazon DynamoDB 是完全受管的無SQL資料庫服務,可提供快速、可預測且可擴展的效能。
Amazon EventBridge 是一種無伺服器事件匯流排服務,可協助您將應用程式與各種來源的即時資料連線。例如,AWSLambda 函數、使用API目的地HTTP叫用端點,或其他AWS帳戶中的事件匯流排。
AWS Lambda 是一項運算服務,可協助您執行程式碼,無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展,因此您只需支付您使用的運算時間。
Amazon Simple Notification Service (Amazon SNS) 可協助您協調和管理發佈者和用戶端之間的訊息交換,包括 Web 伺服器和電子郵件地址。
其他工具
autopep8
會根據 Python Enhancement Proposal (PEP) 8 樣式指南自動格式化 Python 程式碼。 Bandit
會掃描 Python 程式碼以尋找常見的安全問題。 Commitizen
是 Git 遞交檢查程式和 CHANGELOG
產生器。cfn-lint
是 AWS CloudFormation linter Checkov
是一種靜態程式碼分析工具,可將基礎設施檢查為程式碼 IaC),確認安全性和合規性設定錯誤。 jq
是剖析 的命令列工具JSON。 Postman
是一個API平台。 預先遞交
是 Git hooks 管理員。 Projen
是專案產生器。 pytest
是一種 Python 架構,用於撰寫小型且可讀取的測試。
程式碼儲存庫
您可以在 GitHub 使用 API Gateway 和 DynamoDB Streams 儲存庫的非同步處理
最佳實務
此範例架構不包含對已部署基礎設施的監控。如果您的使用案例需要監控,請評估新增CDK監控建構
或其他監控解決方案。 此範例架構使用 IAM 許可來控制對任務 的存取API。有權擔任 的任何人
JobsAPIInvokeRole
都可以叫用任務 API。因此,存取控制機制是二進位。如果您的使用案例需要更複雜的授權模型,請使用不同的存取控制機制 進行評估。當使用者傳送HTTP
POST
請求至/jobs
任務API端點時,輸入資料會在兩個不同的層級進行驗證:API Gateway 負責第一個請求驗證 。
事件處理函數會執行第二個請求。
當使用者向
/jobs/{jobId}
任務API端點提出HTTPGET
請求時,不會執行驗證。如果您的使用案例需要額外的輸入驗證和更高的安全性,請評估 AWS WAF 以保護您的 API。
為了避免限流,DynamoDB Streams 文件會阻止使用者從相同串流碎片中讀取超過兩個取用者。若要擴展消費者數量,建議使用 Amazon Kinesis Data Streams 。
此範例中已使用最佳化鎖定,以確保
jobs_table
DynamoDB 資料表中項目的一致更新。根據使用案例需求,您可能需要實作更可靠的鎖定機制,例如悲觀鎖定。
史詩
任務 | 描述 | 所需的技能 |
---|---|---|
複製儲存庫。 | 若要在本機複製儲存庫,請執行下列命令:
| DevOps 工程師 |
設定專案。 | 將目錄變更為儲存庫根,並使用 Projen
| DevOps 工程師 |
安裝預先認可掛鉤。 | 若要安裝預先認可掛鉤,請執行下列動作:
| DevOps 工程師 |
任務 | 描述 | 所需的技能 |
---|---|---|
Bootstrap AWS CDK。 | 若要在 AWS CDK
| AWS DevOps |
部署範例架構。 | 若要在 中部署範例架構 AWS 帳戶,請執行下列命令:
| AWS DevOps |
任務 | 描述 | 所需的技能 |
---|---|---|
安裝測試先決條件。 | 在工作站上安裝 AWS Command Line Interface (AWS CLI)、Postman 建議使用 Postman | DevOps 工程師 |
假設 | 假設
| AWS DevOps |
設定 Postman。 |
| AWS DevOps |
測試範例架構。 | 若要測試範例架構,請將請求傳送至任務 API。如需詳細資訊,請參閱 Postman 文件 | DevOps 工程師 |
故障診斷
問題 | 解決方案 |
---|---|
範例架構的銷毀和後續重新部署失敗,因為 Amazon CloudWatch Logs 日誌群組 |
|