LoginSignup
18
14

More than 5 years have passed since last update.

LambdaにAPI Gatewayから値を渡す

Posted at

簡単にできるかなと思ったら意外とハマったのでメモ

やりたいこと

/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}と指定する
    • その場合メソッドリクエストにはマッピングテンプレートに加え、リソースパスの追加をする
18
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
14