

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

# Amazon API Gateway と AWS Lambda を使用してイベントを非同期的に処理する
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda"></a>

*Amazon Web Services、Andrea Meroni、Marime Kthiri、Nadim Majed、Michael Wallner*

## 概要
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-summary"></a>

[Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) は、開発者が API を作成、配布、保守、監視、保護するために規模に関係なく使用できるフルマネージドサービスです。最大で数十万個の同時 API コールの受け入れと処理に伴うすべてのタスクを取り扱います。

API Gateway の重要なサービスクォータは、統合タイムアウトです。このタイムアウトは、バックエンドサービスがレスポンスを返さなければならない最大時間で、その後は REST API がエラーを返します。29 秒のハードリミットは、同期ワークロードでは一般的に許容されます。ただし、この制限は、非同期ワークロードで API Gateway を使用するデベロッパーにとっての課題です。

このパターンは、API Gateway と を使用してイベントを非同期的に処理するアーキテクチャの例を示しています AWS Lambda。このアーキテクチャは、最大 15 分間の処理ジョブの実行をサポートし、インターフェイスとして基本的な REST API を使用します。

[Projen](https://pypi.org/project/projen/) は、ローカル開発環境をセットアップし、[AWS Cloud Development Kit (AWS CDK) Toolkit](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) AWS アカウント、[Docker](https://docs.docker.com/get-docker/)、[Node.js](https://nodejs.org/en/download/) と組み合わせてサンプルアーキテクチャをターゲットにデプロイするために使用されます。Projen は、[事前コミット](https://pre-commit.com/)と、コードの品質保証、セキュリティスキャン、ユニットテストに使用されるツールを使用して、[Python](https://www.python.org/downloads/) 仮想環境を自動でセットアップします。詳しくは「[ツール](#process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-tools)」セクションをご確認ください。

## 前提条件と制限事項
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-prereqs"></a>

**前提条件**
+ アクティブな AWS アカウント
+ ワークステーションにインストールされている以下のツール:
  + [AWS Cloud Development Kit (AWS CDK) ツールキット](https://docs.aws.amazon.com/cdk/v2/guide/cli.html)バージョン 2.85.0
  + [Docker](https://docs.docker.com/get-docker/) バージョン 20.10.21
  + [Node.js](https://nodejs.org/en/download/) バージョン 18.13.0
  + [Projen](https://pypi.org/project/projen/) バージョン 0.71.111
  + [Python](https://www.python.org/downloads/) バージョン 3.9.16

**制限事項**
+ ジョブの最大ランタイムは、Lambda 関数の最大ランタイム (15 分) によって制限されます。
+ 同時ジョブリクエストの最大数は、Lambda 関数の予約済み同時実行数によって制限されます。

## アーキテクチャ
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-architecture"></a>

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

![](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/e027130c-44c1-41ab-bbe9-f196a49bd9ac/images/3c437b65-48e3-477d-aeea-6ff938cc3285.png)


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

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

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

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

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

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

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

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

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

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

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

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

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

   EventBridge を使用して、アーカイブされたイベントを再生できます。

## ツール
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-tools"></a>

**AWS サービス**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) は、コードで AWS クラウド インフラストラクチャを定義およびプロビジョニングするのに役立つソフトウェア開発フレームワークです。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) は、コマンドラインシェルのコマンドを通じて AWS のサービスを操作するのに役立つオープンソースツールです。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) は、フルマネージド NoSQL データベースサービスです。高速かつ予測可能でスケーラブルなパフォーマンスを提供します。
+ 「[Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)」 は、アプリケーションをさまざまなソースのデータに接続するために支援するサーバーレスイベントバスサービスです。例えば、Lambda 関数、API 宛先を使用する HTTP 呼び出しエンドポイント、その他の AWS アカウントのイベントバスなどです。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

**その他のツール**
+ [autopep8](https://github.com/hhatto/autopep8) は、Python Enhancement Proposal (PEP) 8 スタイルガイドに基づいて自動的に Python コードをフォーマットします。
+ [Bandit](https://bandit.readthedocs.io/en/latest/) は Python コードをスキャンして、一般的なセキュリティ問題を見つけます。
+ [Commitizen](https://commitizen-tools.github.io/commitizen/) は Git コミットチェッカーと `CHANGELOG` ジェネレーターです。
+ [cfn-lint](https://github.com/aws-cloudformation/cfn-lint) は linter AWS CloudFormation です
+ [Checkov](https://github.com/bridgecrewio/checkov) は、Infrastructure as Code (IaC) のセキュリティとコンプライアンスの設定ミスをチェックする静的コード分析ツールです。
+ [jq](https://stedolan.github.io/jq/download/) は JSON を構文解析するコマンドラインツールです。
+ [Postman](https://www.postman.com/) は API プラットフォームです。
+ [事前コミット](https://pre-commit.com/)は Git フックマネージャーです。
+ [Projen](https://github.com/projen/projen) はプロジェクトジェネレーターです。
+ 「[pytest](https://docs.pytest.org/en/7.2.x/index.html)」は、小さくて読みやすいテストを書くための Python フレームワークです。

**コードリポジトリ**

このアーキテクチャコードの例は、GitHub [Asynchronous Event Processing with API Gateway and Lambda](https://github.com/aws-samples/asynchronous-event-processing-api-gateway-lambda-cdk) リポジトリにあります。

## ベストプラクティス
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-best-practices"></a>
+ この例のアーキテクチャには、デプロイされたインフラストラクチャのモニタリングは含まれません。モニタリングが必要なユースケースの場合は、[CDK モニタリングコンストラクト](https://constructs.dev/packages/cdk-monitoring-constructs)または別のモニタリングソリューションの追加を評価します。
+ このアーキテクチャ例では、[IAM アクセス許可](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html)を使用して、ジョブ API へのアクセスを制御します。`JobsAPIInvokeRole` を引き受ける権限を持つユーザーは、ジョブ API を呼び出すことができます。そのため、アクセスコントロールメカニズムはバイナリです。より複雑な認可モデルが必要なユースケースの場合は、別の[アクセスコントロールメカニズム](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html)の使用を評価します。
+ ユーザーが `/jobs` ジョブ API エンドポイントに HTTP `POST` リクエストを送信すると、入力データは 2 つの異なるレベルで検証されます。
  + Amazon API Gateway は、最初の[リクエスト検証](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-method-request-validation.html)を担当します。
  + イベント処理関数は、2 番目のリクエストを実行します。

    ユーザーが `/jobs/{jobId}` ジョブ API エンドポイントに対して HTTP `GET` リクエストを実行する場合、検証は実行されません。追加の入力検証とセキュリティレベルの向上が必要なユースケースの場合は、[AWS WAF を使用した API 保護](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html)を評価します。

## エピック
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-epics"></a>

### 環境をセットアップする
<a name="set-up-the-environment"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| リポジトリのクローン作成 | リポジトリをローカルに複製するには、次のコマンドを実行します。<pre>git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-lambda-cdk.git</pre> | DevOps エンジニア | 
| プロジェクトを設定します。 | ディレクトリをリポジトリルートに変更し、[Projen](https://github.com/projen/projen) を使用して Python 仮想環境とすべてのツールを設定します。<pre>cd asynchronous-event-processing-api-gateway-api-gateway-lambda-cdk<br />npx projen</pre> | DevOps エンジニア | 
| 事前コミットフックをインストールします。 | 事前コミットフックをインストールするには、以下を実行します。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda.html) | DevOps エンジニア | 

### サンプルアーキテクチャをデプロイする
<a name="deploy-the-example-architecture"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ブートストラップ AWS CDK。 |  AWS CDK でブートストラップするには AWS アカウント、次のコマンドを実行します。<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen bootstrap</pre> | AWS DevOps | 
| サンプルアーキテクチャをデプロイします。 | にサンプルアーキテクチャをデプロイするには AWS アカウント、次のコマンドを実行します。<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen deploy</pre> | AWS DevOps | 

### アーキテクチャをテストする
<a name="test-the-architecture"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| テストの前提条件をインストールします。 | [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)、[Postman](https://www.postman.com/downloads/)、[jq](https://jqlang.github.io/jq/) をワークステーションにインストールします。<br />[Postman](https://www.postman.com/downloads/) を使用してこのサンプルアーキテクチャをテストすることをお勧めしますが、必須ではありません。代替の API テストツールを選択する場合は、[AWS 署名バージョン 4 認証](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)に対応していることを確認し、また、[REST API をエクスポート](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html)して検査できる公開 API エンドポイントを参照してください。 | DevOps エンジニア | 
| `JobsAPIInvokeRole` を引き受けます。 | deploy コマンドから出力された `JobsAPIInvokeRole` を[引き受け](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-role.html)ます。<pre>CREDENTIALS=$(AWS_PROFILE=$<YOUR_AWS_PROFILE> aws sts assume-role \<br />--no-cli-pager \<br />--role-arn $<JOBS_API_INVOKE_ROLE_ARN> \<br />--role-session-name JobsAPIInvoke)<br />export AWS_ACCESS_KEY_ID=$(cat $CREDENTIALS | jq ‘.Credentials’’.AccessKeyId’)<br />export AWS_SECRET_ACCESS_KEY=$(cat $CREDENTIALS | jq ‘.Credentials’’.SecretAccessKey’)<br />export AWS_SESSION_TOKEN==$(cat $CREDENTIALS | jq ‘.Credentials’’.SessionToken’)</pre> | AWS DevOps | 
| Postman を設定します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda.html) | AWS DevOps | 
| サンプルアーキテクチャをテストします。 | サンプルアーキテクチャをテストするには、ジョブ API に[リクエストを送信](https://learning.postman.com/docs/sending-requests/requests/#next-steps)します。詳細については、[Postman ドキュメント](https://learning.postman.com/docs/getting-started/first-steps/sending-the-first-request/#send-an-api-request)を参照してください。 | DevOps エンジニア | 

## トラブルシューティング
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| [Amazon CloudWatch Logs ロググループ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) `/aws/apigateway/JobsAPIAccessLogs` が既に存在するため、サンプルアーキテクチャの破壊とその後の再デプロイは失敗します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda.html) | 

## 関連リソース
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-resources"></a>
+ [API Gateway マッピングテンプレートとアクセスロギング変数リファレンス](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
+ [バックエンド Lambda 関数の非同期呼び出しを設定する](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-integration-async.html)