選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

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

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

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

與 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 用於設定本機開發環境,並將範例架構部署到目標 AWS 帳戶,並結合 AWS Cloud Development Kit (AWS CDK) ToolkitDockerNode.js。Projen 會自動設定 Python 虛擬環境,其中包含預先遞交,以及用於程式碼品質保證、安全掃描和單元測試的工具。如需詳細資訊,請參閱工具一節。

先決條件和限制

先決條件

限制

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

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

架構

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

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

AWS 雲端 architecture diagram showing user interaction with jobs API and event processing flow.
  1. 您可以對 AWS Identity and Access Management (IAM) 進行身分驗證,並取得安全登入資料。

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

  3. 任務 API 是 API Gateway REST API,會傳回包含任務識別符的 HTTP 回應給您。

  4. 任務 API 會以非同步方式叫用事件處理 Lambda 函數。

  5. 事件處理函數會處理事件,然後將任務結果放入任務 Amazon DynamoDB 資料表

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

  7. 任務 API 會查詢 jobs DynamoDB 資料表來擷取任務結果。

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

  9. 如果事件處理失敗,事件處理函數會將事件傳送至錯誤處理函數。

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

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

  12. 如果錯誤處理失敗,錯誤處理函數會將事件傳送至 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 端點提出 HTTP GET請求時,不會執行驗證。如果您的使用案例需要額外的輸入驗證和更高的安全性,請使用 AWS WAF 評估 來保護您的 API

史詩

任務描述所需的技能

複製儲存庫。

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

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

設定專案。

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

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

安裝預先遞交掛鉤。

若要安裝預先遞交勾點,請執行下列動作:

  1. 啟用 Python 虛擬環境

    source .env/bin/activate
  2. 安裝預先遞交掛鉤:

    pre-commit install pre-commit install --hook-type commit-msg
DevOps 工程師

設定環境

任務描述所需的技能

複製儲存庫。

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

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

設定專案。

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

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

安裝預先遞交掛鉤。

若要安裝預先遞交勾點,請執行下列動作:

  1. 啟用 Python 虛擬環境

    source .env/bin/activate
  2. 安裝預先遞交掛鉤:

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

引導 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 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)Postmanjq

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

DevOps 工程師

假設 JobsAPIInvokeRole

假設JobsAPIInvokeRole從部署命令列印為輸出的 :

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。

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

  2. 使用下列值設定JobsAPI變數:

    • accessKeyassume-role來自命令的Credentials.AccessKeyId屬性值

    • baseUrl ‒ 部署命令JobsApiJobsAPIEndpoint輸出的值,不含尾斜線

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

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

    • secretKeyassume-role來自命令的Credentials.SecretAccessKey屬性值

    • sessionTokenassume-role來自命令的Credentials.SessionToken屬性值

AWS DevOps

測試範例架構。

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

DevOps 工程師

測試架構

任務描述所需的技能

安裝測試先決條件。

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

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

DevOps 工程師

假設 JobsAPIInvokeRole

假設JobsAPIInvokeRole從部署命令列印為輸出的 :

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。

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

  2. 使用下列值設定JobsAPI變數:

    • accessKeyassume-role來自命令的Credentials.AccessKeyId屬性值

    • baseUrl ‒ 部署命令JobsApiJobsAPIEndpoint輸出的值,不含尾斜線

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

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

    • secretKeyassume-role來自命令的Credentials.SecretAccessKey屬性值

    • sessionTokenassume-role來自命令的Credentials.SessionToken屬性值

AWS DevOps

測試範例架構。

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

DevOps 工程師

故障診斷

問題解決方案

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

  1. 如有必要,請將您的日誌資料匯出至 Amazon S3

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

  3. 重新部署範例架構。

相關資源

隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。