Lambda 解析程序映射模板参考 - AWS AppSync
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Lambda 解析程序映射模板参考

借助 AWS AppSync Lambda 解析程序映射模板,您能够塑造从 AWS AppSync 到您账户中 AWS Lambda 函数的请求的形状以及从 Lambda 函数返回到 AWS AppSync 的响应的形状。通过映射模板,还可以向 AWS AppSync 提供提示以指出要调用的操作的性质。本节介绍用于支持的 AWS Lambda 操作的不同映射模板。

请求映射模板

Lambda 请求映射模板相当简单,允许尽可能多的上下文信息传递到 Lambda 函数。

{ "version": string, "operation": Invoke|BatchInvoke, "payload": any type }

下面是 Lambda 请求映射模板的 JSON 架构表示形式(解析后)。

{ "definitions": {}, "$schema": "https://json-schema.org/draft-06/schema#", "$id": "https://aws.amazon.com/appsync/request-mapping-template.json", "type": "object", "properties": { "version": { "$id": "/properties/version", "type": "string", "enum": [ "2017-02-28" ], "title": "The Mapping template version.", "default": "2017-02-28" }, "operation": { "$id": "/properties/operation", "type": "string", "enum": [ "Invoke", "BatchInvoke" ], "title": "The Mapping template operation.", "description": "What operation to execute.", "default": "Invoke" }, "payload": {} }, "required": [ "version", "operation" ], "additionalProperties": false }

在下面的示例中,我们选择从上下文传递 field 值和 GraphQL 字段参数。

{ "version": "2017-02-28", "operation": "Invoke", "payload": { "field": "getPost", "arguments": $utils.toJson($context.arguments) } }

整个映射文档将作为输入传递到 Lambda 函数,这时上述示例如下所示:

{ "version": "2017-02-28", "operation": "Invoke", "payload": { "field": "getPost", "arguments": { "id": "postId1" } } }

version

version 定义模板使用的版本,这一点对于所有请求映射模板都相同。version 是必需的。

"version": "2017-02-28"

operation

Lambda 数据源让您可以定义两个操作:InvokeBatchInvokeInvoke 让 AWS AppSync 知道针对每个 GraphQL 字段解析程序调用 Lambda 函数,而 BatchInvoke 指示 AWS AppSync 批处理对当前 GraphQL 字段的请求。

对于 Invoke,已解析的请求映射模板与 Lambda 函数的输入负载完全匹配。因此,下面的示例模板:

{ "version": "2017-02-28", "operation": "Invoke", "payload": { "arguments": $utils.toJson($context.arguments) } }

经过解析并传递给 Lambda 函数,如下所示:

{ "version": "2017-02-28", "operation": "Invoke", "payload": { "arguments": { "id": "postId1" } } }

对于 BatchInvoke,将对批处理中的每个字段解析程序应用映射模板。为简洁起见,AWS AppSync 将所有已解析的映射模板 payload 值合并到与映射模板匹配的单一对象下的列表中。

以下示例模板显示合并:

{ "version": "2017-02-28", "operation": "BatchInvoke", "payload": $utils.toJson($context) }

此模板解析为以下映射文档:

{ "version": "2017-02-28", "operation": "BatchInvoke", "payload": [ {...}, // context for batch item 1 {...}, // context for batch item 2 {...} // context for batch item 3 ] }

其中,payload 列表的每个元素对应于一个批处理项目。Lambda 函数也预期返回列表形状的响应,并与请求中发送的项目顺序匹配,如下所示:

[ { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 1 { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 2 { "data": {...}, "errorMessage": null, "errorType": null } // result for batch item 3 ]

operation 是必需的。

payload

payload 字段是一个容器,可用于将任何格式正确的 JSON 传递到 Lambda 函数。

如果 operation 字段设置为 BatchInvoke,AWS AppSync 会将现有 payload 值包装成列表。

payload 为可选项。

响应映射模板

对于其他数据源,Lambda 函数将响应发送到 AWS AppSync,此响应需要转换为 GraphQL 类型。

Lambda 函数的结果将在通过 VTL context 属性提供的 $context.result 对象上设置。

如果 Lambda 函数响应的形状与 GraphQL 类型的形状完全匹配,您可以使用以下响应映射模板转发响应:

$utils.toJson($context.result)

没有必填字段,也没有形状限制应用于响应映射模板。但是,由于 GraphQL 是强类型化的,因此解析的映射模板必须与预期的 GraphQL 类型匹配。

Lambda 函数批处理响应

如果 operation 字段设置为 BatchInvoke,AWS AppSync 预计从 Lambda 函数返回项目列表。为了让 AWS AppSync 将每个结果映射回原始请求项目,响应列表在大小和顺序方面必须匹配。响应列表可以有 null 项目;$ctx.result 将相应地设置为 null