はじめに
APIGatewayからLambdaへリクエストヘッダー情報を受け渡す必要があり、
その際に行った実装方法とテスト方法について、備忘録として記載します。
前提
 ・本記事では、下記の赤矢印①〜②の実装方法について記載する。

目次
1. Lambda関数の作成
2. APIGatewayの作成
(おまけ1)Lambda関数のテスト実行
(おまけ2)APIGatewayのテスト実行
1. Lambda関数の作成
1-1. 関数の作成
Lambda(関数)のコンソール画面から下記の設定値でLambda関数を作成する。
| 設定項目 | 設定値 | 
|---|---|
| 以下のいずれかのオプションを選択して、関数を作成します。 | 一から作成 | 
| 関数名 | 任意の値 | 
| ランタイム | Python 3.8 | 
| アーキテクチャ | x86_64 | 
| 実行ロール | 基本的な Lambda アクセス権限で新しいロールを作成 | 
1-2. ソースコード実装
1-1にて作成したLambda関数のコンソール画面にて、下記の内容を参考にソースコードを実装する。
今回は、リクエスト情報の受け取り確認のため、受け取ったヘッダー項目とボディパラメータ項目を返却値として設定する。
def lambda_handler(event, context):
	try:
		# パラメータ設定
		# ヘッダー項目取得
		headerItem = event['headers']['Header-item']
		# ボディパラメータ項目取得
		bodyItem = event['body']['body_item']
		# 取得結果を返却
		return {
	    		'headerItem': headerItem,
	    		'bodyItem': bodyItem
		}
	    
	except Exception as e:
		# エラー
		print(e)
2. APIGatewayの作成
2-1. APIの作成
API Gateway(API)のコンソール画面から下記の設定値でAPIを作成する。
| 設定項目 | 設定値 | 
|---|---|
| API タイプを選択 | REST API(構築) | 
| プロトコルを選択する | REST | 
| 新しい API の作成 | 新しい API | 
| API 名 | 任意の値 | 
| 説明 | 任意の値 | 
| エンドポイントタイプ | リージョン | 
2-2. メソッドの作成
2-1で作成したAPI Gateway(API)のコンソール画面にて、
[アクション] > [メソッドの作成] から下記の設定値でメソッドを作成する。
| 設定項目 | 設定値 | 
|---|---|
| メソッド | POST | 
| 統合タイプ | Lambda関数 | 
| プロキシ統合の使用 | なし | 
| Lambdaリージョン | 1でLambda関数を作成したリージョン | 
| Lambda関数 | 1で作成したLambda関数 | 
| デフォルトタイムアウトの使用 | あり | 
2-3. リクエストヘッダーの設定
2-1で作成したAPI Gateway(API)のコンソール画面にて、
[リソース(POST)] > [メソッドリクエスト] > [HTTP リクエストヘッダー] から下記の設定値でリクエストヘッダーを設定する。
| 設定項目 | 設定値 | 
|---|---|
| 名前 | Header-item | 
| 必須 | なし | 
| キャッシュ | なし | 
2-4. リクエストパラメータマッピングの設定
2-1で作成したAPI Gateway(API)のコンソール画面にて、
[リソース(POST)] > [統合リクエスト] > [マッピングテンプレート] から下記の設定値でリクエストパラメータマッピングを設定する。

| 設定項目 | 設定値 | 
|---|---|
| リクエスト本文のパススルー | テンプレートが定義されていない場合 (推奨) | 
| Content-Type | application/json | 
| 「テンプレートの生成」項目下部のテキスト入力欄 | ※下記のテンプレートを設定 | 
※下記のテンプレートを設定する。
{
    "method": "$context.httpMethod",
    "body" : $input.json('$'),
    "headers": {
        #foreach($param in $input.params().header.keySet())
        "$param": "$util.escapeJavaScript($input.params().header.get($param))"
        #if($foreach.hasNext),#end
        #end
    }
}
2-5. APIのデプロイ
2-1で作成したAPI Gateway(API)のコンソール画面にて、
[アクション] > [APIのデプロイ] から下記の設定値でAPIをデプロイする。
| 設定項目 | 設定値 | 
|---|---|
| デプロイされるステージ | 新しいステージ | 
| ステージ名 | 任意の値 | 
(おまけ1)Lambda関数のテスト実行
1で作成したLambda関数に対して、単体テスト実行を行う。
1にて作成したLambda関数のコンソール画面にて、「テスト」タブを選択する。
適当な名前を入力し、下部のテキスト入力欄に下記のテストテンプレートをもとに設定する。
 ※body_item: 任意のボディパラメータ項目
 ※Header-item: 任意のヘッダー項目
{
  "method": "POST",
  "body": {
    "body_item": "test-body"
  },
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate, br",
    "Content-Type": "application/json",
    "Header-item": "test-header",
    "Host": "",
    "Postman-Token": "",
    "User-Agent": "",
    "X-Amzn-Trace-Id": "",
    "X-Forwarded-For": "",
    "X-Forwarded-Port": "443",
    "X-Forwarded-Proto": "https"
  }
}
(おまけ2)APIGatewayのテスト実行
2-1で作成したAPI Gateway(API)のコンソール画面にて、
作成したAPIおよびLambda関数に対して、テスト実行を行う。
[リソース(POST)] > [クライアント(テスト)] から下記の設定値でテストを実行する。
| 設定項目 | 設定値 | 
|---|---|
| ヘッダー | Header-item:test-header | 
| リクエスト本文 | { "body_item": "test-body" } | 
参考
カスタムの Lambda 統合を使用して、API Gateway 経由で Lambda 関数にカスタムヘッダーを渡すにはどうすれば良いですか?
APIGW リクエスト検証とは?実装する方法までわかりやすく解説!-その1
