Amazon API Gateway と Amazon DynamoDB Streams を使用してイベントを非同期的に処理する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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) ToolkitDockerNode.js と組み合わせてサンプルアーキテクチャをターゲットにデプロイするために使用されます。Projen は、事前コミットと、コードの品質保証、セキュリティスキャン、ユニットテストに使用されるツールを使用して、Python 仮想環境を自動でセットアップします。詳しくは「ツール」セクションをご確認ください。

前提条件と制限事項

前提条件

制限事項

  • スロットリングを避けるため、DynamoDB Streams の推奨最大リーダー数は 2 です。

  • ジョブの最大ランタイムは、Lambda 関数の最大ランタイム (15 分) によって制限されます。

  • 同時ジョブリクエストの最大数は、Lambda 関数の予約済み同時実行数によって制限されます。

アーキテクチャ

アーキテクチャ

次の図は、Amazon EventBridge イベントアーカイブに保存されたイベントと、DynamoDB Streams およびイベント処理とエラー処理の Lambda 関数とのジョブ API の相互作用を示しています。

アーキテクチャとプロセスの図 (図の後にステップがリストされています)。

一般的なワークフローには、以下のステップが含まれます。

  1. AWS Identity and Access Management (IAM) に対して認証し、セキュリティ認証情報を取得します。

  2. HTTP POST リクエストを /jobs ジョブ API エンドポイントに送信し、リクエスト本文のジョブパラメータを指定します。

  3. ジョブ API は、ジョブ識別子を含む HTTP レスポンスを返します。

  4. ジョブ API は、ジョブパラメータを jobs_table Amazon DynamoDB テーブルに置きます。

  5. jobs_table DynamoDB テーブルの DynamoDB ストリームは、イベント処理 Lambda 関数を呼び出します。

  6. イベント処理 Lambda 関数はイベントを処理し、ジョブ結果を DynamoDB jobs_table テーブルに置きします。一貫した結果を確保するために、イベント処理関数は楽観的ロックメカニズムを実装します。

  7. ステップ 3 の /jobs/{jobId} ジョブ識別子を {jobId} として、ジョブ API エンドポイントに HTTP GET リクエストを送信します。

  8. ジョブ API は DynamoDB jobs_table テーブルにクエリを実行してジョブ結果を取得します。

  9. ジョブ API は、ジョブ結果を含む HTTP レスポンスを返します。

  10. イベント処理が失敗した場合、イベント処理関数のソースマッピングは、エラー処理を行う Amazon Simple Notification Service (Amazon SNS) トピックにイベントを送信します。

  11. エラー処理 SNS トピックは、イベントをエラー処理関数に非同期的にプッシュします。

  12. エラー処理関数は、DynamoDB jobs_table テーブルにジョブパラメータを置きます。

    ジョブ API エンドポイントに HTTP GET リクエストを送信することで、/jobs/{jobId} ジョブパラメータを取得できます。

  13. エラー処理が失敗した場合、エラー処理関数はイベントを 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 エンドポイントに HTTP POST リクエストを送信すると、入力データは 2 つの異なるレベルで検証されます。

    • API Gateway は、最初のリクエスト検証を担当します。

    • イベント処理関数は、2 番目のリクエストを実行します。

      ユーザーが /jobs/{jobId} ジョブ API エンドポイントに対して HTTP GET リクエストを実行する場合、検証は実行されません。ユースケースで追加の入力検証とセキュリティレベルの向上が必要な場合は、 AWS WAF を使用して API を保護します

  • スロットリングを避けるために、DynamoDB Streams ドキュメントでは、ユーザーが同じストリームのシャードから 3 つ以上のコンシューマーで読み取ることを推奨していません。コンシューマーの数をスケールアウトするため、Amazon Kinesis Data Streams を使用することをお勧めします。

  • この例では、DynamoDB jobs_table テーブル内の項目の一貫した更新を確保するために、楽観的ロックが使用されています。ユースケースの要件によっては、悲観的ロックなど、より信頼性の高いロックメカニズムを実装する必要がある場合があります。

エピック

タスク説明必要なスキル

リポジトリのクローン作成

リポジトリをローカルに複製するには、次のコマンドを実行します。

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 エンジニア
タスク説明必要なスキル

ブートストラップ 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 署名バージョン 4 認証をサポートしていることを確認し、また、REST API をエクスポートして検査できる公開 API エンドポイントを参照してください。

DevOps エンジニア

JobsAPIInvokeRole を引き受けます。

deploy コマンドから出力された 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 を設定します。

  • リポジトリに含まれている Postman コレクションをインポートするには、Postman ドキュメントの指示に従います。

  • JobsAPI 変数を次の値で設定します。

    • accessKeyassume-role コマンドからの Credentials.AccessKeyId の属性値。

    • baseUrl ‒ 末尾にスラッシュがない、deploy コマンドからの 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 Simple Storage Service (Amazon S3) にエクスポートします

  2. CloudWatch Logs ロググループ /aws/apigateway/JobsAPIAccessLogs を削除します。

  3. サンプルアーキテクチャを再デプロイします。

関連リソース