AWS Lambda プロキシ統合または非プロキシ統合用の Amazon API Gateway を介してカスタムセキュリティヘッダーを送信したいと考えています。
解決策
API Gateway レスポンスにカスタムセキュリティヘッダーを追加するには、統合タイプに応じた方法に従ってください。
注: 以下の解決策は、API Gateway REST API にのみ適用されます。HTTP API はメソッドレスポンスまたは統合レスポンスマッピングをサポートしていません。
Lambda プロキシ統合
Lambda プロキシ統合の場合、API Gateway はクライアントと統合された Lambda 関数との間でリクエストとレスポンスを変更なしで送信します。API Gateway API から Lambda 関数にカスタムセキュリティヘッダーを送信するには、関数のソースコードを変更する必要があります。
次の手順を実行します。
-
API Gateway コンソールを開きます。
-
ナビゲーションペインで [API] をクリックし、該当する REST API を選択します。
-
[メソッドを作成] をクリックします。
-
[メソッドの作成] ペインで、次の操作を行います。
[メソッドタイプ] で、使用するメソッドタイプを選択します。
[統合タイプ] で [Lambda 関数] を選択します。
Lambda プロキシ統合を有効にしたことを確認します。
[Lambda 関数] で使用する Lambda 関数を選択します。
[メソッドを作成] をクリックします。
-
[統合リクエスト] ペインで、Lambda 関数を選択します。
-
[コードソース] で、コードエディタで関数のコードを次の Python コードまたは Node.js コードに置き換えます。
Python 3.14 以降:
def lambda_handler(event, context):
return {
'statusCode': 200,
'headers': {
"Strict-Transport-Security": "max-age=100000",
"X-Frame-Options": "DENY",
"X-Content-Type-Options": "nosniff",
"Content-Security-Policy": "default-src 'self'"
},
'body': json.dumps("Hello from Lambda with security headers!")
}
Node.js 14 以降:
exports.handler = async (event) => {
const response = {
statusCode: 200,
headers: {
'Strict-Transport-Security': 'max-age=31536000; includeSubDomains',
'Content-Security-Policy': "default-src 'self'",
'X-Frame-Options': 'DENY',
'X-Content-Type-Options': 'nosniff'
},
body: JSON.stringify('Hello from Lambda with security headers!')
};
return response;
};
-
[デプロイ] をクリックします。
非プロキシ統合
AWS サービスや HTTP 統合タイプなどの非プロキシ統合またはカスタム統合を介してカスタムセキュリティヘッダーを送信するには、マッピングテンプレートまたはメソッドレスポンスを作成します。
マッピングテンプレートを作成する
次の手順を実行します。
-
API Gateway コンソールを開きます。
-
ナビゲーションペインで [API] をクリックし、該当する REST API を選択します。
-
[メソッドを作成] ペインで、メソッドタイプと統合タイプを入力し、[メソッドを作成] をクリックします。
-
[統合リクエスト] ペインで、[編集] をクリックします。
-
[マッピングテンプレート] を展開し、[マッピングテンプレートの追加] を選択します。
-
[コンテンツタイプ] に、コンテンツタイプを入力します。例: application/json。
-
テンプレート本文エディタで、次のマッピングテンプレートを入力します。
#set($headersToReturn = {
"Strict-Transport-Security": "max-age=31536000; includeSubDomains"
})#foreach($header in $headersToReturn.keySet()) #set($context.responseOverride.header[$header] = $headersToReturn[$header])#end
-
[保存] をクリックします。
-
[API のデプロイ] をクリックします。
メソッドレスポンスを作成する
次の手順を実行します。
- API Gateway コンソールを開きます。
- ナビゲーションペインで [API] をクリックし、REST API を選択します。
- [メソッドレスポンス] ペインで [編集] をクリックします。
- [ヘッダー名] で [ヘッダーを追加] をクリックします。
- 返したいカスタムヘッダーの名前を入力します (例: Strict-Transport-Security)。
- [ヘッダーを追加] をクリックして、返したい他のヘッダーを追加します (例: Content-Security-Policy)。
- [保存] をクリックします。
- [統合リクエスト] ペインで、[編集] をクリックします。
- [ヘッダーマッピング] には、ヘッダーのマッピング値を入力します (例: max-age=100000、self)。
- [保存] をクリックし、[API をデプロイ] をクリックします。
設定をテストする
セキュリティカスタムヘッダーが応答に含まれていることを確認するには、次の curl コマンドを実行して REST API を呼び出します。
curl -v https://your-api-id.execute-api.your-region.amazonaws.com/your-stage-name
注: your-api-id を実際の REST API に、your-region を AWS リージョンに、your-stage-name をステージ名に置き換えてください。
関連情報
カスタムヘッダーを Lambda 関数に渡すために、API Gateway 経由で Lambda カスタム (非プロキシ) 統合を使用する方法を教えてください。
API Gateway での REST API のテンプレート変換のマッピング
Lambda プロキシ統合を使用して API Gateway REST API からの HTTP 502 エラーを解決するにはどうすればよいですか?
チュートリアル: Lambda 非プロキシ統合を使用して REST API を作成する