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

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

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

前提条件と制限事項

前提条件

制限事項

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

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

アーキテクチャ

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

AWS クラウド architecture showing user interaction with jobs API, Lambda functions, and EventBridge.

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

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

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

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

  4. ジョブ API は、イベント処理 Lambda 関数を非同期的に呼び出します。

  5. イベント処理関数はイベントを処理し、ジョブ結果を Amazon DynamoDB テーブルに置きます。

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

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

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

  9. イベント処理が失敗した場合、イベント処理関数はイベントをエラー処理関数に送信します。

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

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

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

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

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

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

エピック

タスク説明必要なスキル

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

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

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

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

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

cd asynchronous-event-processing-api-gateway-api-gateway-lambda-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 を設定します。

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

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

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

    • baseUrl ‒ 末尾にスラッシュがない、デプロイコマンドからの 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 S3 へエクスポートします。

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

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

関連リソース