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

2 分钟阅读
0

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

简短描述

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

解决方法

配置所需的 AWS Identity and Access Management (IAM) 权限。

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

要测试此过程,您可以创建 IAM 角色并附加以下 AWS 托管策略

  • AmazonAPIGatewayInvokeFullAccess
  • AmazonAPIGatewayPushToCloudWatchLogs

创建 Lambda 函数以处理 API 网关中的自定义标头

1.    打开 Lambda 控制台

2.    选择创建函数。此时将打开创建函数页面,其中已选择从头开始创建选项。

3.    在基本信息窗格中,执行以下操作:
对于函数名称,输入描述函数用途的名称。例如:CustomHeaders
对于运行时,选择 Node.js 14.x

4.    在权限下,展开更改默认执行角色

5.    选择使用现有角色。此时将显示现有角色的下拉列表。

6.    在现有角色中,选择您之前创建的 Lambda 执行角色。

7.    选择创建函数

8.    在代码源窗格上,将编辑器窗格 (index.js) 中的代码替换为以下内容:

exports.handler = (event, context, callback) => {
// TODO implement
callback(null, "This message header was processed by Amazon " +event.headers["header1"]);
};

9.    选择保存

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

创建 API Gateway REST API

1.    打开 API Gateway 控制台

2.    选择创建 API

–或者–

(如果这是您第一次使用 API Gateway) 您将看到一个向您介绍此服务的功能的页面。在 REST API 下,选择构建。出现创建示例 API 弹出窗口时,选择确定

3.    对于选择 API 类型,在 REST API 窗格中选择构建

4.    在创建新的 API 下,选择新建 API

5.    在设置下,执行以下操作:
对于 API 名称,请输入描述 API 用途的名称。例如:SendtoLambda
(可选) 对于描述,输入简短描述 API 用途的内容。
对于终端节点类型,请选择区域

6.    选择创建 API

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

1.    在 API Gateway 控制台中,选择您在上一步中创建的 API 的名称。您的 API 的资源页面打开。

2.    在资源页面中,选择操作。然后,选择创建资源

3.    在新建子资源窗格中,执行以下操作:
对于资源名称,输入描述资源的名称。例如:HeadersResource
选择创建资源

4.    选择操作。然后,选择创建方法

5.    从 /headersresource 下的下拉列表中,选择 POST。然后,选择复选标记图标。

6.    在 /headersresource - POST - 设置页面上,执行以下操作:
对于集成类型,选择 Lambda 函数
对于 Lambda 区域,请选择托管您的函数的 AWS 区域。
对于 Lambda 函数,请输入函数的名称。
选择保存。出现向 Lambda 函数添加权限弹出窗口。
在弹出窗口中,选择确定

7.    在 /headersresource - POST - 方法执行窗格中,选择集成请求

8.    在 /headersresource - POST - 集成请求窗格中,执行以下操作:
展开映射模板
请求正文传递中选择当没有定义模板时 (推荐)
选择添加映射模板
对于 Content-Type,输入 application/json。然后,选择复选标记图标。

9.    在映射模板编辑器中,输入以下内容:

{
  "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.    选择保存

将您的 API 部署到一个新的阶段

1.    按照将 REST API 部署到阶段中的说明进行操作。有关更多信息,请参阅使用 API Gateway 控制台设置阶段

2.    在阶段编辑器窗格中,将调用 URL 复制到您的剪切板。

REST API 调用 URL 示例

https://1a2bc3d456.execute-api.region.amazonaws.com/test

测试您的设置

要确认您的 API 和 Lambda 函数正在处理消息标头,请运行以下 curl 命令:

**注意:**将 https://restApiId.execute-api.region.amazonaws.com/stageName 替换为您的 API 的调用 URL

curl -H "Content-Type: application/json" -H "header1: API Gateway and AWS Lambda" -X POST -d "{\"API_body\": \"This is the body\"}" https://restApiId.execute-api.region.amazonaws.com/stageName/headersresource

示例输出

"This message header was processed by Amazon API Gateway and AWS Lambda"

**注意:**要在 Windows 上安装 curl,请参阅 Git 网站上的下载。如需关于 curl 的更多信息,请参见 curl 项目网站


相关信息

为 REST API 设置数据转换

Lambda 权限

使用 IAM 权限控制对 API 的访问

相关视频

AWS 官方
AWS 官方已更新 2 年前