翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon API Gateway と AWS Lambda を使用してイベントを非同期的に処理する
Amazon Web Services、Andrea Meroni、Marime Kthiri、Nadim Majed、Michael Wallner
概要
Amazon API Gateway は、開発者が API を作成、配布、保守、監視、保護するために規模に関係なく使用できるフルマネージドサービスです。最大で数十万個の同時 API コールの受け入れと処理に伴うすべてのタスクを取り扱います。
API Gateway の重要なサービスクォータは、統合タイムアウトです。このタイムアウトは、バックエンドサービスがレスポンスを返さなければならない最大時間で、その後は REST API がエラーを返します。29 秒のハードリミットは、同期ワークロードでは一般的に許容されます。ただし、この制限は、非同期ワークロードで API Gateway を使用するデベロッパーにとっての課題です。
このパターンは、API Gateway と を使用してイベントを非同期的に処理するアーキテクチャの例を示しています AWS Lambda。このアーキテクチャは、最大 15 分間の処理ジョブの実行をサポートし、インターフェイスとして基本的な REST API を使用します。
Projen
前提条件と制限事項
前提条件
アクティブな AWS アカウント
ワークステーションにインストールされている以下のツール:
AWS Cloud Development Kit (AWS CDK) ツールキットバージョン 2.85.0
Docker
バージョン 20.10.21 Node.js
バージョン 18.13.0 Projen
バージョン 0.71.111 Python
バージョン 3.9.16
制限事項
ジョブの最大ランタイムは、Lambda 関数の最大ランタイム (15 分) によって制限されます。
同時ジョブリクエストの最大数は、Lambda 関数の予約済み同時実行数によって制限されます。
アーキテクチャ
次の図は、イベント処理およびエラー処理 Lambda 関数と Amazon EventBridge イベントアーカイブに保存されたイベントとのジョブ API の相互作用を示しています。

一般的なワークフローには、以下のステップが含まれます。
AWS Identity and Access Management (IAM) に対して認証し、セキュリティ認証情報を取得します。
HTTP
POSTリクエストを/jobsジョブ API エンドポイントに送信し、リクエスト本文のジョブパラメータを指定します。API Gateway REST API であるジョブ API は、ジョブ識別子を含む HTTP レスポンスを返します。
ジョブ API は、イベント処理 Lambda 関数を非同期的に呼び出します。
イベント処理関数はイベントを処理し、ジョブ結果を Amazon DynamoDB テーブルに置きます。
ステップ 3 の
/jobs/{jobId}ジョブ識別子を{jobId}として、ジョブ API エンドポイントに HTTPGETリクエストを送信します。ジョブ API は DynamoDB
jobsテーブルにクエリを実行してジョブ結果を取得します。ジョブ API は、ジョブ結果を含む HTTP レスポンスを返します。
イベント処理が失敗した場合、イベント処理関数はイベントをエラー処理関数に送信します。
エラー処理関数は、DynamoDB
jobsテーブルにジョブパラメータを置きます。ジョブ API エンドポイントに HTTP
GETリクエストを送信することで、/jobs/{jobId}ジョブパラメータを取得できます。エラー処理が失敗した場合、エラー処理関数はイベントを EventBridge イベントアーカイブに送信します。
EventBridge を使用して、アーカイブされたイベントを再生できます。
ツール
AWS サービス
AWS Cloud Development Kit (AWS CDK) は、コードで AWS クラウド インフラストラクチャを定義およびプロビジョニングするのに役立つソフトウェア開発フレームワークです。
AWS Command Line Interface (AWS CLI) は、コマンドラインシェルのコマンドを通じて 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
は linter AWS CloudFormation です Checkov
は、Infrastructure as Code (IaC) のセキュリティとコンプライアンスの設定ミスをチェックする静的コード分析ツールです。 jq
は JSON を構文解析するコマンドラインツールです。 Postman
は API プラットフォームです。 事前コミット
は Git フックマネージャーです。 Projen
はプロジェクトジェネレーターです。 「pytest
」は、小さくて読みやすいテストを書くための Python フレームワークです。
コードリポジトリ
このアーキテクチャコードの例は、GitHub Asynchronous Event Processing with API Gateway and Lambda
ベストプラクティス
この例のアーキテクチャには、デプロイされたインフラストラクチャのモニタリングは含まれません。モニタリングが必要なユースケースの場合は、CDK モニタリングコンストラクト
または別のモニタリングソリューションの追加を評価します。 このアーキテクチャ例では、IAM アクセス許可を使用して、ジョブ API へのアクセスを制御します。
JobsAPIInvokeRoleを引き受ける権限を持つユーザーは、ジョブ API を呼び出すことができます。そのため、アクセスコントロールメカニズムはバイナリです。より複雑な認可モデルが必要なユースケースの場合は、別のアクセスコントロールメカニズムの使用を評価します。ユーザーが
/jobsジョブ API エンドポイントに HTTPPOSTリクエストを送信すると、入力データは 2 つの異なるレベルで検証されます。Amazon API Gateway は、最初のリクエスト検証を担当します。
イベント処理関数は、2 番目のリクエストを実行します。
ユーザーが
/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 エンジニア |
| deploy コマンドから出力された
| AWS DevOps |
Postman を設定します。 |
| AWS DevOps |
サンプルアーキテクチャをテストします。 | サンプルアーキテクチャをテストするには、ジョブ API にリクエストを送信 | DevOps エンジニア |
トラブルシューティング
| 問題 | ソリューション |
|---|---|
Amazon CloudWatch Logs ロググループ |
|