與 Amazon API Gateway 和 Amazon DynamoDB Streams 非同步處理事件 - AWS 方案指引

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

與 Amazon API Gateway 和 Amazon DynamoDB Streams 非同步處理事件

由 Andrea Meroni (AWS)、Alessandro Trisolini (AWS)、Nadim Majed ()AWS、Mariem Kthiri (AWS) 和 Michael Wallner (AWS) 建立

程式碼儲存庫:使用 API Gateway 和 DynamoDB Streams 進行非同步處理

環境: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) ToolkitDockerNode.js 將範例架構部署至目標 。Projen 會自動設定 Python 虛擬環境,其中包含預先認可,以及用於程式碼品質保證、安全掃描和單元測試的工具。如需詳細資訊,請參閱工具一節。

先決條件和限制

先決條件

限制

  • DynamoDB Streams 建議的讀取器數目上限為兩個,以避免限流。

  • 任務的最長執行時間受到 Lambda 函數的最長執行時間限制 (15 分鐘)。

  • 並行任務請求的數量上限受限於 Lambda 函數的預留並行。

架構

架構

下圖顯示任務API與 DynamoDB Streams 的互動,以及事件處理和錯誤處理 Lambda 函數的互動,以及儲存在 Amazon 事件封存中的 EventBridge 事件。

架構和程序的圖表,步驟列於圖表之後。

典型的工作流程包括下列步驟:

  1. 您可以對 AWS Identity and Access Management (IAM) 進行身分驗證,並取得安全憑證。

  2. 您可以將HTTPPOST請求傳送至/jobs任務API端點,在請求內文中指定任務參數。

  3. 任務API會傳回包含任務識別符的HTTP回應。

  4. 任務會將任務參數API放入 Amazon DynamoDB jobs_table 資料表。

  5. jobs_table DynamoDB 資料表 DynamoDB 串流會叫用事件處理 Lambda 函數。

  6. 事件處理 Lambda 函數會處理事件,然後將任務結果放入 jobs_table DynamoDB 資料表。為了確保一致的結果,事件處理函數實作最佳化鎖定機制。

  7. 您傳送HTTPGET請求至/jobs/{jobId}任務API端點,並將步驟 3 的任務識別符作為 {jobId}

  8. 任務會API查詢 jobs_table DynamoDB 資料表以擷取任務結果。

  9. 任務會API傳回包含任務結果的HTTP回應。

  10. 如果事件處理失敗,事件處理函數的來源映射會將事件傳送至錯誤處理 Amazon Simple Notification Service (Amazon SNS) 主題。

  11. 錯誤處理SNS主題會非同步地將事件推送至錯誤處理函數。

  12. 錯誤處理函數會將任務參數放入 jobs_table DynamoDB 資料表。

    您可以透過傳送HTTPGET請求至任務API端點來擷取/jobs/{jobId}任務參數。

  13. 如果錯誤處理失敗,錯誤處理函數會將事件傳送至 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。因此,存取控制機制是二進位。如果您的使用案例需要更複雜的授權模型,請使用不同的存取控制機制 進行評估。

  • 當使用者傳送HTTPPOST請求至/jobs任務API端點時,輸入資料會在兩個不同的層級進行驗證:

    • API Gateway 負責第一個請求驗證

    • 事件處理函數會執行第二個請求。

      當使用者向/jobs/{jobId}任務API端點提出HTTPGET請求時,不會執行驗證。如果您的使用案例需要額外的輸入驗證和更高的安全性,請評估 AWS WAF 以保護您的 API

  • 為了避免限流,DynamoDB Streams 文件會阻止使用者從相同串流碎片中讀取超過兩個取用者。若要擴展消費者數量,建議使用 Amazon Kinesis Data Streams

  • 此範例中已使用最佳化鎖定,以確保 jobs_table DynamoDB 資料表中項目的一致更新。根據使用案例需求,您可能需要實作更可靠的鎖定機制,例如悲觀鎖定。

史詩

任務描述所需的技能

複製儲存庫。

若要在本機複製儲存庫,請執行下列命令:

git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-dynamodb-streams-cdk.git
DevOps 工程師

設定專案。

將目錄變更為儲存庫根,並使用 Projen 設定 Python 虛擬環境和所有工具:

cd asynchronous-event-processing-api-gateway-api-gateway-dynamodb-streams-cdk npx projen
DevOps 工程師

安裝預先認可掛鉤。

若要安裝預先認可掛鉤,請執行下列動作:

  1. 啟用 Python 虛擬環境

    source .env/bin/activate
  2. 安裝預先認可掛鉤:

    pre-commit install pre-commit install --hook-type commit-msg
DevOps 工程師
任務描述所需的技能

Bootstrap AWS CDK。

若要在 AWS CDK中啟動, AWS 帳戶請執行下列命令:

AWS_PROFILE=$YOUR_AWS_PROFILE npx projen bootstrap
AWS DevOps

部署範例架構。

若要在 中部署範例架構 AWS 帳戶,請執行下列命令:

AWS_PROFILE=$YOUR_AWS_PROFILE npx projen deploy
AWS DevOps
任務描述所需的技能

安裝測試先決條件。

在工作站上安裝 AWS Command Line Interface (AWS CLI)Postman jq

建議使用 Postman 來測試此範例架構,但不是強制性的。如果您選擇替代API測試工具,請確定它支援 AWS Signature 第 4 版身分驗證 ,並參考可透過匯出 REST API來檢查的公開API端點。

DevOps 工程師

假設 JobsAPIInvokeRole

假設JobsAPIInvokeRoledeploy 命令列印為輸出的 :

CREDENTIALS=$(AWS_PROFILE=$<YOUR_AWS_PROFILE> aws sts assume-role \ --no-cli-pager \ --role-arn $<JOBS_API_INVOKE_ROLE_ARN> \ --role-session-name JobsAPIInvoke) export AWS_ACCESS_KEY_ID=$(cat $CREDENTIALS | jq ‘.Credentials’’.AccessKeyId’) export AWS_SECRET_ACCESS_KEY=$(cat $CREDENTIALS | jq ‘.Credentials’’.SecretAccessKey’) export AWS_SESSION_TOKEN==$(cat $CREDENTIALS | jq ‘.Credentials’’.SessionToken’)
AWS DevOps

設定 Postman。

  • 若要匯入包含在儲存庫中的 Postman 集合,請遵循 Postman 文件 中的指示。

  • 使用下列值設定JobsAPI變數

    • accessKey ‒ 來自 assume-role命令的Credentials.AccessKeyId屬性值。

    • baseUrl ‒ 來自deploy命令的JobsApiJobsAPIEndpoint輸出值,沒有尾斜線。

    • region ‒ 部署範例架構 AWS 區域 的 值。

    • seconds ‒ 範例任務的輸入參數值。它必須是正整數。

    • secretKey ‒ 來自 Credentials.SecretAccessKey assume-role命令的屬性值。

    • sessionToken ‒ 來自 assume-role命令的Credentials.SessionToken屬性值。

AWS DevOps

測試範例架構。

若要測試範例架構,請將請求傳送至任務 API。如需詳細資訊,請參閱 Postman 文件

DevOps 工程師

故障診斷

問題解決方案

範例架構的銷毀和後續重新部署失敗,因為 Amazon CloudWatch Logs 日誌群組/aws/apigateway/JobsAPIAccessLogs已存在。

  1. 如有必要,請將日誌資料匯出至 Amazon Simple Storage Service (Amazon S3)

  2. 刪除 CloudWatch 日誌日誌群組 /aws/apigateway/JobsAPIAccessLogs

  3. 重新部署範例架構。

相關資源