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

一般的なワークフローには、以下のステップが含まれます。
AWS Identity and Access Management (IAM) に対して認証し、セキュリティ認証情報を取得します。
HTTP
POSTリクエストを/jobsジョブ API エンドポイントに送信し、リクエスト本文のジョブパラメータを指定します。API Gateway REST API であるジョブ API は、ジョブ識別子を含む HTTP レスポンスを返します。
ジョブ API は、SQS キューにメッセージを送信します。
Fargate は SQS キューからメッセージをプルし、イベントを処理し、ジョブ結果を
jobsDynamoDB テーブルに置きます。ステップ 3 の
/jobs/{jobId}ジョブ識別子を{jobId}として、ジョブ API エンドポイントに HTTPGETリクエストを送信します。ジョブ API は DynamoDB
jobsテーブルにクエリを実行してジョブ結果を取得します。ジョブ API は、ジョブ結果を含む HTTP レスポンスを返します。
イベント処理が失敗した場合、SQS キューはイベントをデッドレターキュー (DLQ) に送信します。
EventBridge イベントはエラー処理関数を開始します。
エラー処理関数は、DynamoDB
jobsテーブルにジョブパラメータを置きます。ジョブ API エンドポイントに HTTP
GETリクエストを送信することで、/jobs/{jobId}ジョブパラメータを取得できます。エラー処理が失敗した場合、エラー処理関数はイベントを EventBridge アーカイブに送信します。
EventBridge を使用して、アーカイブされたイベントを再生できます。
ツール
AWS サービス
AWS Cloud Development Kit (AWS CDK) は、コードで AWS クラウド インフラストラクチャを定義およびプロビジョニングするのに役立つソフトウェア開発フレームワークです。
Amazon DynamoDB は、フルマネージド NoSQL データベースサービスです。高速かつ予測可能でスケーラブルなパフォーマンスを提供します。
AWS Fargate を使用すると、サーバーや Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを管理する必要なくコンテナを実行できます。Amazon Elastic Container Service (Amazon ECS) と組み合わせて使用されます。
Amazon EventBridge は、アプリケーションをさまざまなソースのリアルタイムデータに接続できるようにするサーバーレスイベントバスサービスです。例えば、Lambda 関数、API 宛先を使用する HTTP 呼び出しエンドポイント、その他の AWS アカウントのイベントバスなどです。
AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。
「Amazon Simple Queue Service (Amazon SQS) 」は、安全で耐久性があり、配信ソフトウェアシステムとコンポーネントを統合および分離できる利用可能なホスト型キューを提供します。
その他のツール
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 Processing with API Gateway and SQS
ベストプラクティス
この例のアーキテクチャには、デプロイされたインフラストラクチャのモニタリングは含まれません。モニタリングが必要なユースケースの場合は、CDK モニタリングコンストラクト
または別のモニタリングソリューションの追加を評価します。 このアーキテクチャ例では、IAM アクセス許可を使用して、ジョブ API へのアクセスを制御します。
JobsAPIInvokeRoleを引き受ける権限を持つユーザーは、ジョブ API を呼び出すことができます。そのため、アクセスコントロールメカニズムはバイナリです。より複雑な認可モデルが必要なユースケースの場合は、別のアクセスコントロールメカニズムの使用を評価します。ユーザーが
/jobsジョブ API エンドポイントに HTTPPOSTリクエストを送信すると、入力データは 2 つの異なるレベルで検証されます。API Gateway は、最初のリクエスト検証を担当します。
イベント処理関数は、2 番目のリクエストを実行します。
ユーザーが
/jobs/{jobId}ジョブ API エンドポイントに対して HTTPGETリクエストを実行する場合、検証は実行されません。ユースケースで追加の入力検証とセキュリティレベルの向上が必要な場合は、 AWS WAF を使用して API を保護します。
エピック
| タスク | 説明 | 必要なスキル |
|---|---|---|
リポジトリのクローン作成 | リポジトリをローカルに複製するには、次のコマンドを実行します。
| DevOps エンジニア |
プロジェクトを設定します。 | ディレクトリをリポジトリルートに変更し、Projen
| DevOps エンジニア |
事前コミットフックをインストールします。 | 事前コミットフックをインストールするには、以下を実行します。
| DevOps エンジニア |
| タスク | 説明 | 必要なスキル |
|---|---|---|
ブートストラップ 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 ロググループ |
|
CloudWatch Logs ロググループ |
|