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

上次更新时间:2020 年 1 月 8 日

如何创建 AWS Lambda 函数来处理通过 Amazon API Gateway API 传递的消息的自定义标头?

简短描述

默认情况下,Lambda 函数仅提取 API Gateway API 接收到的请求正文。要将自定义标头从 API Gateway API 传递到 Lambda 函数,需使用 curl 以正文映射模板将消息发送到 API,以提取添加到消息中的所有自定义标头。

API 将更新后的消息发送给 Lambda 函数以处理标头,并从原始消息中返回一个或多个标头值。

解决方法

配置 IAM 权限

为 Lambda 和 API Gateway 配置所需的 AWS Identity and Access Management (IAM) 权限。有关更多信息,请参阅使用 IAM 权限控制对 API 的访问

为了进行测试,创建一个 IAM 角色并附加 AWS 托管策略 AmazonAPIGatewayInvokeFullAccessAmazonAPIGatewayPushToCloudWatchLogs

创建 Lambda 函数

1.    打开 Lambda 控制台

2.    如果您是初次使用 Lambda,请选择立即开始使用。否则请选择创建函数。此时将打开创建函数页面,显示从头开始创建选项。

3.    选择从头开始创建后,在基本信息下执行以下操作:
函数名称输入一个名称,例如 CustomHeaders
运行时中选择 Node.js 12.x

4.    在权限下,展开选择或创建执行角色

5.    选择使用现有角色

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

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 API

1.    打开 API Gateway 控制台

2.    如果您在控制台中已有任何 API,选择创建 API。如果没有,则继续执行下一步骤。

3.    对于选择 API 类型,在 REST API 下,选择构建

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

5.    在设置下,执行以下操作:
输入 API 名称,例如 SendtoLambda
(可选)输入说明
终端节点类型保留为区域

6.    选择创建 API

配置 API

1.    在 API Gateway 控制台的新 API 的资源窗格中,选择操作,然后选择创建资源

2.    在新建子资源窗格中,执行以下操作:
输入资源名称,例如 HeadersResource
选择创建资源

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

4.    从 /headersresource 下的下拉菜单中选择 POST,然后选择复选标记图标。

5.    在 /headersresource - POST - 设置 窗格中,执行以下操作来配置您的集成点:
集成类型中选择 Lambda 函数
Lambda 区域中选择您的 Lambda 函数的 AWS 区域。
对于 Lambda 函数,请输入 Lambda 函数的名称。
选择保存

6.    在向 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.    在 API Gateway 控制台 API 的资源窗格中,选择操作,然后选择部署 API

2.    在部署 API 对话框中,执行以下操作:
部署阶段部分选择[新建阶段]
阶段名称部分输入名称,例如 test
(可选)输入阶段描述部署描述
选择部署

3.    在阶段编辑器窗格中,将调用 URL 复制到您的剪切板。该 URL 类似于以下内容:https://1a2bc3d456.execute-api.region.amazonaws.com/test

测试您的 API

使用 curl 将消息发送到您的 API Gateway API。如需关于 curl 的更多信息,请参见 cURL 项目网站

提示:要在 Windows 上安装 curl,您可以下载适合 Windows 的 Git,其中包括 GNU Bash shell 和其他 Linux 工具,例如 curl、tail、cat、grep、gzip 和 Perl。要下载 Windows 版 Git,请参阅 Git 网站上的下载。有关 Bash 的更多信息,请参阅 GNU 网站上的 GNU Bash

此示例命令返回 Lambda 函数引用的 header1 标头的值:

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

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

如果成功,您将看到以下输出:

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