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

最終更新日: 2021 年 7 月 27 日

Amazon API Gateway API を通過するカスタムヘッダーを処理するように AWS Lambda 関数を設定したいのですが。設定する方法を教えてください。

簡単な説明

デフォルトでは、Lambda 関数は API Gateway API リクエストから受信したメソッドリクエストボディのみを処理します。API Gateway API から Lambda 関数にカスタムヘッダーを渡すには、ボディマッピングテンプレートを使用します。API は、ヘッダーを処理するために、更新された API リクエストを Lambda 関数に送信します。次に、Lambda 関数は元の API リクエストから 1 つ以上のヘッダー値を返します。

解決方法

必要な IAM アクセス許可を設定します。

IAM アクセス許可により API へのアクセスを制御するの手順に従います。

この手順をテストするには、IAM ロールを作成し、次の AWS managed policies (AWS マネージドポリシー) をアタッチします。

  • AmazonAPIGatewayInvokeFullAccess
  • AmazonAPIGatewayPushToCloudWatchLogs

API Gateway API からのカスタムヘッダーを処理する Lambda 関数を作成する

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

2.    [Create function (関数を作成)] を選択します。[Create function (関数を作成)] ページが開き、選択した [ Author from scratch (最初から作成)] オプションが表示されます。

3.    [Basic information (基本情報)] ペインで次の操作を実行します。
[Function name (関数名)] に関数の目的がわかるような名前を入力します。例: CustomHeaders
[Runtime (ランタイム)] で [Node.js 14.x] を選択します。

4.    [Permissions (アクセス許可)] の下で [Change default execution role (デフォルト実行ロールを変更)] を選択します。

5.    [Use an existing role (既存のロールを使用する)] を選択します。[Existing roles (既存のロール)] ドロップダウンリストが表示されます。

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

7.    [Create function (関数を作成)] を選択します。

8.    [Configuration (設定)] ペインの [Function code (関数コード)] の下で エディタペイン (index.js) のコードを次のコードに置き換えます。

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

9.    [Save (保存)] を選択します。

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

API Gateway REST API を作成する

1.    API Gateway Console にログインします。

2.    [Create API (API の作成)] を選択します。

- または -

(初めて API Gateway を使用する場合) サービスの特徴を紹介するページが表示されます。[REST API] で [Build (ビルド)] を選択します。[Create Example API (サンプル API の作成)] ポップアップが表示されたら [OK] を選択します。

3.    [REST API] ペインの [Choose an API type (API タイプを選択)] で [Build (ビルド)] を選択します。

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

5.    [設定] では、次の操作を実行します。
[API name (API 名)] に API の目的を説明する名前を入力します。例: SendtoLambda
(オプション) [Description (説明)] に API の目的を表す短い説明を入力します。
[Endpoint Type (エンドポイントタイプ)] で [Resional (リージョン)] を選択します。

6.    [Create API (API の作成)] を選択します。

API の統合ポイントとボディマッピングテンプレートを設定する

1.    前のステップで作成した API の名前を API Gateway console (API Gateway コンソール)で選択します。API の [Resources (リソース)] ページが開きます。

2.    [Resources (リソース)] ページで [Actions (アクション)] を選択します。[Create Resource (リソースの作成)] を選択します。

3.    [New Child Resource (新しい子リソース)] ペインで、以下の操作を実行します。
[Resource Name (リソース名)] にリソースを説明する名前を入力します。例: HeadersResource
[リソースの作成] を選択します。

4.    [アクション] をクリックします。その後、[Create Method (メソッドの作成)] を選択します。

5.    /headersresource の下にあるドロップダウンリストで POST を選択します。チェックマークアイコンを選択します。

6.    /headersresource - POST - セットアップページで次の操作を実行します。
[統合タイプ] で [Lambda 関数] を選択します。
[Lambda Region (Lambda リージョン)] で関数のホストになる AWS リージョンを選択します。
[Lambda Function (Lambda 関数)] に関数の名前を入力します。
[Save (保存)] を選択します。[Add Permission to Lambda Function (Lambda 関数にアクセス許可を追加する)] ポップアップが表示されます。
ポップアップで [OK] を選択します。

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

8.    /headersresource - POST - 統合リクエストページで以下の操作を実行します。
[Mapping Templates (マッピングテンプレート)] を展開します。
[リクエストボディのパススルー] で[テンプレートが定義されていない場合 (推奨)]を選択します。
[Add mapping template (マッピングテンプレートの追加)] を選択します。
Content-Type には、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.    [Save (保存)] を選択します。

新しいステージに API をデプロイします。

1.    「REST API をステージにデプロイする」の手順に従います。詳細については、「API Gateway コンソールを使用したステージのセットアップ」を参照してください。

2.    [Stage Editor (ステージエディタ)] ペインで [URL の呼び出し] をクリップボードにコピーします。

REST API 呼び出し URL の例

https://1a2bc3d456.execute-api.region.amazonaws.com/test

設定をテストする

API と Lambda 関数によってメッセージヘッダーが処理されていることを確認するには、次の curl コマンドを実行します。

重要: https://restApiId.execute-api.region.amazonaws.com/stageName を API の 呼び出し URL に置き換えます。

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

コマンドの出力例

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

注記: Windows に curl をインストールするには、Git ウェブサイトでダウンロードを参照してください。curl の詳細については、curl プロジェクトのウェブサイトをご覧ください。