如何通过 API Gateway 将自定义标头传递给使用 Lambda 自定义(非代理)集成的 Lambda 函数?

3 分钟阅读
0

我想通过自定义(非代理)集成配置 AWS Lambda 函数,以处理通过 Amazon API Gateway API 传递的自定义标头。

简短描述

默认情况下,Lambda 函数仅处理从 API Gateway API 请求接收的方法请求正文。要通过 API Gateway API 将自定义标头传递给 Lambda 函数,请使用正文映射模板。API 首先将更新的 API 请求发送到 Lambda 函数以处理标头。然后,Lambda 函数会返回原始 API 请求中的一个或多个标头值。

解决方法

配置所需的 IAM 权限

按照使用 IAM 权限控制对 REST API 的访问中的说明进行操作。

要测试此过程,请创建一个 AWS Identity and Access Management (IAM) 角色,然后附加 AmazonAPIGatewayInvokeFullAccessAmazonAPIGatewayPushToCloudWatchLogs AWS 托管策略。有关详细信息,请参阅 AWS 托管策略

创建 Lambda 函数来处理来自 API Gateway API 的自定义标头

完成以下步骤:

  1. 打开 Lambda 控制台
  2. 选择 Create function(创建函数)。将打开 Create function(创建函数)页面,并选中 Author from scratch(从头开始创建)选项。
  3. Basic information(基本信息)窗格中,执行以下操作:
    Function name(函数名称)中,输入描述函数用途的名称。例如: CustomHeaders
    对于 Runtime(运行时),选择 Node.js 20.x
  4. Permissions(权限)下,展开 Change default execution role(更改默认执行角色)。
  5. 选择 Use an existing role(使用现有角色)。将出现现有角色的下拉列表。
  6. Existing role(现有角色)中,选择您之前创建的 Lambda 执行角色。
  7. 选择 Create function(创建函数)。
  8. Code source(代码源)窗格上,将编辑器窗格中的 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");
    };
    选择 Deploy(部署)。

有关详细信息,请参阅使用 Node.js 构建 Lambda 函数

创建 API Gateway REST API

完成以下步骤:

  1. 打开 API Gateway 控制台
  2. 选择 Create API(创建 API)。
    -or-
    如果您是第一次使用 API Gateway,则会显示一个页面,向您介绍 API Gateway 的功能。在 REST API 下,选择 Build(构建)。
  3. Create REST API(创建 REST API)部分的 API details(API 详细信息)下,选择 New API(新建 API)。
  4. API name(API 名称)中,输入描述 API 用途的名称。例如: SendtoLambda
    (可选)在 Description(描述)中,输入对 API 用途的简短概述。
    Endpoint Type(端点类型)中,选择 Regional(区域)。
  5. 选择 Create API(创建 API)。

配置 API 的集成点和正文映射模板

完成以下步骤:

  1. 打开 API Gateway 控制台

  2. 选择您之前创建的 API 的名称。将打开此 API 的 Resources(资源)页面。

  3. Resources(资源)页面上,选择 Create Resource(创建资源)。

  4. Create Resource(创建资源)窗格中,执行以下操作:
    Resource Name(资源名称)中,输入描述资源的名称。例如: HeadersResource
    选择 Create Resource(创建资源)。

  5. 选择您创建的资源,然后选择 Create Method(创建方法)。

  6. Create Method(创建方法)窗格中,执行以下操作:
    对于 method type(方法类型),从下拉列表中选择 POST
    对于 Integration type(集成类型),选择 Lambda Function(Lambda 函数)。
    确认 Lambda 代理集成已禁用。
    对于 Lambda function(Lambda 函数),选择托管函数的 AWS 区域,然后输入 Lambda 函数的名称或 Amazon 资源名称 (ARN)。
    选择 Create method(创建方法)。此操作会自动授予 API Gateway 调用您的 Lambda 函数的权限。

  7. 对于您在上一步中创建的资源方法选择 POST。然后,在 Method Execution(方法执行)窗格中,选择 Integration Request(集成请求)。

  8. Integration Request(集成请求)窗格中,选择 Edit(编辑),然后执行以下操作:
    Request body passthrough(请求正文传递)中,选择 When there are no templates defined (recommended)(未定义模板时(推荐))。
    展开窗格底部的 Mapping Templates(映射模板)。
    选择 Add mapping template(添加映射模板)。
    对于 Content-Type,输入 application/json

  9. Template body(模板正文)编辑器中,输入以下内容:

    {
      "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 中的 REST API 设置阶段
  2. 选择 Deploy API(部署 API)按钮。
  3. Deploy API(部署 API)弹出窗口中,输入该阶段的新名称,然后选择 Deploy(部署)。
  4. 展开 Stages(阶段)窗格中的阶段,以查看您在前面步骤中创建的资源和方法。
  5. 对于您的资源方法选择 POST,然后将 Invoke URL(调用 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 的访问

AWS 官方
AWS 官方已更新 2 个月前