カスタムの Lambda 統合を使用して、API Gateway を介して Lambda 関数にカスタムヘッダーを渡すには、どうすれば良いですか?

最終更新日: 2020 年 1 月 8 日

Amazon API Gateway の API から送信されるメッセージに含まれるカスタムヘッダーを処理する AWS Lambda 関数を作成するには、どうすれば良いですか?

簡単な説明

デフォルトでは、Lambda 関数は API Gateway の API が受信したリクエストボディのみを取り込みます。API Gateway の API から Lambda 関数にカスタムヘッダーを渡すには、curl を使用して、 本文マッピングテンプレートを使用する API にメッセージを送信し、メッセージに追加されたカスタムヘッダーを抽出します。

API は、更新されたメッセージを Lambda 関数に送信してヘッダーを処理し、元のメッセージから 1 つ以上のヘッダー値を返します。

解決方法

IAM アクセス権限を設定する

Lambda および API Gateway に必要な AWS Identity and Access Management (IAM) アクセス権限を設定します。詳細については、IAM アクセス権限により API へのアクセスを制御するを参照してください。

テスト用に IAM ロールを作成し、AWS 管理ポリシーAmazonAPIGatewayInvokeFullAccess および AmazonAPIGatewayPushToCloudWatchLogs をアタッチします。

Lambda 関数の作成

1.    Lambda コンソールを開きます。

2.    Lambda を初めて使用する場合は、[今すぐ開始] を選択します。そうでない場合は、[関数を作成] を選択します。[関数を作成] ページが開き、[最初から作成] オプションが表示されます。

3.    [一から作成] を選択した状態で、[基本的な情報] の下で、次の操作を実行します。
[関数名] に、「CustomHeaders」などの名前を入力します。
[ランタイム] で、[Node.js 12.x] を選択します。

4.    [アクセス許可] で、[実行ロールの選択または作成] を展開します。

5.    [既存のロールを使用する] を選択します。

6.    [既存のロール] で、前に作成した実行ロールを選択します。

7.    [関数を作成] を選択します。

8.    Configuration ペインの [関数コード] で、エディタペイン (index.js) のコードを次のサンプル関数コードに置き換えます。

exports.handler = (event, context, callback) => {
// TODO implement
callback(null, "This message header was processed by Amazon " +event.headers["header1"]);
};

9.    [保存] をクリックします。

詳細については、 Node.js による Lambda 関数のビルドを参照してください。

API Gateway の API を作成する

1.    API Gateway コンソールを開きます。

2.    コンソールに既存の API がある場合は、[API の作成] を選択します。そうでない場合は、次のステップに進みます。

3.    [プロトコルを選択する] の [REST API] で、[ビルド] を選択します。

4.    [新しい API の作成] で、[新しい API] を選択します。

5.    [設定] で、以下の操作を実行します。
SendtoLambda」など [API 名] を入力します。
(オプション) [説明] に入力します。
[エンドポイントタイプ] は [リージョン] のままにします。

6.    [API の作成] をクリックします。

API を設定する

1.    API Gateway コンソール内の新しい API の [リソース] ペインで、[アクション]、[リソースの作成] の順に選択します。

2.    [新しい子リソース] ペインで、以下の操作を実行します。
[リソース名] に「HeadersResource」などを入力します。
[リソースの作成] をクリックします。

3.    [アクション]、[メソッドの作成] の順に選択します。

4.    [/headersresource] のドロップダウンメニューから [POST] を選択し、チェックマークアイコンをクリックします。

5.    /headersresource - POST - セットアップペインで、以下を実行して統合ポイントを設定します。
[統合タイプ] で、[Lambda 関数] を選択します。
[Lambda リージョン] で、Lambda 関数の AWS リージョンを選択します。
[Lambda 関数] に、Lambda 関数の名前を入力します。
[保存] をクリックします。

6.    [Lamba 関数に権限を追加する] ダイアログボックスで、[OK] をクリックします。

7.    /headersresource - POST - メソッドの実行ペインで、[統合リクエスト] を選択します。

8.    /headersresource - POST - 統合リクエスト ペインで、以下の操作を実行します。
[マッピングテンプレート] を展開します。
[リクエストボディのパススルー] で、[テンプレートが定義されていない場合 (推奨)]を選択します。
[マッピングテンプレートの追加] をクリックします。
[コンテンツタイプ] に「application/json」と入力し、チェックマークアイコン([作成])を選択します。

9.    マッピングテンプレートエディタで、次のように入力します。

{
    "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
    }
}

10.    [保存] をクリックします。

API のデプロイ

1.    API Gateway コンソール内の [リソース] ペインで、[アクション]、[API のデプロイ] の順にクリックします。

2.    [API のデプロイ] ダイアログで、以下の操作を実行します。
[デプロイされるステージ] で、[新しいステージ] を選択します。
[ステージ名] に、「test」 などの名前を入力します。
(オプション) [ステージの説明] と [デプロイメントの説明] を入力します。
[デプロイ] をクリックします。

3.    ステージエディターペインで、[URL の呼び出し] をクリップボードにコピーします。URL は https://1a2bc3d456.execute-api.region.amazonaws.com/test のようになります。

API をテストする

curl を使用して、API Gateway の API にメッセージを送信します。curl の詳細については、「cURL プロジェクトのウェブサイト」をご参照ください。

ヒント: Windows に curl をインストールするには、Git for Windows をダウンロードできます。これには GNU Bash シェルや、curl、tail、cat、grep、gzip、Perl などのその他の Linux ツールが含まれています。Git for Windows をダウンロードするには、Git ウェブサイトの ダウンロード を参照してください。Bash の詳細については、GNU ウェブサイトの GNU Bash を参照してください。

このコマンド例では、Lambda 関数によって参照される「header1」ヘッダーの値を返します。

curl -H "Content-Type: application/json" -H "header1: API Gateway and AWS Lambda" -X POST -d "{\"API_body\": \"This is the body\"}" https://restApiId.execute-api.region.amazonaws.com/stageName/headersresource

注意: コマンドの https://restApiId.execute-api.region.amazonaws.com/stageName を、API の [URL の呼び出し] に置き換えます。

成功すると、次の出力が表示されます。

"This message header was processed by Amazon API Gateway and AWS Lambda"