API Gateway 経由で SQS へメッセージを送る
API Gateway 経由で SQS へメッセージを送る:
API Gateway から Labmda 等を介さずに、直接 AWS API を呼び出しする機能です。
ドキュメントでは AWS 統合と表現されています。1
この機能を使用して、API Gateway から SQS に直接メッセージを送ってみます。
SQS キューの作成、API Gateway の API 作成を済ませておきます。
API Gateway から SQS の SendMessage API を実行するため、API Gateway の実行ロールを作成しておきます。
リファレンスを見た感じ、ミニマムにポリシーを作る場合、
サクッと試したい場合、AmazonSQSFullAccess というマネージドポリシーがあるので、それをアタッチしておきましょう。3
テキトーにリソースを作成します
テキトーにパラメーターを設定します。
設定したら「リソースの作成」ボタンをクリック
リソースに対するメソッドを作成します。
使用する SQS の API である SendMessage は POST リクエストになるので、それをパクって POST リクエストを作成しましょう。
メソッドを決めてチェックマークをクリック。
次は POST メソッドのセットアップ。
個人的に詰まったポイント。
SQS キューを作成すると
その URL に API Gateway からリクエストを送信するため、上記設定が必要になります。
API Gateway から SQS キューに対してリクエストする設定を行いましたが、まだ具体的なパラメーターをどうするのか設定していません。
ここからパラメーターを設定していきます。
まずは、メソッドリクエストから。
「メソッドリクエスト」をクリック
※ 今回はリクエストの検証を設定していないので、「必須」の隣に警告マークみたいなのが表示されます。
リクエストの検証を設定する場合にはドキュメントを参考に。4
次は統合リクエストを設定していきます。
「統合リクエスト」をクリック
URL クエリ文字列パラメーターを設定します
Action は SendMessage API を実行するのは固定なため、値は
MessageBody はクライアントからクエリ文字列で受け取った値を割り当てます。
SendMessage API に対して、どのようなパラメーター指定が必要となるかはリファレンスを確認しましょう。5
設定したメソッドが期待通りに動作するか、マネジメントコンソール上でテストします。
「テスト」をクリック。 ※ ブラウザを小さくしすぎてデザインが崩れ気味・・・
クエリ文字列だけ、下記のように指定します。
「⚡テスト」をクリック
ステータスで 200 がレスポンスされていれば OK!
下記のような出力が得られました。(長い)
レスポンス本文
レスポンスヘッダー
ログ
動作確認ができたので、次はいよいよデプロイです。
ちなみに、上記ログが API Gateway の実行ログとなります。デプロイ後はステージ毎に設定が必要です。
クライアントから受け取ったリクエスト情報や、API Gateway での変換後の情報が記載されているので、デバッグやトラブルシュートで役に立ちます。6
「アクション」をクリックし、「API のデプロイ」をクリックします。
デプロイの設定を行います。
入力したら「デプロイ」をクリック。
これで無事 API がデプロイされました。
「URL の呼び出し」に API へのアクセス URL が記載されています。
次は実際にデプロイされた API をテストしてみます。
HTTP リクエストができれば良いので、シンプルに curl を使って API を呼び出してみます。
今までの設定状況はこんな感じ。
実際にリクエストしてみましょう。
無事リクエストできているっぽいですね。
AWS CLI を使って、SQS キューからメッセージを取得してみましょう。
マネジメントコンソールからテストした際のメッセージや、curl で指定した messageBody を持つメッセージを取得できるかと思います。
作成した下記リソースを消しておきましょう。
API Gateway では、作成した API をエクスポートできます。7
今回作成した API を swagger yaml としてエクスポートした結果を記載しておきますので、構築が上手く行かなかった等あれば参考にどうぞ。
Lambda や Fargate といった汎用性の高いサーバーレスサービスを使用する機会は多いかと思いますが、それらを使わずにマネージドサービスでサーバーレス環境を構築できると嬉しいですね。
また、API Gateway + SQS の組み合わせは、以下のようなメリットがあるかなーと思います。
API Gateway は名前から結構シンプルなサービスであるイメージを受けますが、様々な機能があり奥が深いサービスですね。
この記事について
- API Gateway から SQS へメッセージを送る方法について書いた記事です。
- API Gateway の AWS Proxy を使って、SQS の SendMessage API を呼び出します。 ※ MessageBody はクエリ文字列で指定します。
- AWS Proxy を使って連携を行うため、AWS Lambda の出番はありません。
API Gateway の AWS Proxy って何?
API Gateway から Labmda 等を介さずに、直接 AWS API を呼び出しする機能です。ドキュメントでは AWS 統合と表現されています。1
この機能を使用して、API Gateway から SQS に直接メッセージを送ってみます。
構築手順
1. 事前準備
SQS キューの作成、API Gateway の API 作成を済ませておきます。API Gateway から SQS の SendMessage API を実行するため、API Gateway の実行ロールを作成しておきます。
リファレンスを見た感じ、ミニマムにポリシーを作る場合、
sqs:SendMessage を Allow するよう設定すれば良さそうですね。2サクッと試したい場合、AmazonSQSFullAccess というマネージドポリシーがあるので、それをアタッチしておきましょう。3
2. リソース作成
テキトーにリソースを作成しますテキトーにパラメーターを設定します。
| 設定項目 | 内容 |
|---|---|
| リソース名 | Messages |
| リソースパス | /messages |
設定したら「リソースの作成」ボタンをクリック
3. メソッドを作成
リソースに対するメソッドを作成します。使用する SQS の API である SendMessage は POST リクエストになるので、それをパクって POST リクエストを作成しましょう。
メソッドを決めてチェックマークをクリック。
4. メソッドの設定
次は POST メソッドのセットアップ。個人的に詰まったポイント。
| 設定項目 | 内容 | 備考 |
|---|---|---|
| 統合タイプ | AWS サービス | |
| AWS リージョン | ap-northeast-1 | 使用する SQS キューがあるリージョンを指定 |
| AWS サービス | Simple Queue Service (SQS) | API Gateway からリクエストを行う AWS サービスを選択 |
| HTTP メソッド | POST | 使用する API の Reference で確認 または、AWS CLI コマンドに --debug を付与して、出力を確認 |
| アクションの種類 | パス上書きの使用 | |
| パス上書き | 000000000000/hello-sqs | AWS アカウント ID / SQS キュー名 |
| 実行ロール | arn:aws:iam::000000000000:role/APIGatewayExecuteRole | 事前準備で作成した IAM Role の ARN |
| コンテンツの処理 | パススルー |
https://sqs.[リージョン名].amazonaws.com/[AWS アカウント ID]/[SQS キュー名] といった形式で URL が生成されます。その URL に API Gateway からリクエストを送信するため、上記設定が必要になります。
5. メソッドリクエスト、統合リクエストの設定
API Gateway から SQS キューに対してリクエストする設定を行いましたが、まだ具体的なパラメーターをどうするのか設定していません。ここからパラメーターを設定していきます。
まずは、メソッドリクエストから。
「メソッドリクエスト」をクリック
| 名前 | 必須 |
|---|---|
| messagebody | ✅ |
リクエストの検証を設定する場合にはドキュメントを参考に。4
次は統合リクエストを設定していきます。
「統合リクエスト」をクリック
URL クエリ文字列パラメーターを設定します
| 名前 | マッピング元 | 備考 |
|---|---|---|
| Action | 'SendMessage' | |
| MessageBody | method.request.querystring.messageBody |
'SendMessage' となります。MessageBody はクライアントからクエリ文字列で受け取った値を割り当てます。
SendMessage API に対して、どのようなパラメーター指定が必要となるかはリファレンスを確認しましょう。5
メソッドをテスト
設定したメソッドが期待通りに動作するか、マネジメントコンソール上でテストします。「テスト」をクリック。 ※ ブラウザを小さくしすぎてデザインが崩れ気味・・・
クエリ文字列だけ、下記のように指定します。
messageBody=sample-by-test
「⚡テスト」をクリック
ステータスで 200 がレスポンスされていれば OK!
下記のような出力が得られました。(長い)
レスポンス本文
{
"SendMessageResponse": {
"ResponseMetadata": {
"RequestId": "72c4d154-6bd4-518d-99d3-85cd0ea92a3f"
},
"SendMessageResult": {
"MD5OfMessageAttributes": null,
"MD5OfMessageBody": "266b344e1859386c47c43bf2502e9d87",
"MessageId": "283178b3-0426-4501-aa98-f3fda899bb55",
"SequenceNumber": null
}
}
}
{"X-Amzn-Trace-Id":"Root=1-5c1f633d-e97a52209ec49f5c90af34bd","Content-Type":"application/json"}
Execution log for request 7390005d-069d-11e9-82d4-530405135372
Sun Dec 23 10:28:13 UTC 2018 : Starting execution for request: 7390005d-069d-11e9-82d4-530405135372
Sun Dec 23 10:28:13 UTC 2018 : HTTP Method: POST, Resource Path: /messages
Sun Dec 23 10:28:13 UTC 2018 : Method request path: {}
Sun Dec 23 10:28:13 UTC 2018 : Method request query string: {messageBody=sample-by-test}
Sun Dec 23 10:28:13 UTC 2018 : Method request headers: {}
Sun Dec 23 10:28:13 UTC 2018 : Method request body before transformations:
Sun Dec 23 10:28:13 UTC 2018 : Endpoint request URI: https://sqs.ap-northeast-1.amazonaws.com/000000000000/hello-sqs?Action=SendMessage&MessageBody=sample-by-test
Sun Dec 23 10:28:13 UTC 2018 : Endpoint request headers: {Authorization=*****************************************************************************************************************************************************************************************************************************************e59251, X-Amz-Date=20181223T102813Z, x-amzn-apigateway-api-id=nv5czfh87a, Accept=application/json, User-Agent=AmazonAPIGateway_nv5czfh87a, X-Amz-Security-Token=AgoGb3JpZ2luEN7//////////wEaDmFwLW5vcnRoZWFzdC0xIoACHDO4wYBxissppT8Wv4s0qSjvQPfpcZMDFwA6KJA46SkxaHCpIFriU6kJcNU9tv8nyOBp7IPcE/uEOYITaEgpuVDCtkKt/kz4FEmRI0NSTDYRjRMihNzP2GM7ABx8qqz0sX0dz6DfMYnzY3BgeBuTzStL+RxY7RJ69XGpbZFNYWmQCqJcTDYfpgKEfS5EaL435fsm+dK2W73H+T5qaGSqrrt9dXzMBw2cDGZg0Eq2EmWIYfc/zQelql8Y57AmixUZCTMnAafKjLWTfsIIoKjQGit1a5gJTHKkl/WBkdvqu+xcKxbZSdeh4en3uI2dghI6b3Kh9uAnzMm4iO9WTsMkiyqKAwik//////////8BEAAaDDk5ODUwODIwMDU1OSIMiL9KQWCmDkkJ+MrKKt4CDvIhbUiHaLFv/sv5mDzyGPZZ+qA6I3wcCwrYqgay4UZMQiMIIQxwSZ9nLmhiP14v6zVzMyncXNwPi9tezC5wgB/fdqwlEe3+tQ2Ny/bNGwKItqndnnAvspBI1tcQbDVRXLR8b5 [TRUNCATED]
Sun Dec 23 10:28:13 UTC 2018 : Endpoint request body after transformations:
Sun Dec 23 10:28:13 UTC 2018 : Sending request to https://sqs.ap-northeast-1.amazonaws.com/000000000000/hello-sqs?Action=SendMessage&MessageBody=sample-by-test
Sun Dec 23 10:28:13 UTC 2018 : Received response. Integration latency: 32 ms
Sun Dec 23 10:28:13 UTC 2018 : Endpoint response body before transformations: {"SendMessageResponse":{"ResponseMetadata":{"RequestId":"72c4d154-6bd4-518d-99d3-85cd0ea92a3f"},"SendMessageResult":{"MD5OfMessageAttributes":null,"MD5OfMessageBody":"266b344e1859386c47c43bf2502e9d87","MessageId":"283178b3-0426-4501-aa98-f3fda899bb55","SequenceNumber":null}}}
Sun Dec 23 10:28:13 UTC 2018 : Endpoint response headers: {x-amzn-RequestId=72c4d154-6bd4-518d-99d3-85cd0ea92a3f, Date=Sun, 23 Dec 2018 10:28:13 GMT, Content-Type=application/json, Content-Length=276}
Sun Dec 23 10:28:13 UTC 2018 : Method response body after transformations: {"SendMessageResponse":{"ResponseMetadata":{"RequestId":"72c4d154-6bd4-518d-99d3-85cd0ea92a3f"},"SendMessageResult":{"MD5OfMessageAttributes":null,"MD5OfMessageBody":"266b344e1859386c47c43bf2502e9d87","MessageId":"283178b3-0426-4501-aa98-f3fda899bb55","SequenceNumber":null}}}
Sun Dec 23 10:28:13 UTC 2018 : Method response headers: {X-Amzn-Trace-Id=Root=1-5c1f633d-e97a52209ec49f5c90af34bd, Content-Type=application/json}
Sun Dec 23 10:28:13 UTC 2018 : Successfully completed execution
Sun Dec 23 10:28:13 UTC 2018 : Method completed with status: 200
ちなみに、上記ログが API Gateway の実行ログとなります。デプロイ後はステージ毎に設定が必要です。
クライアントから受け取ったリクエスト情報や、API Gateway での変換後の情報が記載されているので、デバッグやトラブルシュートで役に立ちます。6
API をデプロイ
「アクション」をクリックし、「API のデプロイ」をクリックします。デプロイの設定を行います。
| 設定項目 | 内容 | 備考 |
|---|---|---|
| デプロイされるステージ | [新しいステージ] | |
| ステージ名 | hello | 任意 |
| ステージの説明 | 任意 | |
| デプロイメントの説明 | 任意 |
入力したら「デプロイ」をクリック。
これで無事 API がデプロイされました。
「URL の呼び出し」に API へのアクセス URL が記載されています。
URL の呼び出し: https://nv5czfh87a.execute-api.ap-northeast-1.amazonaws.com/hello
https://[API Gateway API ID].execute-api.[リージョン名].amazonaws.com/[ステージ名] というフォーマットですね。次は実際にデプロイされた API をテストしてみます。
API をテスト
HTTP リクエストができれば良いので、シンプルに curl を使って API を呼び出してみます。今までの設定状況はこんな感じ。
| 設定項目 | 内容 |
|---|---|
| アクセス先 | https://nv5czfh87a.execute-api.ap-northeast-1.amazonaws.com/hello |
| パス | /message |
| クエリ文字列 | messageBody=sample-by-curl |
| メソッド | POST |
$ curl -X POST https://nv5czfh87a.execute-api.ap-northeast-1.amazonaws.com/hello/messages?messageBody=sample-by-curl
{"SendMessageResponse":{"ResponseMetadata":{"RequestId":"6abdd20b-6703-509d-8647-86920e8f1702"},"SendMessageResult":{"MD5OfMessageAttributes":null,"MD5OfMessageBody":"7b5d62b5e609a2e5767bf58aa408a4ac","MessageId":"1fe55fa7-fee0-4681-a5a8-6c136ade1732","SequenceNumber":null}}}
AWS CLI を使って、SQS キューからメッセージを取得してみましょう。
$ aws sqs receive-message --queue-url https://sqs.ap-northeast-1.amazonaws.com/000000000000/hello-sqs
{
"Messages": [
{
"MessageId": "83f2d4d0-91f5-415d-97e2-d3f517718f48",
"ReceiptHandle": "AQEBz8whWHFzsUx5lIJ/ICJDIH6IPmerbXNxhz9Pm4nx+D8Onm0KY/4jxNFKXsJWDeND8w2JKc6jUUMriMrumlIb88Nsqcqmjx9ARb66tMbq1b3F039V04f9SN0XwFXZvI9aCSWccgBE+LUgF6XZFSqjjwa7kPsz+5uZBFrR6fvMDcKFE/VSHvT5ylwMfgPVAkTB6iegUS721jOEqECNH7tIgNWZ93BxfG8lCaKoknHkOBp2xJftHZC4zlUwSJGmTpsHr7/sVB8//Y3uRVvuWNjjJsNsDrXVXIkqL+fEmNQ6THY6EB4Y+1UXYyg6rOizo08Ot+i5s4Kd/ya3GYm1Zsva+2QKutdmWtBPN1T75E32loBR2kks9NISMagjBuU3lA0L8J0uHQICLPiOGNHhrbmU1A==",
"MD5OfBody": "7b5d62b5e609a2e5767bf58aa408a4ac",
"Body": "sample-by-curl"
}
]
}
クリーンアップ
作成した下記リソースを消しておきましょう。- API Gateway の API
- API Gateway 実行ロールとして作成した IAM Role
- SQS キュー
今回作成した API の swagger
API Gateway では、作成した API をエクスポートできます。7今回作成した API を swagger yaml としてエクスポートした結果を記載しておきますので、構築が上手く行かなかった等あれば参考にどうぞ。
---
swagger: "2.0"
info:
version: "2018-12-23T10:40:52Z"
title: "MyAPI"
host: "nv5czfh87a.execute-api.ap-northeast-1.amazonaws.com"
basePath: "/hello"
schemes:
- "https"
paths:
/messages:
post:
produces:
- "application/json"
parameters:
- name: "messageBody"
in: "query"
required: true
type: "string"
responses:
200:
description: "200 response"
schema:
$ref: "#/definitions/Empty"
x-amazon-apigateway-integration:
credentials: "arn:aws:iam::000000000000:role/APIGatewayExecuteRole"
uri: "arn:aws:apigateway:ap-northeast-1:sqs:path/000000000000/hello-sqs"
responses:
default:
statusCode: "200"
requestParameters:
integration.request.querystring.MessageBody: "method.request.querystring.messageBody"
integration.request.querystring.Action: "'SendMessage'"
passthroughBehavior: "when_no_match"
httpMethod: "POST"
type: "aws"
definitions:
Empty:
type: "object"
title: "Empty Schema"
感想
Lambda や Fargate といった汎用性の高いサーバーレスサービスを使用する機会は多いかと思いますが、それらを使わずにマネージドサービスでサーバーレス環境を構築できると嬉しいですね。また、API Gateway + SQS の組み合わせは、以下のようなメリットがあるかなーと思います。
- SPA 等のクライアントから API の呼び出し頻度をスロットリングによって抑制できる
- 呼び出し状況を API Gateway の CloudWatch メトリクスでモニタリングできる
- 4XXError, 5XXError, Count, IntegrationLatency, Latency 等の有用なメトリクスが多くて嬉しい8
- API Gateway の実行ログを有効化することでリクエストのロギングができる
- IAM や Cognito User Pool を使用して API 呼び出し権限を制御できる
API Gateway は名前から結構シンプルなサービスであるイメージを受けますが、様々な機能があり奥が深いサービスですね。
-
AWS 統合で API Gateway API をビルドする https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/getting-started-aws-proxy.html ↩
-
Amazon SQS API のアクセス権限: アクションとリソースのリファレンス https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-api-permissions-reference.html ↩
-
Amazon SQS でのアイデンティティベース (IAM) のポリシーの使用 https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-using-identity-based-policies.html#sqs-access-policy-aws-managed-policies ↩
-
API Gateway でリクエストの検証を有効化する https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-method-request-validation.html ↩
-
SendMessage https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html ↩
-
API Gateway の API ログ作成をセットアップする https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-logging.html ↩
-
API Gateway から API をエクスポートする https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-export-api.html ↩
-
Amazon API Gateway のディメンションおよびメトリクス https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-metrics-and-dimensions.html ↩
コメント
コメントを投稿