教程:HTTP 解析器 - Amazon AppSync
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

教程:HTTP 解析器

除了使用任意 HTTP 终端节点解析 GraphQL 字段以外,Amazon AppSync 还允许您使用支持的数据源(即 Amazon Lambda、Amazon DynamoDB、Amazon OpenSearch Service 或 Amazon Aurora)执行各种操作。在您的 HTTP 终端节点可用后,您可以使用数据源连接它们。然后,您可以在架构中配置一个解析器以执行 GraphQL 操作(如查询、变更和订阅)。本教程将引导您了解一些常见示例。

在本教程中,您在 Amazon AppSync GraphQL 终端节点中使用 REST API(是使用 Amazon API Gateway 和 Lambda 创建的)。

创建 REST API

您可以使用以下 Amazon CloudFormation 模板来设置适用于本教程的 REST 终端节点:

Amazon CloudFormation 堆栈将执行以下步骤:

  1. 设置 Lambda 函数,其中包含您的微服务的业务逻辑。

  2. 使用以下终端节点/方法/内容类型组合设置一个 API Gateway REST API:

API 资源路径 HTTP 方法 支持的内容类型

/v1/users

POST

application/json

/v1/users

GET

application/json

/v1/users/1

GET

application/json

/v1/users/1

PUT

application/json

/v1/users/1

删除

application/json

创建您的 GraphQL API

要在 Amazon AppSync 中创建 GraphQL API,请执行以下操作:

  1. 打开 Amazon AppSync 控制台,然后选择创建 API

  2. 选择 GraphQL API,然后选择从头开始设计。选择下一步

  3. 对于 API 名称,请键入 UserData。选择下一步

  4. 选择 Create GraphQL resources later。选择下一步

  5. 检查您的输入,然后选择创建 API

Amazon AppSync 控制台使用 API 密钥身份验证模式为您创建新的 GraphQL API。您可以使用控制台进一步配置 GraphQL API 并运行请求。

创建 GraphQL 架构

现在,您有一个 GraphQL API,让我们创建一个 GraphQL 架构。在 Amazon AppSync 控制台的架构编辑器中,使用以下代码片段:

type Mutation { addUser(userInput: UserInput!): User deleteUser(id: ID!): User } type Query { getUser(id: ID): User listUser: [User!]! } type User { id: ID! username: String! firstname: String lastname: String phone: String email: String } input UserInput { id: ID! username: String! firstname: String lastname: String phone: String email: String }

配置您的 HTTP 数据源

要配置 HTTP 数据源,请执行以下操作:

  1. 在 Amazon AppSync GraphQL API 的数据源页面中,选择创建数据源

  2. 输入数据源的名称,例如 HTTP_Example

  3. 数据源类型中,选择 HTTP 终端节点

  4. 将终端节点设置为教程开始时创建的 API Gateway 终端节点。如果您导航到 Lambda 控制台并在应用程序下面找到您的应用程序,则可以找到堆栈生成的终端节点。在应用程序的设置中,您应该会看到一个 API 终端节点,它是您在 Amazon AppSync 中的终端节点。确保不要将阶段名称作为终端节点的一部分包含在内。例如,如果您的终端节点是 https://aaabbbcccd.execute-api.us-east-1.amazonaws.com/v1,您将键入 https://aaabbbcccd.execute-api.us-east-1.amazonaws.com

注意

目前,Amazon AppSync 仅支持公有终端节点。

有关 Amazon AppSync 服务识别的认证机构的更多信息,请参阅 Amazon AppSync 识别的 HTTPS 终端节点证书颁发机构 (CA)

配置解析器

在该步骤中,您将 HTTP 数据源连接到 getUseraddUser 查询。

要设置 getUser 解析器,请执行以下操作:

  1. 在 Amazon AppSync GraphQL API 中,选择架构选项卡。

  2. 架构编辑器右侧的解析器窗格中的 Query 类型下面,找到 getUser 字段并选择附加

  3. 将解析器类型保留为 Unit,并将运行时保留为 APPSYNC_JS

  4. 数据源名称中,选择您以前创建的 HTTP 终端节点。

  5. 选择创建

  6. 解析器代码编辑器中,添加以下代码片段以作为您的请求处理程序:

    import { util } from '@aws-appsync/utils' export function request(ctx) { return { version: '2018-05-29', method: 'GET', params: { headers: { 'Content-Type': 'application/json', }, }, resourcePath: `/v1/users/${ctx.args.id}`, } }
  7. 添加以下代码片段以作为您的响应处理程序:

    export function response(ctx) { const { statusCode, body } = ctx.result // if response is 200, return the response if (statusCode === 200) { return JSON.parse(body) } // if response is not 200, append the response to error block. util.appendError(body, statusCode) }
  8. 选择 Query (查询) 选项卡,然后运行以下查询:

    query GetUser{ getUser(id:1){ id username } }

    此查询应返回以下响应:

    { "data": { "getUser": { "id": "1", "username": "nadia" } } }

要设置 addUser 解析器,请执行以下操作:

  1. 选择架构选项卡。

  2. 架构编辑器右侧的解析器窗格中的 Query 类型下面,找到 addUser 字段并选择附加

  3. 将解析器类型保留为 Unit,并将运行时保留为 APPSYNC_JS

  4. 数据源名称中,选择您以前创建的 HTTP 终端节点。

  5. 选择创建

  6. 解析器代码编辑器中,添加以下代码片段以作为您的请求处理程序:

    export function request(ctx) { return { "version": "2018-05-29", "method": "POST", "resourcePath": "/v1/users", "params":{ "headers":{ "Content-Type": "application/json" }, "body": ctx.args.userInput } } }
  7. 添加以下代码片段以作为您的响应处理程序:

    export function response(ctx) { if(ctx.error) { return util.error(ctx.error.message, ctx.error.type) } if (ctx.result.statusCode == 200) { return ctx.result.body } else { return util.appendError(ctx.result.body, "ctx.result.statusCode") } }
  8. 选择 Query (查询) 选项卡,然后运行以下查询:

    mutation addUser{ addUser(userInput:{ id:"2", username:"shaggy" }){ id username } }

    如果再次运行 getUser 查询,它应该会返回以下响应:

    { "data": { "getUser": { "id": "2", "username": "shaggy" } } }

调用 Amazon 服务

您可以使用 HTTP 解析器为 Amazon 服务设置 GraphQL API 接口。发送到 Amazon 的 HTTP 请求必须使用签名版本 4 流程进行签名,以使 Amazon 可以识别发送者。Amazon在将 IAM 角色与 HTTP 数据源关联时,AppSync 代表您计算签名。

您提供两个额外的组件以使用 HTTP 解析器调用 Amazon 服务:

  • 有权调用 Amazon 服务 API 的 IAM 角色

  • 数据源中的签名配置

例如,如果要使用 HTTP 解析器调用 ListGraphqlApis 操作,您需要先创建由 Amazon AppSync 担任的 IAM 角色并附加以下策略:

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "appsync:ListGraphqlApis" ], "Effect": "Allow", "Resource": "*" } ] }

接下来,为 Amazon AppSync 创建 HTTP 数据源。在该示例中,您在美国西部(俄勒冈州)区域中调用 Amazon AppSync。在名为 http.json 文件中设置以下 HTTP 配置,其中包括签名区域和服务名称:

{ "endpoint": "https://appsync.us-west-2.amazonaws.com/", "authorizationConfig": { "authorizationType": "AWS_IAM", "awsIamConfig": { "signingRegion": "us-west-2", "signingServiceName": "appsync" } } }

然后,使用 Amazon CLI 创建具有关联角色的数据源,如下所示:

aws appsync create-data-source --api-id <API-ID> \ --name AWSAppSync \ --type HTTP \ --http-config file:///http.json \ --service-role-arn <ROLE-ARN>

在将一个解析器附加到架构中的字段时,请使用以下请求映射模板调用 Amazon AppSync:

{ "version": "2018-05-29", "method": "GET", "resourcePath": "/v1/apis" }

在为该数据源运行 GraphQL 查询时,Amazon AppSync 使用您提供的角色对请求进行签名,并将签名包含在请求中。该查询返回您的账户在该 Amazon 区域中的 Amazon AppSync GraphQL API 列表。