1. hashimoto048

    Posted

    hashimoto048
Changes in title
+LambdaにAPI Gatewayから値を渡す
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,98 @@
+簡単にできるかなと思ったら意外とハマったのでメモ
+
+## やりたいこと
+`/test?id=aaa`にアクセスしたらaaaを返す
+
+## 用意するもの
+- Lambda
+- API Gateway
+
+### Lambda 関数
+関数名:apigateway(Python2.7)
+
+```python
+def lambda_handler(event, context):
+ return {
+ "statusCode": 200,
+ "body": event['id']
+ }
+```
+
+`{"id": "aaa"}`を渡したときのテスト結果は以下
+
+```json
+{
+ "status": 200
+ "body": "aaa"
+}
+```
+
+ここまではすごく簡単にできた
+
+ロールは割愛しますがちゃんと設定しましょう(まだよくわかっていない)
+
+### API Gateway
+- 新しいAPIの作成:API名`test`
+- メソッドの作成:`get`
+- 統合タイプ:Lambda関数
+- Lambda関数:apigateway
+
+指定できるんだ!簡単!と思っていましたが。。。
+
+設定されたGETメソッドを選択し、クエリ文字列にid=aaaと入力しテストを実行すると
+
+```json
+{
+ "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`として以下のテンプレートを追加します
+
+```json
+{
+ "id": "$input.params('id')"
+}
+```
+
+## 結果
+テストを実行
+
+```json
+{
+ "body": "aaa",
+ "statusCode": 200
+}
+```
+
+やったね!!!
+
+リソースのアクションタブからAPIのデプロイを選択するとリクエストできるURLが表示されるのでidパラメータ付きでブラウザからアクセスするとjsonレスポンスが確認できます
+
+## その他
+- APIデプロイ時にステージを設定できる
+- `/test/aaa`でパラメータを取得したかったらリソース作成時にリソースパスに中括弧で`/{id}`と指定する
+ - その場合メソッドリクエストにはマッピングテンプレートに加え、リソースパスの追加をする