Amazon API Gateway API 経由で渡されるカスタムヘッダーを処理するために、カスタム (非プロキシ) 統合を使用して AWS Lambda 関数を設定したいです。
簡単な説明
デフォルトでは、Lambda 関数は API Gateway API のリクエストから受信したメソッドリクエスト本文のみを処理します。API Gateway API から Lambda 関数にカスタムヘッダーを渡すには、ボディマッピングテンプレートを使用します。API はまず、更新された API リクエストを Lambda 関数に送信してヘッダーを処理します。次に、Lambda 関数は元の API リクエストから 1 つ以上のヘッダー値を返します。
解決策
必要な IAM アクセス許可を設定する
「IAM アクセス許可で REST API へのアクセスを制御する」の手順に従ってください。
この手順をテストするには、AWS Identity and Access Management (IAM) ロールを作成し、AWS マネージドポリシー AmazonAPIGatewayInvokeFullAccess および AmazonAPIGatewayPushToCloudWatchLogs をアタッチします。詳細については、「AWS マネージドポリシー」を参照してください。
API ゲートウェイ API からのカスタムヘッダーを処理する Lambda 関数を作成する
次の手順を実行します。
- Lambda コンソールを開きます。
- [関数の作成] を選択します。[関数の作成] ページが開き、[一から作成] オプションが選択されています。
- [基本情報] ペインで、次の操作を行います。
[関数名] に、関数の目的を説明する名前を入力します。例: CustomHeaders
[ランタイム] で [Node.js 20.x] を選択します。
- [アクセス許可] で、[デフォルトの実行ロールの変更] を展開します。
- [既存のロールを使用する] を選択します。既存のロールのドロップダウンリストが表示されます。
- [既存のロール] で、以前に作成した Lambda 実行ロールを選択します。
- [関数の作成] を選択します。
- [コードソース] ペインで、エディタペインの index.mjs コードを次のコードに置き換えます。
export const handler = async (event, context, callback) => {
callback(null, "The custom header " +event.headers["header1"] +" has been processed successfully by AWS Lambda via Amazon API Gateway");
};
[デプロイ] を選択します。
詳細については、「Node.js を使用して Lambda 関数をビルドする」を参照してください。
API Gateway REST API を作成する
次の手順を実行します。
- API Gateway コンソールを開きます。
- [API の作成] を選択します。
または、
API Gateway を初めて使用する場合は、API Gateway の機能を紹介するページが表示されます。[REST API] で、[ビルド] を選択します。
- [REST API の作成] セクションで、[API の詳細] にある [新規 API] を選択します。
- [API 名] には、API の目的を説明する名前を入力します。例: SendtoLambda
(オプション) [説明] に API の目的の簡単な説明を入力します。
[エンドポイントタイプ] で [リージョナル] を選択します。
- [API の作成] を選択します。
API の統合ポイントとボディマッピングテンプレートを設定する
次の手順を実行します。
-
API Gateway コンソールを開きます。
-
以前に作成した API の名前を選択します。API の [リソース] ページが開きます。
-
[リソース] ページで [リソースの作成] を選択します。
-
[リソースの作成] ペインで、次の操作を行います。
[リソース名] に、リソースを説明する名前を入力します。例: HeadersResource
[リソースの作成] を選択します。
-
[リソース] で作成したものを選択し、[メソッドの作成] を選択します。
-
[メソッドの作成] ペインで、次の操作を行います。
[メソッドタイプ] には、ドロップダウンリストから [POST] を選択します。
[統合タイプ] で [Lambda 関数] を選択します。
Lambda プロキシ統合が無効になっていることを確認します。
[Lambda 関数] では、関数をホストする AWS リージョンを選択し、Lambda 関数の名前または Amazon リソースネーム (ARN) を入力します。
[メソッドを作成] を選択します。このアクションにより、Lambda 関数を呼び出すためのアクセス許可が API Gateway に自動的に付与されます。
-
前のステップで作成したリソースメソッドでは [POST] を選択します。次に、[メソッド実行] ペインで [統合リクエスト] を選択します。
-
[統合リクエスト] ペインで [編集] を選択し、次の操作を行います。
[リクエスト本文のパススルー] で、[テンプレートが定義されていない場合 (推奨)] を選択します。
ウィンドウの下部にある [マッピングテンプレート] を展開します。
[マッピングテンプレートを追加] を選択します。
**[コンテンツタイプ]**に 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
}
}
-
[保存] をクリックします。
API を新しいステージにデプロイする
次の手順を実行します。
- 手順に従って REST API をステージにデプロイします。詳細については、「API Gateway で REST API のステージを設定する」を参照してください。
- [API をデプロイ] ボタンをクリックします。
- [API をデプロイ] ポップアップウィンドウでステージの新しい名前を入力し、[デプロイ] を選択します。
- [ステージ] ペインでステージを展開します。前のステップで作成したリソースとメソッドが表示されます。
- リソースメソッドで [POST] を選択し、[呼び出し URL] をクリップボードにコピーします。
REST API の呼び出し URL 例:
https://1a2bc3d456.execute-api.region.amazonaws.com/stageName/resourceName
設定をテストする
API と Lambda 関数がヘッダーを処理していることを確認するには、次の curl コマンドを実行します。
curl -H "Content-Type: application/json" -H "header1: value1" -X POST -d "{\"API_body\": \"This is the body\"}" https://restApiId.execute-api.region.amazonaws.com/stageName/resourceName
注: は、API の呼び出し URL に置き換えます。
出力例
"The custom header value1 has been processed successfully by AWS Lambda via Amazon API Gateway"
注: Windows に curl をインストールする方法については、Git のウェブサイトで「ダウンロード」を参照してください。curl の詳細については、curl プロジェクトのウェブサイトをご覧ください。
関連情報
API Gateway でデータ変換を設定する
AWS Lambda でアクセス許可を管理する
IAM アクセス許可で REST API へのアクセスを制御する