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

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

教程:亚马逊OpenSearchService 解析程序

Amazon AppSync支持使用 AmazonOpenSearch从您自己预配置的域中提供的域中提供的服务Amazon账户,假定它们不在 VPC 中存在。预配置域后,您可以使用数据源连接这些域,此时,您可以在架构中配置一个解析程序以执行 GraphQL 操作(如查询、更改和订阅)。本教程将引导您了解一些常见示例。

有关更多信息,请参阅 。解析程序映射模板参考OpenSearch.

一键设置

在中自动设置 GraphQL 终端节点Amazon AppSync与 AmazonOpenSearch您可以使用已配置的服务Amazon CloudFormationTemplate:

Amazon CloudFormation 部署完成后,可以直接跳到运行 GraphQL 查询和更改

创建新的OpenSearchService 域

要开始使用本教程,您需要一个现有的OpenSearchService 域。如果您没有域,可以使用以下示例。请注意,最多可能需要 15 分钟的时间才能完成OpenSearch请先创建服务域,然后才能继续操作以将此域与Amazon AppSync数据源。

aws cloudformation create-stack --stack-name AppSyncOpenSearch \ --template-url https://s3.us-west-2.amazonaws.com/awsappsync/resources/elasticsearch/ESResolverCFTemplate.yaml \ --parameters ParameterKey=ESDomainName,ParameterValue=ddtestdomain ParameterKey=Tier,ParameterValue=development \ --capabilities CAPABILITY_NAMED_IAM

你可以启动以下Amazon CloudFormation堆叠在您的美国西部 2(俄勒冈)区域Amazon账户:

为 配置数据源OpenSearch服务

After sourceOpenSearch服务域已创建,导航到您的Amazon AppSyncGraphQL API 然后选择数据源选项卡。选择New并输入数据源的友好名称,例如 “oss”。然后选择 。亚马逊OpenSearch域为了数据源类型选择适当的区域,此时您应看到您的OpenSearch已列出服务域。选择它之后,你可以创建一个新的角色,然后Amazon AppSync将分配与角色相应的权限;您也可以选择现有角色,该角色具有以下内联策略:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1234234", "Effect": "Allow", "Action": [ "es:ESHttpDelete", "es:ESHttpHead", "es:ESHttpGet", "es:ESHttpPost", "es:ESHttpPut" ], "Resource": [ "arn:aws:es:REGION:ACCOUNTNUMBER:domain/democluster/*" ] } ] }

您还需要与设置与的信任关系Amazon AppSync对于那个角色:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "appsync.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

此外,OpenSearch服务域有自己的访问策略你可以通过亚马逊进行修改OpenSearchService 控制台。您将需要使用适合于OpenSearchService 域。请注意,委托人将是AppSync可以在 IAM 控制台中找到数据源角色,如果您允许控制台创建此域。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNTNUMBER:role/service-role/APPSYNC_DATASOURCE_ROLE" }, "Action": [ "es:ESHttpDelete", "es:ESHttpHead", "es:ESHttpGet", "es:ESHttpPost", "es:ESHttpPut" ], "Resource": "arn:aws:es:REGION:ACCOUNTNUMBER:domain/DOMAIN_NAME/*" } ] }

连接解析程序

现在数据源已连接到您的OpenSearch服务域,您可以通过解析程序将其连接到您的架构,如以下示例所示:

schema { query: Query mutation: Mutation } type Query { getPost(id: ID!): Post allPosts: [Post] } type Mutation { addPost(id: ID!, author: String, title: String, url: String, ups: Int, downs: Int, content: String): Post } type Post { id: ID! author: String title: String url: String ups: Int downs: Int content: String } ...

请注意,有一个用户定义的 Post 类型(具有一个 id 字段)。在下面的示例中,我们假定有一个过程(可以自动执行)用于将此类型放入到您的OpenSearch服务域,它将映射到的路径根/id/post其中,其中id是指数和post是类型。在此根路径中,您可以通过 /id/post* 执行单独的文档搜索、通配符搜索;或者通过路径 /id/post/_search 执行多文档搜索。如果您有另一个类型 User(例如,在同一个索引 id 下编入索引的类型),您可以通过路径 /id/_search 执行多文档搜索。这会同时搜索 PostUser 上的字段。

从中的模式编辑器中Amazon AppSync控制台,修改前面的Posts要包含的架构searchPosts查询:

type Query { getPost(id: ID!): Post allPosts: [Post] searchPosts: [Post] }

保存架构。在右侧,对于 searchPosts,选择 Attach resolver (附加解析程序)。SELECTOpenSearch服务数据源。在 request mapping template (请求映射模板) 部分下,选择 Query posts (查询文章) 的下拉列表以获取基本模板。将 path 修改为 /id/post/_search。它应该类似以下内容:

{ "version":"2017-02-28", "operation":"GET", "path":"/id/post/_search", "params":{ "headers":{}, "queryString":{}, "body":{ "from":0, "size":50 } } }

这假设前面的架构有带有id字段,且文档已编入索引OpenSearch这个领域的服务。如果您以不同方式设置数据的结构,将需要相应地进行更新。

响应映射模板部分,你需要指定适当的_source过滤如果你想从OpenSearch服务查询并转换为 GraphQL。使用以下模板:

[ #foreach($entry in $context.result.hits.hits) #if( $velocityCount > 1 ) , #end $utils.toJson($entry.get("_source")) #end ]

修改您的搜索

上述的请求映射模板针对所有记录执行一个简单查询。假设您想要按某个特定作者进行搜索。此外,假设您希望该作者是在 GraphQL 查询中定义的一个参数。在 “架构编辑器” 中,Amazon AppSync控制台,添加allPostsByAuthor查询:

type Query { getPost(id: ID!): Post allPosts: [Post] allPostsByAuthor(author: String!): [Post] searchPosts: [Post] }

现在选择附加解析程序然后选择OpenSearchService Data source (服务数据源),但在响应映射模板

{ "version":"2017-02-28", "operation":"GET", "path":"/id/post/_search", "params":{ "headers":{}, "queryString":{}, "body":{ "from":0, "size":50, "query":{ "term" :{ "author": $util.toJson($context.arguments.author) } } } } }

请注意,body 用一个针对 author 字段的术语查询填充,它将作为一个参数从客户端进行传递。您可以选择已预填充信息(如标准文本),甚至使用其他实用程序

如果您使用此解析程序,则使用上例所示的相同信息填写响应映射模板

将数据添加到OpenSearch服务

您可能需要将数据添加到您的OpenSearchGraphQL 更改导致的服务域。这是一个用于搜索和其他用途的强大机制。因为你可以使用 GraphQL 订阅来实时使您的数据,它用作一种通知机制,用于将对您的数据进行的更新告知客户端。OpenSearchService 域。

返回到架构中的页面Amazon AppSync控制台然后选择附加解析程序(对于 )addPost()突变。SELECTOpenSearch再次使用服务数据源并使用以下内容响应映射模板(对于 )PostsSchema

{ "version":"2017-02-28", "operation":"PUT", "path": $util.toJson("/id/post/$context.arguments.id"), "params":{ "headers":{}, "queryString":{}, "body":{ "id": $util.toJson($context.arguments.id), "author": $util.toJson($context.arguments.author), "ups": $util.toJson($context.arguments.ups), "downs": $util.toJson($context.arguments.downs), "url": $util.toJson($context.arguments.url), "content": $util.toJson($context.arguments.content), "title": $util.toJson($context.arguments.title) } } }

和之前一样,这是一个介绍如何设置数据的结构的示例。如果您有不同的字段名称或索引,则需要相应地更新 pathbody。此示例还显示如何使用 $context.arguments 从您的 GraphQL 更改参数填充模板。

在继续操作之前,使用以下响应映射模板,这将在下一部分中详细说明:

$utils.toJson($context.result.get("_source"))

检索单个文档

最后,如果您希望使用getPost(id:ID)请在您的架构中查询以返回单个文档,请在Amazon AppSync然后选择控制台附加解析程序. SELECTOpenSearch再次使用服务数据源,并使用以下映射模板:

{ "version":"2017-02-28", "operation":"GET", "path": $util.toJson("/id/post/$context.arguments.id"), "params":{ "headers":{}, "queryString":{}, "body":{} } }

由于上面的 pathid 参数用于空正文,此命令将返回单个文档。但是,您需要使用以下响应映射模板,因为现在您返回的是单个项目而不是列表:

$utils.toJson($context.result.get("_source"))

执行查询和更改

您现在应该能够针对您的执行 GraphQL 操作。OpenSearchService 域。导航到查询选项卡的选项卡Amazon AppSync并添加新记录:

mutation { addPost( id:"12345" author: "Fred" title: "My first book" content: "This will be fun to write!" ){ id author title } }

如果此记录成功插入,您将在右侧看到相应字段。同样,您现在可以运行searchPosts查询你的OpenSearchService 域:

query { searchPosts { id title author content } }

最佳实践

  • OpenSearch服务应该用于查询数据,而不是作为您的主数据库。您可能需要使用OpenSearch中所述将与 Amazon DynamoDB 结合使用的服务Service GraphQL 解析程序.

  • 仅允许通过允许Amazon AppSync访问群集的服务角色。

  • 您可以通过最低成本的集群先开始小规模开发,然后随着您转向生产阶段,而转至具有高可用性 (HA) 的较大集群。