Amazon API Gateway、Amazon SQS、および AWS Fargate でイベントを非同期的に処理する - AWS 規範ガイダンス

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

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

前提条件と制限

前提条件

制限事項

  • 同時ジョブは 1 分あたり 500 タスクに制限されます。これは、Fargate がプロビジョニングできるタスクの最大数です。

アーキテクチャ

次の図は、ジョブ API と jobs Amazon DynamoDB テーブル、イベント処理 Fargate サービス、およびエラー処理 AWS Lambda 関数とのやり取りを示しています。イベントは Amazon EventBridge イベントアーカイブに保存されます。

図に続く説明を含むアーキテクチャ図。

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

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

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

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

  4. ジョブ API は、SQS キューにメッセージを送信します。

  5. Fargate は SQS キューからメッセージをプルし、イベントを処理し、ジョブ結果を jobs DynamoDB テーブルに置きます。

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

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

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

  9. イベント処理が失敗した場合、SQS キューはイベントをデッドレターキュー (DLQ) に送信します。

  10. EventBridge イベントはエラー処理関数を開始します。

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

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

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

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

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

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

エピック

タスク説明必要なスキル

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

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

git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-sqs-cdk.git
DevOps エンジニア

プロジェクトを設定します。

ディレクトリをリポジトリルートに変更し、Projen を使用して Python 仮想環境とすべてのツールを設定します。

cd asynchronous-event-processing-api-gateway-api-gateway-sqs-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. サンプルアーキテクチャを再デプロイします。

CloudWatch Logs ロググループ /aws/ecs/EventProcessingServiceLogs が既に存在するため、サンプルアーキテクチャの破壊とその後の再デプロイは失敗します。

  1. 必要に応じてログデータを Amazon S3 へエクスポートします。

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

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

関連リソース