こんにちは。しゃっくです。
今回はAWSのLambdaにクエリストリングを渡してみます。
Lambda関数作成からLambda関数をCURLコマンドで呼ぶところまでやっていきます。
全体の流れと要点
- AWS Lambda作成
- AWS API Gateway作成と設定
- デプロイ
- CURLコマンドで実行
API Gatewayでリソース作成する際に、「Lambdaプロキシ統合の使用」にチェックすることでクエリストリングをイイ感じに処理してくれるようになります。
プロキシ統合を使用しない場合は、マッピングテンプレートの設定が必要なようです。(今回プロキシ統合しないパターンは試していません)
プロキシ統合することでLambda側では「queryStringParameters」というキーで渡ってきます。
あと、僕はCURLコマンドの実行で2時間くらいハマりました。
CURLのリンクはダブルコートで囲わないとなのですね・・・
囲ってないがために2つめのパラメータが渡されず、ひたすらにハマりました。
初学者丸出しです。。。
みなさんもご注意ください。
開発環境
- Node.js
- AWS API Gateway
- AWS Lambda
Lambda作成
AWS Lambdaで「関数の作成」
関数名を「testQueryString」、ランタイムは今回は「Node.js」に設定し、他はデフォルトのまま「関数の作成」実行
Lambda関数がとりあえずできました。
続いて、Lambda関数のコードソースを変更します。
デフォルトのソースのままでもクエリストリングは渡せますが、確認しやすいように変更しています。
exports.handler = async (event) => {
console.log(event);
const {queryStringParameters} = event;
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify(`param1:${queryStringParameters.param1} param2:${queryStringParameters.param2}`),
};
return response;
};
変更点としては
・API Gatewayから「queryStringParameters」のキーで渡されるので、そこから「param1」「param2」を取り出して、返却するようにしています。
・API Gatewayから渡ってきたeventの内容をCloud Watchで見れるようにconsole出力しています。
API Gateway作成と設定
流れ
API Gatewayは以下のような手順で作成します。
- API Gateway作成
- リソースの作成
- メソッドの作成
API Gateway作成
API Gatewayで「APIを作成」
「REST API」で「構築」
API名に「testQueryString-apigateway」を設定し、他はデフォルトのまま「APIの作成」
リソースの設定
続いてリソースを作成します。
「アクション」から「リソースの作成」
リソース名に「 testQueryString-apigateway 」を設定し、他はデフォルトのまま「リソースの作成」
リソースが作成できました。
メソッドの作成
続いて、メソッドを作成します。
「アクション」から「メソッドの作成」
「GET」メソッドを選択しチェックマークをクリック
Lambdaプロキシ統合の使用をチェック、Lambda関数に先ほど作成したLambda関数を設定します。
「Lambdaプロキシ統合の使用」にチェックをつけるのが大事なので忘れずに!!
権限追加のダイアログが表示されるので「OK」クリック
これで全てのAPI Gatewayの設定が完了しました。
デプロイ
流れ
デプロイでは以下を実施します。
- API Gatewayからのデプロイ
- Lambdaからのデプロイ
※API GatewayとLambdaのデプロイの違いがよくわかっていないのですが、どちらからもデプロイしないと動きませんでした。
API Gatewayからのデプロイ
API Gatewayで「アクション」から「APIのデプロイ」
デプロイされるステージで「新しいステージ」を選択すると、ステージ名を入力するテキストボックスが表示されるので、「dev」と設定
デプロイされました。
Lambdaからのデプロイ
Lamdaで「Deploy」をクリック
デプロイ完了
CURLコマンドで実行
以下のコマンドを実行します。
curl -X GET "https://XXXXXXXX/dev/testquerystring-apigateway?param1=test1¶m2=test2"
ここでURLをダブルコートで囲わないとエラーとなりますのでご注意ください!!(2つ目のパラメータが渡らずエラーとなる)
実行結果は以下のようになります。
C:\Users\shakku>curl -X GET "https://XXXXXXXX/dev/testquerystring-apigateway?param1=test1¶m2=test2"
"param1:test1 param2:test2"
きちんとパラメータが渡せています。
まとめ
プロキシ統合を設定することで、簡単にクエリストリングが渡せました。