LoginSignup
9
5

More than 1 year has passed since last update.

API Gateway から SQS に連携してみた

Posted at

はじめに

API Gateway には、AWS Service の Integrate 機能があります。例えば、フロントエンドから API Gateway を通じて SQS にデータを格納した場合、API Gateway → Lambda → SQS という構成が考えられます。この構成でも問題はないのですが、よりシンプルに API Gateway → SQS といった形で直接 SQS にデータを格納できます。シンプルなアーキテクチャにすることで、より堅牢で安定したサービス提供に貢献できるメリットがあります。

今回の記事では、直接 API Gateway → SQS へデータを格納する構築手順を確認してみましょう。

IAM Role の作成

まず、API Gateway に設定する IAM Role を作成していきます。IAM Role の作成画面で API Gateway を選択します。

image-20220109203906856.png

そのまま Next を押します。

image-20220109203951127.png

また Next を押します。

image-20220109204014227.png

Role Name を入力して Create Role を押します。

image-20220109204057045.png

Add inline policy を押します。

image-20220109204148857.png

入力するポリシーは次のものを入れます。SQS へ SendMessage を出来るようにします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sqs:SendMessage",
            "Resource": "*"
        }
    ]
}

image-20220109204303602.png

Create を押して、IAM Role を作成します。

image-20220109204456215.png

作成した IAM Role ARN は後ほど使うので、メモっておきます。

arn:aws:iam::xxxxxxxxxxxx:role/apigateway-sqs-test-role

SQS キューの作成

次に SQS キューを作成します。

image-20220109203006331.png

パラメータを入力

  • type : standard
  • 名前

image-20220109203105915.png

Default のまま

image-20220109203150834.png

作成した IAM Role を指定して、API Gateway からこの Queue にデータを格納できるように指定

image-20220109204701368.png

そのほかは Default のまま Create を押します。

image-20220109204749508.png

SQS キューが作成されました。

image-20220109205714591.png

API Gateway の作成

API Gateway を作成していきます。

image-20220109205938302.png

REST API を選びます。

image-20220109210010618.png

API Gateway の名前を入れます。

apigateway-sqs-test

image-20220109210106723.png

API Gateway の編集画面で、 Create Resource を押します。

image-20220109211136417.png

適当な名前で Create を押します。

image-20220109211222531.png

作成したリソースに対して、Create Method を押します。

image-20220109211244697.png

今回は POST を選択します。

image-20220109211308274.png

パラメータを入れます。

  • Integration Type : AWS Service を選ぶ
  • AWS Service : SQS を選択
  • Path override : [AWSアカウントID/SQSキューの名前] を入力

image-20220109212000482.png

Path Override に何を入力するべきか調べる方法を説明します。今回の記事は、SQS にデータを格納する SendMessage API を使っていくため、次の APO Reference Document を参照します。
https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html#API_SendMessage_Examples

この Document に、SendMessage を実行するSample が書かれています。この Sample の中に、123456789012/MyQueue と記載されていますが、この部分を Path Override で入力しています。SQS の場合は今回の記事の内容で問題ないですが、他のサービスの場合は、そのサービスに合わせた文字列を入力する必要があるので、適宜調べていきましょう。

image-20220109214540727.png

設定後、 Integration Request を選びます。

image-20220109212212040.png

HTTP Headers に次のパラメータを入れます。

Content-Type
'application/x-www-form-urlencoded'

image-20220109212333851.png

Mapping Templates の add を押します。

image-20220109212537626.png

application/json を入れます。

image-20220109212607675.png

Mapping Template の値に、次の文字列を入れます。

  • Action : SQS で sendMessage の API を使う
  • MessageBody : $input.body を指定。API Gateway に渡された Body を、そのまま SQS に格納する
Action=SendMessage&MessageBody=$input.body

image-20220109214821261.png

この Mapping Template に入力する文字列ですが、該当する API の Document を見ながら組み立てることが出来ます。
https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html

この Document に Sample があり、URL クエリーパラメータが載っています。この中に、Action=SendMessage だとか、MessageBody=this+is と書かれています。この部分を Mapping Template として文字列を組み立てていきます。

image-20220109214736958.png

API Gateway で TEST

ここまで設定すると、TEST が出来ます。TEST をクリックします。

image-20220109213046130.png

Request Body に次の文字列を入れます。ここに入れた文字列が SQS に格納されます。

{
    "data" : "test"
}

image-20220109214934913.png

Test を押して、実際に SQS にデータを格納します。

image-20220109214953803.png

Response が 200 になります。

image-20220109215049510.png

SQS側でデータを確認していきましょう。SQS キューの画面で Send and receive messages を押します。

image-20220109215306508.png

Poll for messages を押して、SQS 上のメッセージを受信します。

image-20220109215325865.png

画像はいくつかのメッセージが表示されていますが、複数回 TEST しているためです。どれか適当に選びます。

image-20220109215355562.png

Body に、テストで入力した文字列が表示されていることが確認できます。

image-20220109215413422.png

API Gateway Deploy

API Gateway で Deploy API を押して、実行できるようにしていきます。

image-20220109215518922.png

適当に名前を入れて Deploy を押します。

image-20220109220212956.png

Deploy 完了です。Invoke URL が生成されています。

image-20220109220244343.png

curl で TEST

これで外部から REST API 経由で SQS にデータを格納できるようになりました。今回は、curl コマンドでやっていきます。

curl -s -H 'Content-Type:application/json' \
-X POST \
https://uuy6eahto0.execute-api.ap-northeast-1.amazonaws.com/prod/sqs-queue \
-d '{"test1":"data1", "test2":"data2"}'

実行例

> curl -s -H 'Content-Type:application/json' \
      -X POST \
      https://uuy6eahto0.execute-api.ap-northeast-1.amazonaws.com/prod/sqs-queue \
      -d '{"test1":"data1", "test2":"data2"}' | jq .
{
  "SendMessageResponse": {
    "ResponseMetadata": {
      "RequestId": "4d17bbed-9166-5b96-adf1-e1b94eb7c5e4"
    },
    "SendMessageResult": {
      "MD5OfMessageAttributes": null,
      "MD5OfMessageBody": "58fdfbfc48f868b6b9c50b3e8aa09894",
      "MD5OfMessageSystemAttributes": null,
      "MessageId": "c21a633e-d8dc-4b0e-9f33-7b2b2d7595f9",
      "SequenceNumber": null
    }
  }
}

実行した結果を SQS 上でも確認できます。

image-20220109220631049.png

curl で与えた body が確認できました。

image-20220109220642981.png

検証を通じてわかったこと

  • API Gateway で AWS Service Integrate をした時に、どういった API を呼びだすのか指定するのが、Mapping Template
  • Mapping Template の指定は、各サービスの API Reference を参照しながら埋めていくのがわかりやすい

参考URL

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5