本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
與 Amazon API Gateway 和 AWS Lambda 非同步處理事件
由 Andrea Meroni (AWS)、Nadim Majed (AWS)、Mariem Kthiri (AWS) 和 Michael Wallner (AWS) 建立
Summary
Amazon API Gateway 是一項全受管服務,開發人員可以使用它來建立、發佈、維護、監控和保護任何規模APIs。它會處理接受和處理最多數十萬個並行 API 呼叫時涉及的任務。
API Gateway 的一項重要服務配額是整合逾時。逾時是 REST API 傳回錯誤之前,後端服務必須傳回回應的最大時間。對於同步工作負載,通常可接受 29 秒的硬性限制。不過,該限制對想要將 API Gateway 與非同步工作負載搭配使用的開發人員來說是一項挑戰。
此模式顯示使用 API Gateway 和 非同步處理事件的範例架構 AWS Lambda。此架構支援執行長達 15 分鐘的處理任務,並使用基本 REST API 做為界面。
Projen
先決條件和限制
先決條件
限制
任務的最大執行時間受限於 Lambda 函數的最大執行時間 (15 分鐘)。
並行任務請求的數量上限受限於 Lambda 函數的預留並行。
架構
下圖顯示任務 API 與事件處理和錯誤處理 Lambda 函數的互動,以及存放在 Amazon EventBridge 事件封存中的事件。
典型的工作流程包括下列步驟:

您可以對 AWS Identity and Access Management (IAM) 進行身分驗證,並取得安全登入資料。
您可以將 HTTP
POST
請求傳送至/jobs
任務 API 端點,在請求內文中指定任務參數。任務 API 是 API Gateway REST API,會傳回包含任務識別符的 HTTP 回應給您。
任務 API 會以非同步方式叫用事件處理 Lambda 函數。
事件處理函數會處理事件,然後將任務結果放入任務 Amazon DynamoDB 資料表
您傳送 HTTP
GET
請求至/jobs/{jobId}
任務 API 端點,並將步驟 3 的任務識別符做為{jobId}
。任務 API 會查詢
jobs
DynamoDB 資料表來擷取任務結果。任務 API 會傳回包含任務結果的 HTTP 回應。
如果事件處理失敗,事件處理函數會將事件傳送至錯誤處理函數。
錯誤處理函數會將任務參數放入
jobs
DynamoDB 資料表。您可以透過傳送 HTTP
GET
請求至任務 API 端點來擷取/jobs/{jobId}
任務參數。如果錯誤處理失敗,錯誤處理函數會將事件傳送至 EventBridge 事件封存。
您可以使用 EventBridge 重新播放封存的事件。
工具
AWS 服務
AWS Cloud Development Kit (AWS CDK) 是一種軟體開發架構,可協助您在程式碼中定義和佈建 AWS 雲端 基礎設施。
AWS Command Line Interface (AWS CLI) 是一種開放原始碼工具,可協助您透過命令列 shell 中的命令與 AWS 服務互動。
Amazon DynamoDB 是一項全受管 NoSQL 資料庫服務,可提供快速、可預期且可擴展的效能。
Amazon EventBridge 是一種無伺服器事件匯流排服務,可協助您將應用程式與來自各種來源的即時資料連線。例如,Lambda 函數、使用 API 目的地的 HTTP 呼叫端點,或其他事件匯流排 AWS 帳戶。
AWS Lambda 是一項運算服務,可協助您執行程式碼,無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展,因此您只需支付您使用的運算時間。
其他工具
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 和 Lambda
最佳實務
此範例架構不包含對部署基礎設施的監控。如果您的使用案例需要監控,請評估新增 CDK 監控建構
或其他監控解決方案。 此範例架構使用 IAM 許可來控制對任務 API 的存取。有權擔任 的任何人
JobsAPIInvokeRole
都可以叫用任務 API。因此,存取控制機制是二進位。如果您的使用案例需要更複雜的授權模型,請使用不同的存取控制機制進行評估。當使用者傳送 HTTP
POST
請求到/jobs
任務 API 端點時,輸入資料會在兩個不同的層級進行驗證:Amazon API Gateway 負責第一個請求驗證。
事件處理函數會執行第二個請求。
當使用者對
/jobs/{jobId}
任務 API 端點提出 HTTPGET
請求時,不會執行驗證。如果您的使用案例需要額外的輸入驗證和更高的安全性,請使用 AWS WAF 評估 來保護您的 API。
史詩
任務 | 描述 | 所需的技能 |
---|---|---|
複製儲存庫。 | 若要在本機複製儲存庫,請執行下列命令:
| DevOps 工程師 |
設定專案。 | 使用 Projen
| DevOps 工程師 |
安裝預先遞交掛鉤。 | 若要安裝預先遞交勾點,請執行下列動作:
| DevOps 工程師 |
任務 | 描述 | 所需的技能 |
---|---|---|
引導 AWS CDK。 | 若要在 AWS CDK 中引導 AWS 帳戶,請執行下列命令:
| AWS DevOps |
部署範例架構。 | 若要在 中部署範例架構 AWS 帳戶,請執行下列命令:
| AWS DevOps |
任務 | 描述 | 所需的技能 |
---|---|---|
安裝測試先決條件。 | 在工作站上安裝 AWS Command Line Interface (AWS CLI)、Postman 建議使用 Postman | DevOps 工程師 |
假設 | 假設
| AWS DevOps |
設定 Postman。 |
| AWS DevOps |
測試範例架構。 | 若要測試範例架構,請將請求傳送至 | DevOps 工程師 |
故障診斷
問題 | 解決方案 |
---|---|
範例架構的銷毀和後續重新部署失敗,因為 Amazon CloudWatch Logs 日誌群組 |
|