我想通过 Amazon API Gateway 为 AWS Lambda 代理或非代理集成发送自定义安全标头。
解决方法
要在 API Gateway 响应中添加自定义安全标头,请按照您的集成类型的对应方法进行操作。
**注意:**以下解决方法仅适用于 API Gateway REST API。HTTP API 不支持方法响应或集成响应映射。
Lambda 代理集成
对于 Lambda 代理集成,API Gateway 无需修改即可在客户端与集成的 Lambda 函数之间发送请求和响应。要通过 API Gateway API 向 Lambda 函数发送自定义安全标头,您必须修改函数源代码。
完成以下步骤:
-
打开 API Gateway 控制台。
-
在导航窗格中,选择 API,然后选择您的 REST API。
-
选择 Create method(创建方法)。
-
在 Create Method(创建方法)窗格中,执行以下操作:
对于 Method type(方法类型),选择您的方法类型。
对于 Integration type(集成类型),选择 Lambda function(Lambda 函数)。
确认您已启用 Lambda 代理集成。
对于 Lambda function(Lambda 函数),选择您的 Lambda 函数。
选择 Create method(创建方法)。
-
在 Integration Request(集成请求)窗格中,选择您的 Lambda 函数。
-
对于 Code source(代码源),在代码编辑器中将该函数的代码替换为以下 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;
};
-
选择 Deploy(部署)。
非代理集成
要通过非代理或自定义集成(如 AWS 服务和 HTTP 集成类型)发送自定义安全标头,请创建映射模板或方法响应。
**创建映射模板 **
完成以下步骤:
-
打开 API Gateway 控制台。
-
在导航窗格中,选择 API,然后选择您的 REST API。
-
在 Create Method(创建方法)窗格中,输入您的 method type(方法类型)和 integration type(集成类型),然后选择 Create method(创建方法)。
-
在 Integration Request(集成请求)窗格中,选择 Edit(编辑)。
-
展开 Mapping templates(映射模板),然后选择 Add mapping template(添加映射模板)。
-
对于 Content type(内容类型),输入您的内容类型。例如,application/json。
-
在 Template body(模板正文)编辑器中,输入以下映射模板:
#set($headersToReturn = {
"Strict-Transport-Security": "max-age=31536000; includeSubDomains"
})#foreach($header in $headersToReturn.keySet()) #set($context.responseOverride.header[$header] = $headersToReturn[$header])#end
-
选择 Save(保存)。
-
选择 Deploy API(部署 API)。
创建方法响应
完成以下步骤:
- 打开 API Gateway 控制台。
- 在导航窗格中选择 API,然后选择您的 REST API。
- 在 Method response(方法响应)窗格中,选择 Edit(编辑)。
- 对于 Header name(标头名称),选择 Add header(添加标头)。
- 输入要返回的自定义标头的名称,例如 Strict-Transport-Security。
- 选择 Add header(添加标头)以添加要返回的另一个标头,例如 Content-Security-Policy。
- 选择 Save(保存)。
- 在 Integration Request(集成请求)窗格中,选择 Edit(编辑)。
- 对于 Header mappings(标头映射),输入标头的映射值,例如 max-age=100000 和 self。
- 选择 Save(保存),然后选择 Deploy API(部署 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 替换为您的阶段名称。
相关信息
如何通过 API Gateway 将自定义标头传递给使用 Lambda 自定义(非代理)集成的 Lambda 函数?
Mapping template transformations for REST APIs in API Gateway(API Gateway 中 REST API 的映射模板转换)
如何使用 Lambda 代理集成解决来自 API Gateway REST API 的 HTTP 502 错误?
Tutorial: Create a REST API with a Lambda non-proxy integration(教程:利用 Lambda 非代理集成创建 REST API)