【AWS】API Gateway マッピングテンプレートの設定方法

f:id:tm200:20220417162425p:plain

AWSAPI Gatewayを介してlambda関数にHTTPヘッダやPOSTパラメータを渡す際の設定方法をメモ。
Lambda プロキシ統合にチェックを入れるだけでもパラメータを参照することはできますが、レスポンスに不要な情報が含まれてしまう為、そちらは利用せずにパラメータを渡したかった次第です。


coin-look.pages.dev


ドキュメント

マッピングテンプレートのパラメータ名については、公式に一覧があります。 docs.aws.amazon.com

HTTPヘッダの設定方法

マッピングテンプレートを以下のように設定すれば、lambda関数からAuthorizationヘッダやカスタムヘッダなどのHTTPヘッダを参照できます。
$util.escapeJavaScriptエスケープしておくのがベターです。 HTTPヘッダは以下の記述のみで参照可能ですが、URLパラメータを参照するには「メソッドリクエスト」と「統合リクエスト」の欄から「URLクエリ文字列パラメータ」を指定する必要があります。

マッピングテンプレートの記載例

#set($allParams = $input.params())
{
  "params": {
    #foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
    "$type": {
      #foreach($paramName in $params.keySet())
        "$paramName": "$util.escapeJavaScript($params.get($paramName))"
        #if($foreach.hasNext),#end
        #end
    }
    #if($foreach.hasNext),#end
    #end
  }
}

lambda関数の実装例

def lambda_handler(event, context):
    # `Authorization`ヘッダの取得
    auth_header = event.get('params', {}).get('header', {}).get('Authorization', {})
    # クエリパラメータ(GETのURLパラメータ)の取得
    p = event.get('params', {}).get('querystring', {}).get('<パラメータ名>')

POSTパラメータの設定方法

POST時のリクエストパラメータのJSONは以下のように設定すると、lambda関数から参照可能となります。

マッピングテンプレートの記載例

#set($allParams = $input.params())
{
  "params": {
    "body": $input.json('$'),      **←ココ**
    #foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
    "$type": {
      #foreach($paramName in $params.keySet())
        "$paramName": "$util.escapeJavaScript($params.get($paramName))"
        #if($foreach.hasNext),#end
        #end
    }
    #if($foreach.hasNext),#end
    #end
  }
}

lambda関数の実装例

def lambda_handler(event, context):
    # jsonボディの取得
    body = event.get('params', {}).get('body', {})
    # json物理名を指定して、各パラメータを取得
    p = body.get('<パラメータ名>')