【SQS】API GateWay経由でSQSにJSONデータをPOSTするまで


JSONをPOSTする記事が何気に少なかったのでメモ

 

SQS作成

左上の「新しいキューの作成」ボタンから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’を追加し、テンプレートを

のように、編集します。

 

メソッドのテスト

設定が完了したので、左上の「テスト」をクリックして送信画面へ移動します。

 

リクエスト本文に適当なJSONを書いて、テストボタンを押します。

以下のような結果(ステータス200)が返ってくれば成功です。
リクエスト/power
ステータス: 200
レーテンシー: 85 ms

レスポンス本文

実際にSQSへキューが届いているかどうかも確認します。

SQS一覧から今回の送信先「local」を選択→「キュー操作」→メッセージの表示/削除を選択

 

メッセージの「ポーリングを開始」ボタンを押して先程テスト送信したJSONが届いていればOKです。

 

ちなみに、統合リクエストのマッピングテンプレートにて、Content-Type=’application/json’用のテンプレートを

と、書きましたが、これを、

のように、$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で実際にリクエストしてみます。

SQSに届いていればOK

 

 

 

————————-

この記事がお役に立てたら、是非シェアをお願いします^^