LoginSignup
0
0

API Gateway経由でLambda呼び出すときのマッピングテンプレート

Last updated at Posted at 2024-04-29

はじめに

BedrockにAPIリクエスト投げるLambda書いたからフロントエンドも作りたいな…と言いつつ数か月経ってしまった。
API Gatewayにリクエスト投げるシンプルなhtml書いてS3+CloudFrontのベタな構成……と思ったらAPI Gatewayにリクエスト投げるところで詰まったので、とりあえずその部分を記事化。

Lambda書いたときの記事

1. ハマリポイント

Lambdaに引数keywordを渡す必要がある。マネコンのLambdaのエディタからテストしたときは以下のようにJSONを手打ちして問題なく動いていた。
image.png

…が、API GatewayにLambdaを統合し、API GatewayにPOSTリクエストを送ったとき、どうも上手く引数が渡らない。

KeyErrorとか言われる
image.png

調べたところ、POSTリクエストの本文だとフォーマットが都合よくJSON形式にはなってくれないみたいなので、API Gateway側でマッピングテンプレートを設定し、渡す値を整形する必要がある。

おそらく以下のようなフォーマットで渡っちゃってるみたい

キーと値は、 '&' で区切られ、キーと値の組が '=' で結ばれた形でエンコードされます。キーや値が英数字以外の文字であった場合は、パーセントエンコーディングされます。

2. マッピングテンプレート設定方法

API Gateway リソース から「統合リクエストの設定」横の編集ボタンを押す。
APIGateway.png

image.png

マッピングテンプレートのコンテンツタイプにapplication/x-www-form-urlencodedを入力する。
テンプレート本文はJSONフォーマットにPOSTの本文で渡された値をはめ込むイメージで書く。
image.png

今回書いたLambdaは引数1つなので、マッピングテンプレートも以下のようにシンプルなものでいけた。

{
    "keyword" : $input.json('$')  
}

POSTリクエストの本文がもっと複雑な構造ならテンプレートももっと複雑になるはず。複数のキーと値の組があるなら&で分割してあげるとか。

$input.json('$')だと何もフィルタしないけど、$input.json('$.hoge')とかで指定してあげると特定のフィールドだけ抽出できそう。

マッピングテンプレートについて(サンプル多数)

JSONPathの詳細

3. html

とりあえずAPI GatewayにPOSTリクエスト投げるだけのシンプルなやつ。
formのactionのURLは適宜書き換え。

<html>
<head>
<meta charset="utf-8">
<title>CreateImages</title>
</head>
<body>
<form method="POST" action="https://restapi_id.execute-api.region.amazonaws.com/stage_name/">
    <div><label>生成したい画像のキーワード:<input type="text" name="keyword"></label></div>
    <input type="submit" value="Submit!">
</form>
</body>
</html>

REST API呼び出し

おわりに

API GatewayのマッピングテンプレートでLambdaからの戻り値も整形できそう(統合レスポンス)なのでこちらも設定が必要そう。
Content-Typeのところから理解がぼんやりしてるのでコード改善しつつAPIまわりも勉強したい……

参考サイト

0
0
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
0
0