跳至内容

如何通过 API Gateway 为 Lambda 代理或非代理集成发送自定义安全标头?

2 分钟阅读
0

我想通过 Amazon API Gateway 为 AWS Lambda 代理或非代理集成发送自定义安全标头。

解决方法

要在 API Gateway 响应中添加自定义安全标头,请按照您的集成类型的对应方法进行操作。

**注意:**以下解决方法仅适用于 API Gateway REST API。HTTP API 不支持方法响应或集成响应映射。

Lambda 代理集成

对于 Lambda 代理集成,API Gateway 无需修改即可在客户端与集成的 Lambda 函数之间发送请求和响应。要通过 API Gateway API 向 Lambda 函数发送自定义安全标头,您必须修改函数源代码。

完成以下步骤:

  1. 打开 API Gateway 控制台。

  2. 在导航窗格中,选择 API,然后选择您的 REST API。

  3. 选择 Create method(创建方法)。

  4. 在 Create Method(创建方法)窗格中,执行以下操作:
    对于 Method type(方法类型),选择您的方法类型。
    对于 Integration type(集成类型),选择 Lambda function(Lambda 函数)。
    确认您已启用 Lambda 代理集成。
    对于 Lambda function(Lambda 函数),选择您的 Lambda 函数。
    选择 Create method(创建方法)。

  5. 在 Integration Request(集成请求)窗格中,选择您的 Lambda 函数。

  6. 对于 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;
    };
  7. 选择 Deploy(部署)。

非代理集成

要通过非代理或自定义集成(如 AWS 服务和 HTTP 集成类型)发送自定义安全标头,请创建映射模板或方法响应。

**创建映射模板 **

完成以下步骤:

  1. 打开 API Gateway 控制台。

  2. 在导航窗格中,选择 API,然后选择您的 REST API。

  3. 在 Create Method(创建方法)窗格中,输入您的 method type(方法类型)和 integration type(集成类型),然后选择 Create method(创建方法)。

  4. 在 Integration Request(集成请求)窗格中,选择 Edit(编辑)。

  5. 展开 Mapping templates(映射模板),然后选择 Add mapping template(添加映射模板)。

  6. 对于 Content type(内容类型),输入您的内容类型。例如,application/json。

  7. 在 Template body(模板正文)编辑器中,输入以下映射模板:

    #set($headersToReturn = {  
      "Strict-Transport-Security": "max-age=31536000; includeSubDomains"  
    })#foreach($header in $headersToReturn.keySet())  #set($context.responseOverride.header[$header] = $headersToReturn[$header])#end
  8. 选择 Save(保存)。

  9. 选择 Deploy API(部署 API)。

创建方法响应

完成以下步骤:

  1. 打开 API Gateway 控制台。
  2. 在导航窗格中选择 API,然后选择您的 REST API。
  3. 在 Method response(方法响应)窗格中,选择 Edit(编辑)。
  4. 对于 Header name(标头名称),选择 Add header(添加标头)。
  5. 输入要返回的自定义标头的名称,例如 Strict-Transport-Security。
  6. 选择 Add header(添加标头)以添加要返回的另一个标头,例如 Content-Security-Policy。
  7. 选择 Save(保存)。
  8. 在 Integration Request(集成请求)窗格中,选择 Edit(编辑)。
  9. 对于 Header mappings(标头映射),输入标头的映射值,例如 max-age=100000 和 self。
  10. 选择 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)

AWS 官方已更新 8 个月前