翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon API Gateway を Amazon SQS と統合して非同期 REST API を処理する
Amazon Web Services、Natalia Colantonio Favero および Gustavo Martim
概要
REST API をデプロイするときに、クライアントアプリケーションが公開できるメッセージキューの公開が必要となる場合があります。例えば、サードパーティー API のレイテンシーや応答の遅延の問題が発生したり、データベースクエリの応答時間を回避したり、同時実行 API が多数ある場合にサーバーのスケーリングを回避したりすることが必要となる場合があります。このようなシナリオでは、キューに公開するクライアントアプリケーションは、API がデータを受信したことだけを認識していればよく、データの受信後に何が起こるかを認識する必要はありません。
このパターンでは、Amazon API Gateway を使用して Amazon Simple Queue Service (Amazon SQS) にメッセージを送信することで、REST API エンドポイントを作成します。これにより、SQS キューへの直接アクセスを回避しながら、2 つのサービス間の統合を簡単に実装できるようになります。
前提条件と制限事項
アーキテクチャ
次の図は、これらのステップを示しています。
Postman などのツール、別の API、またはその他のテクノロジーを使用して、POST REST API エンドポイントをリクエストします。
API Gateway は、リクエストの本文で受信したメッセージをキューにポストします。
Amazon SQS はメッセージを受信し、成功または失敗のコードを含む応答を API Gateway に送信します。
エピック
| タスク | 説明 | 必要なスキル |
|---|
キューを作成する。 | REST API からメッセージを受信する SQS キューを作成するには: | アプリ開発者 |
| タスク | 説明 | 必要なスキル |
|---|
IAM ロールを作成します。 | この IAM ロールは、API Gateway リソースに Amazon SQS へのフルアクセスを付与します。 IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。 ナビゲーションペインで [ロール]、[ロールの作成] の順に選択します。 信頼できるエンティティタイプ で、AWS のサービス を選択します。 [ユースケース] には、ドロップダウンリストから [API Gateway] を選択し、[次へ]、[次へ] の順に選択します。 [ロール名] には、AWSGatewayRoleForSQS とオプションの説明を入力し、[ロールの作成] を選択します。 [ロール] ペインで、AWSGatewayRoleForSQS を検索して、そのチェックボックスをオンにします。 [アクセス許可ポリシー] で、[アクセス許可を追加] と [ポリシーをアタッチ] を続けて選択します。 AmazonSQSFullAccess を検索して選択します。 [Add permissions (許可の追加)] を選択します。 AWSGatewayRoleForSQS の [概要] セクションで、Amazon リソース番号 (ARN) をコピーします。この ID は、後のステップで使用します。
| アプリ開発者、AWS 管理者 |
| タスク | 説明 | 必要なスキル |
|---|
REST API を作成する | これは、HTTP リクエストが送信される REST API です。 | アプリ開発者 |
API Gateway を Amazon SQS に接続します。 | このステップにより、メッセージが HTTP リクエストの本文内から Amazon SQS に流れるようになります。 API Gateway コンソールで、作成した API を選択します。 [リソース] ページの [メソッド] セクションで、[メソッドの作成] を選択します。 [メソッドタイプ] で、[POST] を選択します。 [統合タイプ] で、AWS のサービスを選択します。 AWS リージョン については、SQS キューを作成する [リージョン] を選択します。 AWS のサービスで、[Simple Queue Service (SQS)] を選択します。 [HTTP メソッド] で、[POST] を選択します。 [アクションタイプ] で、[パス上書きの使用] を選択します。 [パスオーバーライド] に、<AWS アカウント ID>/<SQS キューの名前> を入力します。 [実行ロール] には、前に作成したロールの ARN を貼り付けます。 [メソッドの作成] を選択します。
| アプリ開発者 |
| タスク | 説明 | 必要なスキル |
|---|
REST API をテストします。 | 不足している設定がないかをチェックするテストを実行します。 API Gateway コンソールで、作成した REST API を選択します。 [リソース] ペインで、POST メソッドを選択します。 [テスト] タブを選択します。(タブが表示されない場合は、右矢印を使用します。) [リクエスト本文] に以下の JSON コードを貼り付けます。 {
"message": "lorem ipsum"
}
[テスト] を選択します。 次のようなエラーが表示されます。 <UnknownOperationException/>
| アプリ開発者 |
API 統合を変更して、リクエストを Amazon SQS に適切に転送します。 | 統合エラーを修正するには、設定を完了します。 API Gateway コンソールで、作成した API を選択し、POST を選択します。 [メソッドの実行] セクションには、API Gateway と Amazon SQS 間の視覚的なマッピングが表示されます。このセクションから、[統合リクエスト]、[編集] の順に選択します。 [HTTP ヘッダー] セクションを展開し、[リクエストヘッダーのパラメータを追加] を選択します。 [マッピングテンプレート] セクションを展開します。 [マッピングテンプレートの追加] を選択します。 [コンテンツタイプ] には、application/json を入力します。 [テンプレート本文] に、このコードを貼り付けます。 Action=SendMessage&MessageBody=$input.body
[保存] を選択します。
| アプリ開発者 |
Amazon SQS でメッセージをテストして検証します。 | テストを実行し、テストが正常に完了したことを確認します。 API Gateway コンソールで、作成した REST API を選択します。 [リソース] ペインで、POST メソッドを選択します。 [テスト] タブを選択します。(タブが表示されない場合は、右矢印を使用します。) [リクエスト本文] に以下の JSON コードを貼り付けます。 {
"message": "lorem ipsum"
}
[テスト] を選択します。 Amazon SQS コンソールを開きます。 ナビゲーションペインで、[キュー] を選択してから、対象のキューを選択します。 [メッセージの送信と受信] を選択します。 メッセージをポーリングを選択します。 [メッセージ] を選択します。次のように表示されます。 Body { "message": "lorem ipsum" }
| アプリ開発者 |
特殊文字を使用して API Gateway をテストします。 | メッセージでは許容されない特殊文字 (& など) を含むテストを実行します。 API Gateway コンソールで、API を選択します。 次の JSON コードを使用して、前のステップのテストを繰り返します。 {
"message": "lorem ipsum &"
}
[テスト] を選択します。 次のようなエラーが表示されます。 {
"Error": {
"Code": "AccessDenied",
"Message": "Access to the resource https://sqs.us-east-2.amazonaws.com/976166761794/Apg2 is denied.",
"Type": "Sender"
},
"RequestId": "e83c9c67-bcf6-5e9a-91e9-c737094b17ab"
}
This is because special characters aren't supported by default in the message body. 次のステップでは、特殊文字をサポートするように API Gateway を設定します。コンテンツタイプの変換の詳細については、「API Gateway ドキュメント」を参照してください。 | アプリ開発者 |
特殊文字をサポートするように API 設定を変更します。 | メッセージ内の特殊文字を許容するように設定を調整します。 API Gateway コンソールで、作成した API を選択し、POST を選択します。 [統合リクエスト]、[編集] の順に選択します。 [コンテンツの処理] を [テキストに変換] に変更します。 [マッピングテンプレート] セクションで、以下を行います。 [コンテンツタイプ] には、application/json を入力します。 [テンプレート本文] は、以下のように指定します。 Action=SendMessage&MessageBody=$util.urlEncode($input.body)
[保存] を選択します。
[テスト] タブを選択します。 [リクエスト本文] には、前述の JSON コードを入力します。 {
" message": "lorem ipsum &" }
[テスト] を選択します。 Amazon SQS コンソールを開きます。 キューを選択し、前と同じように [メッセージを送受信]、[メッセージをポーリング]、[メッセージ] の順に選択します。
新しいメッセージには特殊文字を含める必要があります。 | アプリ開発者 |
| タスク | 説明 | 必要なスキル |
|---|
API をデプロイします。 | REST API をデプロイするには、以下を行います。 | アプリ開発者 |
外部ツールを使用してテストします。 | 外部ツールを使用してテストを実行し、メッセージが正常に受信されたことを確認します。 Postman、Insomnia、cURL などのツールを開きます。 API を実行します。 Amazon SQS コンソールを開きます。 対象のキューを選択します。 メッセージをロードして新しいメッセージを表示します。
| アプリ開発者 |
| タスク | 説明 | 必要なスキル |
|---|
API を削除します。 | API Gateway コンソールで、作成した API を選択し、[削除] を選択します。 | アプリ開発者 |
IAM ロールを削除します。 | IAM コンソールの [ロール] ペインで、AWSGatewayRoleForSQS を選択し、[削除] を選択します。 | アプリ開発者 |
SQS キューを削除します。 | Amazon SQS コンソールの [キュー] ペインで、作成した SQS キューを選択し、[削除] を選択します。 | アプリ開発者 |
関連リソース