翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon API Gateway と Amazon DynamoDB Streams を使用してイベントを非同期的に処理する
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 DynamoDB Streams、および を使用してイベントを非同期的に処理するためのアーキテクチャの例を示しています AWS Lambda。このアーキテクチャは、同じ入力パラメータを使用した並列処理ジョブの実行をサポートし、インターフェイスとして基本的な REST API を使用します。この例では、Lambda をバックエンドとして使用すると、ジョブの期間は 15 分に制限されます。この制限を回避するには、代替サービスを使用して受信イベント (例:) を処理します AWS Fargate。
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 以降
制限事項
スロットリングを避けるため、DynamoDB Streams の推奨最大リーダー数は 2 です。
ジョブの最大ランタイムは、Lambda 関数の最大ランタイム (15 分) によって制限されます。
同時ジョブリクエストの最大数は、Lambda 関数の予約済み同時実行数によって制限されます。
アーキテクチャ
アーキテクチャ
次の図は、Amazon EventBridge イベントアーカイブに保存されたイベントと、DynamoDB Streams およびイベント処理とエラー処理の Lambda 関数とのジョブ API の相互作用を示しています。

一般的なワークフローには、以下のステップが含まれます。
AWS Identity and Access Management (IAM) に対して認証し、セキュリティ認証情報を取得します。
HTTP
POSTリクエストを/jobsジョブ API エンドポイントに送信し、リクエスト本文のジョブパラメータを指定します。ジョブ API は、ジョブ識別子を含む HTTP レスポンスを返します。
ジョブ API は、ジョブパラメータを
jobs_tableAmazon DynamoDB テーブルに置きます。jobs_tableDynamoDB テーブルの DynamoDB ストリームは、イベント処理 Lambda 関数を呼び出します。イベント処理 Lambda 関数はイベントを処理し、ジョブ結果を DynamoDB
jobs_tableテーブルに置きします。一貫した結果を確保するために、イベント処理関数は楽観的ロックメカニズムを実装します。ステップ 3 の
/jobs/{jobId}ジョブ識別子を{jobId}として、ジョブ API エンドポイントに HTTPGETリクエストを送信します。ジョブ API は DynamoDB
jobs_tableテーブルにクエリを実行してジョブ結果を取得します。ジョブ API は、ジョブ結果を含む HTTP レスポンスを返します。
イベント処理が失敗した場合、イベント処理関数のソースマッピングは、エラー処理を行う Amazon Simple Notification Service (Amazon SNS) トピックにイベントを送信します。
エラー処理 SNS トピックは、イベントをエラー処理関数に非同期的にプッシュします。
エラー処理関数は、DynamoDB
jobs_tableテーブルにジョブパラメータを置きます。ジョブ API エンドポイントに HTTP
GETリクエストを送信することで、/jobs/{jobId}ジョブパラメータを取得できます。エラー処理が失敗した場合、エラー処理関数はイベントを Amazon EventBridge アーカイブに送信します。
EventBridge を使用して、アーカイブされたイベントを再生できます。
ツール
AWS サービス
AWS Cloud Development Kit (AWS CDK) は、AWS クラウドインフラストラクチャをコードで定義して割り当てるのに役立つソフトウェア開発フレームワークです。
Amazon DynamoDB は、フルマネージド NoSQL データベースサービスです。高速かつ予測可能でスケーラブルなパフォーマンスを提供します。
「Amazon EventBridge」 は、アプリケーションをさまざまなソースのデータに接続するために支援するサーバーレスイベントバスサービスです。たとえば、AWS Lambda 関数、API 宛先を使用する HTTP 呼び出しエンドポイント、または他の AWS アカウントのイベントバスなどです。
AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。
「Amazon Simple Notification Service (Amazon SNS)」は、ウェブサーバーやメールアドレスなど、パブリッシャーとクライアント間のメッセージの交換を調整および管理するのに役立ちます。
その他のツール
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 DynamoDB Streams
ベストプラクティス
この例のアーキテクチャには、デプロイされたインフラストラクチャのモニタリングは含まれません。モニタリングが必要なユースケースの場合は、CDK モニタリングコンストラクト
または別のモニタリングソリューションの追加を評価します。 このアーキテクチャ例では、IAM アクセス許可を使用して、ジョブ API へのアクセスを制御します。
JobsAPIInvokeRoleを引き受ける権限を持つユーザーは、ジョブ API を呼び出すことができます。そのため、アクセスコントロールメカニズムはバイナリです。より複雑な認可モデルが必要なユースケースの場合は、別のアクセスコントロールメカニズムの使用を評価します。ユーザーが
/jobsジョブ API エンドポイントに HTTPPOSTリクエストを送信すると、入力データは 2 つの異なるレベルで検証されます。API Gateway は、最初のリクエスト検証を担当します。
イベント処理関数は、2 番目のリクエストを実行します。
ユーザーが
/jobs/{jobId}ジョブ API エンドポイントに対して HTTPGETリクエストを実行する場合、検証は実行されません。ユースケースで追加の入力検証とセキュリティレベルの向上が必要な場合は、 AWS WAF を使用して API を保護します。
スロットリングを避けるために、DynamoDB Streams ドキュメントでは、ユーザーが同じストリームのシャードから 3 つ以上のコンシューマーで読み取ることを推奨していません。コンシューマーの数をスケールアウトするため、Amazon Kinesis Data Streams を使用することをお勧めします。
この例では、DynamoDB
jobs_tableテーブル内の項目の一貫した更新を確保するために、楽観的ロックが使用されています。ユースケースの要件によっては、悲観的ロックなど、より信頼性の高いロックメカニズムを実装する必要がある場合があります。
エピック
| タスク | 説明 | 必要なスキル |
|---|---|---|
リポジトリのクローン作成 | リポジトリをローカルに複製するには、次のコマンドを実行します。
| 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 ロググループ |
|