簡単にできるかなと思ったら意外とハマったのでメモ
やりたいこと
/test?id=aaa
にアクセスしたらaaaを返す
用意するもの
- Lambda
- API Gateway
Lambda 関数
関数名:apigateway(Python2.7)
def lambda_handler(event, context):
return {
"statusCode": 200,
"body": event['id']
}
{"id": "aaa"}
を渡したときのテスト結果は以下
{
"status": 200
"body": "aaa"
}
ここまではすごく簡単にできた
ロールは割愛しますがちゃんと設定しましょう(まだよくわかっていない)
API Gateway
- 新しいAPIの作成:API名
test
- メソッドの作成:
get
- 統合タイプ:Lambda関数
- Lambda関数:apigateway
指定できるんだ!簡単!と思っていましたが。。。
設定されたGETメソッドを選択し、クエリ文字列にid=aaaと入力しテストを実行すると
{
"stackTrace": [
[
"/var/task/lambda_function.py",
7,
"lambda_handler",
"\"body\": event['id']"
]
],
"errorType": "KeyError",
"errorMessage": "'id'"
}
おや。キーがない・・・?
解決策
API Gatewayでは値をマッピングする必要がある
GET - メソッドの実行から以下2つに設定をします
- メソッドリクエスト
- 統合リクエスト
メソッドリクエスト
URLクエリ文字列パラメータにid
というクエリ文字列を追加します
統合リクエスト
マッピングテンプレートにContent-Type:application/json
として以下のテンプレートを追加します
{
"id": "$input.params('id')"
}
結果
テストを実行
{
"body": "aaa",
"statusCode": 200
}
やったね!!!
リソースのアクションタブからAPIのデプロイを選択するとリクエストできるURLが表示されるのでidパラメータ付きでブラウザからアクセスするとjsonレスポンスが確認できます
その他
- APIデプロイ時にステージを設定できる
-
/test/aaa
でパラメータを取得したかったらリソース作成時にリソースパスに中括弧で/{id}
と指定する- その場合メソッドリクエストにはマッピングテンプレートに加え、リソースパスの追加をする