【SQS】API GateWay経由でSQSにJSONデータをPOSTするまで
JSONをPOSTする記事が何気に少なかったのでメモ
SQS作成
既にdevというキューが作成されているので今回はlocalというキューを作成します。(標準キー)
名前をきめたら、「キューのクイック作成」を押して完了。
SQSのメッセージ保持期間(デフォルトで4日)などを変更したい場合は、「キューの設定」から設定する。
以下のように、一覧に「local」が追加されたら、キューの追加は完了です。
詳細→URLが、SQSのエンドポイントになります。
API Gatewayの作成
API Gatewayダッシュボードの左メニューから、APIを選択し、「APIの作成」ボタンを押して、SQS用のAPI を新規作成します。
API 名をつけて、「API の作成ボタン」を押す。(プロトコルはREST)
①左メニューAPIから作成した「local」→「リソース」を選択する。
②リソースの「/」をクリックして、③「アクション」セレクトBOX→リソースの作成
URLでも使用するリソースパスを入力します。(今回はpower)
※URL名ですが、https://エンドポイント/リソース名 となるわけではなく、ステージにデプロイした後は、
以下の画像のように、https://エンドポイント/ステージ名/リソース名となるので注意が必要です。
リソースの作成が完了したら、リソース「/power」を選択し、アクション→メソッドの作成を押して・・、
POSTメソッドを作成していきます。
今回はSQSへのPOSTのため、以下のように設定します。
凄くわかりにくかったのが、「アクションの種類」という部分で、こちらは、SQSのURLを指定する必要があります。
SQS キューを作成すると
https://sqs.【リージョン】.amazonaws.com/【アカウント ID】/【SQS キュー名】
という形でURL が作成されます。(SQS作成の最後に詳細→URLで確認したもの)
なので、まずは、「アクションの種類」で「パスの上書きの使用」を選択し、パス上書きに、AWS アカウント ID / SQS キュー名を入力します。
続いて、実行ロールは、IAMのロール ARNを入力します。
IAMは、API Gateway から SQS の SendMessage API を実行するため、API Gateway の実行ロールを作成しておきます。SQSにキューを送信するだけなら、sqs:SendMessage を AllowしておけばOKです。
メソッドリクエスト、統合リクエストの設定
クライアントからの必須パラメーターや、HTTP リクエストヘッダーを設定したい場合は、メソッドリクエストを設定します。今回はクライアントから受け取ったJSONをそのままSQSへ送りたいだけなので、統合リクエストのみ設定します(JSON自体の処理はWebアプリ側で処理)
まず、
HTTPヘッダーにContest-Type=’application/x-www-form-urlencoded’を指定します。
次に、マッピングテンプレートにて、「テンプレートが定義されていない場合 (推奨)」を選択し、Content-Type=’application/json’を追加し、テンプレートを
1 |
Action=SendMessage&MessageBody=$util.urlEncode($input.body) |
のように、編集します。
メソッドのテスト
設定が完了したので、左上の「テスト」をクリックして送信画面へ移動します。
リクエスト本文に適当なJSONを書いて、テストボタンを押します。
レスポンス本文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "SendMessageResponse": { "ResponseMetadata": { "RequestId": "eefe7cd2-4cd4-54d7-a9c0-2ad5f33a58b3" }, "SendMessageResult": { "MD5OfMessageAttributes": null, "MD5OfMessageBody": "sadf3ad9b08fab67231bb7dd2964ed3b", "MD5OfMessageSystemAttributes": null, "MessageId": "7rfsa7d06-cd11-4b0saf2-0dfeb0-919e6c7bbdcf", "SequenceNumber": null } } } |
実際にSQSへキューが届いているかどうかも確認します。
SQS一覧から今回の送信先「local」を選択→「キュー操作」→メッセージの表示/削除を選択
メッセージの「ポーリングを開始」ボタンを押して先程テスト送信したJSONが届いていればOKです。
ちなみに、統合リクエストのマッピングテンプレートにて、Content-Type=’application/json’用のテンプレートを
1 |
Action=SendMessage&MessageBody=$util.urlEncode($input.body) |
と、書きましたが、これを、
1 |
Action=SendMessage&MessageBody=$input.body |
のように、$input.bodyをURLエンコードしない形で記入してしまうと、「+」などのプラス記号が、空白になってしまったりするので注意が必要です。
テストが完了したら、APIをデプロイして公開します。
API のデプロイ
アクション→APIのデプロイを選択
新しいステージ「local」を作成して、デプロイします。繰り返しになりますが、URL名は、
https://エンドポイント/ステージ名/リソース名
という形式になります。
左メニューのAPI→local→ステージから、無事 API が公開されていることを確認します。
「URL の呼び出し」に API へのアクセス URL が記載されています。
URLは、
https://【APIのID】.execute-api.【リージョン】.amazonaws.com/【ステージ名】/【リソース名】
という形になります。
メソッド上で API キーを要求するようにする
このままですと、誰でもアクセスができるAPIとなってしまうので、作成したPOSTメソッドへリクエストする際、ヘッダにX-API-Keyをつけないと、アクセスできないようにします。
まず、「メソッドリクエスト」の設定から、「APIキーの必要性」をtrueにします。
続いて、①左メニューから「APIキー」を選択→②「アクション」から「APIキーの作成」を選択、③APIキーを指定して保存する。(APIキーは自動生成、カスタムどちらもいけます。)
ここからわかりにくいのですが、APIキーをメソッドに紐付けるためには、まず、使用量プランを作成する必要があります。
①左メニューの「使用量プラン」→②「作成」→③使用プランの名前や、制限事項を設定して「次へ」
「関連つけられたAPIステージ」で、デプロイしたAPIのステージを追加
「APIキーを使用量プランに追加」ボタンから、先ほど作成したAPIキーを追加する
メニュー→APIキーで、先ほど作成したAPIキー「local」を選択して、使用量プランが紐付いていることが確認できればOK
デプロイしたAPIのテスト
これでようやく、APIが完成しました。
curlで実際にリクエストしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
curl \ -i \ -X POST -d '{"message": { "test": { "plus_mark_test": "test+++test", "int_test": 12, "jp_test": 'こんにちわ', "time_test": "2019-05-01T00:00:00+09:00", "few": 141.12305166666664, } }}' \ -H "Content-Type: application/json" \ -H "X-API-Key:【設定したAPIキー】" \ https://【APIのID】.execute-api.【リージョン】.amazonaws.com/【ステージ名】/【リソース名】 |
SQSに届いていればOK
————————-
この記事がお役に立てたら、是非シェアをお願いします^^