本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将数据源附加到 AWS AppSync数据源是 GraphQL APIs 可以与之交互的 AWS 账户中的资源。 AWS AppSync 支持多种数据源 AWS Lambda,例如亚马逊 DynamoDB、关系数据库(亚马逊 Aurora Serverless)、 OpenSearch 亚马逊服务和终端节点。HTTP AWS AppSync API可以配置为与多个数据源进行交互,从而使您能够将数据聚合到一个位置。 AWS AppSync 可以使用您账户中的现有 AWS 资源或代表您通过架构定义配置 DynamoDB 表。
以下部分将向您展示如何将数据源附加到 Graph API QL。
数据来源类型
现在,您已经在 AWS AppSync 控制台中创建了架构,可以将数据源附加到该架构。当您最初创建时API,可以选择在创建预定义架构期间预配置 Amazon DynamoDB 表。不过,我们不会在本节中介绍该选项。您可以在启动架构一节中查看该选项的示例。
相反,我们将研究所有 AWS AppSync 支持的数据源。在为您的应用程序选择正确的解决方案时,需要考虑很多因素。以下几节为每个数据来源提供一些额外的上下文。有关数据来源的一般信息,请参阅数据来源。
Amazon DynamoDB
Amazon DynamoDB 是可扩展应用程序的 “主要” 存储解决方案之一 AWS。DynamoDB 的核心组件是表,它就是一个数据集合。您通常会根据 Book
或 Author
等实体创建表。表条目信息存储为项目,这些项目是每个条目的唯一字段组。完整项目表示数据库中的一行/一个记录。例如,Book
条目的项目可能包括 title
和 author
及其值。像 title
和 author
这样的单独字段称为属性,它们类似于关系数据库中的列值。
你可以猜到,表将用于存储应用程序中的数据。 AWS AppSync 允许你将 DynamoDB 表连接到 GraphQL 来操作数据API。请从前端 Web 和移动博客中获取该使用案例。该应用程序允许用户注册社交媒体应用程序。用户可以加入组,并上传文章以向订阅该组的其他用户广播。他们的应用程序将用户、文章和用户组信息存储在 DynamoDB 中。GraphQLAPI(由管理 AWS AppSync)与 DynamoDB 表接口。当用户在系统中做出将反映在前端的更改时,G API raphQL 会检索这些更改并将其实时广播给其他用户。
AWS Lambda
Lambda 是一种事件驱动的服务,它自动构建所需的资源以运行代码,从而响应事件。Lambda 使用函数,这些函数是包含用于执行资源的代码、依赖项和配置的组语句。在函数检测到触发器(一组调用函数的活动)时,将自动执行函数。触发器可以是应用程序API拨打电话、账户中的 AWS 服务启动资源等。触发后,函数将处理事件,这些事件是包含要修改的数据的JSON文档。
Lambda 非常适合运行代码,无需预置资源即可运行。请从前端 Web 和移动博客中获取该使用案例。该使用案例与 DynamoDB 一节中说明的使用案例有点相似。在此应用程序中,GraphQL API 负责定义诸如添加帖子(突变)和获取数据(查询)之类的操作。为了实施其操作的功能(例如 getPost ( id: String ! ) : Post
、getPostsByAuthor ( author: String ! ) : [ Post ]
),它们使用 Lambda 函数处理入站请求。根据选项 2: AWS AppSync 使用 Lambda 解析器,他们使用该 AWS AppSync 服务来维护自己的架构,并将 Lambda 数据源链接到其中一个操作。调用该操作时,Lambda 会与 Amazon RDS 代理接口,以便在数据库上执行业务逻辑。
Amazon RDS
Amazon RDS 允许您快速构建和配置关系数据库。在 Amazon 中RDS,您将创建一个通用数据库实例,该实例将用作云中的隔离数据库环境。在这种情况下,您将使用数据库引擎,即实际的RDBMS软件(Postgre SQL、My SQL 等)。该服务使用 AWS“基础架构”、修补和加密等安全服务提供可扩展性,从而减轻了大部分后端工作,并降低了部署的管理成本。
使用 Lambda 一节中的相同使用案例。在选项 3: AWS AppSync 使用亚马逊RDS解析器下,提供的另一个选项是将 G API raphQL 直接链接 AWS AppSync 到亚马逊RDS。他们使用数据API将数据库与 Graph API QL 关联起来。解析器附加到字段(通常是查询、突变或订阅),并实现访问SQL数据库所需的语句。在客户端发出调用该字段的请求时,解析器执行这些语句并返回响应。
Amazon EventBridge
在中 EventBridge,您将创建事件总线,这些管道接收来自您附加的服务或应用程序(事件源)的事件,并根据一组规则对其进行处理。事件是执行环境中的某种状态变化,而规则是事件的一组筛选条件。规则遵循事件模式或事件状态变化的元数据(ID、区域、ARN账号等)。当事件与事件模式匹配时, EventBridge 将通过管道将事件发送到目标服务(目标),并触发规则中指定的操作。
EventBridge 非常适合将状态更改操作路由到其他服务。请从前端 Web 和移动博客中获取该使用案例。该示例介绍了一个电子商务解决方案,该解决方案具有多个团队以维护不同的服务。其中的一种服务在前端针对每个交付步骤(下订单、处理中、发货、交付等)向客户提供订单更新。不过,管理该服务的前端团队无法直接访问订购系统数据,因为该数据是由单独的后端团队维护的。后端团队的订购系统也被描述为黑匣子,因此,很难收集有关他们如何设置数据结构的信息。但是,后端团队确实建立了一个系统,该系统通过由管理的事件总线发布订单数据 EventBridge。为了访问来自事件总线的数据并将其路由到前端,前端团队创建了一个指向他们的 GraphQL 的新目标。API AWS AppSync他们还创建一条规则,以仅发送与订单更新相关的数据。进行更新后,来自事件总线的数据将发送到 GraphQL API。中的架构API处理数据,然后将其传递到前端。
None 数据来源
如果不打算使用数据来源,您可以将其设置为 none
。虽然 none
数据来源仍明确归类为数据来源,但并不是存储介质。通常,解析器在某一时刻调用一个或多个数据来源以处理请求。不过,在某些情况下,您可能不需要处理数据来源。如果将数据来源设置为 none
,将运行请求,跳过数据调用步骤,然后运行响应。
从本 EventBridge 节中取同样的用例。在架构中,变更处理状态更新,然后将其发送给订阅者。回想一下解析器的工作方式,通常至少调用一次数据来源。不过,事件总线已自动发送本场景中的数据。这意味着变更不需要执行数据来源调用;可以直接在本地处理订单状态。变更设置为 none
,它充当传递值而不会调用数据来源。然后,使用数据填充架构,该数据将发送给订阅者。
OpenSearch
Amazon S OpenSearch ervice 是一套用于实现全文搜索、数据可视化和日志记录的工具。可以使用该服务查询您上传的结构化数据。
在此服务中,您将创建的实例 OpenSearch。这些实例称为节点。在节点中,您添加至少一个索引。从概念上讲,索引有点像关系数据库中的表。(但是, OpenSearch 不ACID合规,因此不应以这种方式使用)。您将使用上传到 OpenSearch 服务的数据填充索引。在上传您的数据时,将使用索引中存在的一个或多个分片对其编制索引。分片就像索引的一个分区,其中包含一些数据,并且可以与其他分片分开查询。上传后,您的数据将被结构化为名为JSON文档的文件。然后,您可以查询节点以获取文档中的数据。
HTTP端点
您可以使用HTTP端点作为数据源。 AWS AppSync 可以向端点发送包含参数和有效载荷等相关信息的请求。HTTP响应将公开给解析器,解析器将在完成操作后返回最终响应。
添加数据来源
如果您创建了数据源,则可以将其链接到 AWS AppSync 服务,更具体地说,可以链接到服务API。
- Console
-
-
登录 AWS Management Console 并打开AppSync控制台。
-
API在控制面板中选择你的。
-
在侧边栏中,选择数据来源。
-
选择创建数据来源。
-
命名您的数据来源。您也可以为其提供描述,但这是可选的。
-
选择您的数据来源类型。
-
对于 DynamoDB,必须选择您的区域,然后选择该区域中的表。您可以选择创建新的通用表角色或导入表的现有角色,以规定与表交互的规则。您可以启用版本控制,在多个客户端同时尝试更新数据时,该功能可以自动为每个请求创建数据版本。版本控制用于保留和维护多个数据变体,以实现冲突检测和解决目的。您还可以启用自动架构生成,它会获取您的数据源并生成在架构中访问数据源所需的一些CRUDList
、和Query
操作。
对于 OpenSearch,您必须选择您的区域,然后选择该区域中的域(集群)。您可以选择创建新的通用表角色或导入表的现有角色,以规定与域交互的规则。
对于 Lambda,您必须选择您的区域,然后选择该区域中的 ARN Lambda 函数。您可以选择创建新的通用表角色或导入表的现有角色,以规定与 Lambda 函数交互的规则。
对于HTTP,您必须输入您的HTTP终端节点。
对于 EventBridge,你必须选择你所在的地区,然后选择该地区的活动巴士。您可以选择创建新的通用表角色或导入表的现有角色,以规定与事件总线交互的规则。
对于RDS,您必须选择您的区域,然后选择密钥存储库(用户名和密码)、数据库名称和架构。
对于“None”,您将添加一个没有实际数据来源的数据来源。这是为了在本地处理解析器,而不是通过实际数据来源。
如果要导入现有的角色,它们需要使用信任策略。有关更多信息,请参阅IAM信任策略。
-
选择创建。
或者,如果要创建 DynamoDB 数据来源,您可以转到控制台中的架构页面,选择页面顶部的创建资源,然后填写一个预定义模型以转换为表。在该选项中,您填写或导入基本类型,配置包括分区键在内的基本表数据,并检查架构更改。
- CLI
-
-
运行 create-data-source
命令以创建数据来源。
您需要为该特定命令输入一些参数:
-
你api-id
的API.
-
您的表的 name
。
-
数据来源的 type
。根据您选择的数据来源类型,您可能需要输入 service-role-arn
和 -config
标签。
示例命令可能如下所示:
aws appsync create-data-source --api-id abcdefghijklmnopqrstuvwxyz --name data_source_name --type data_source_type --service-role-arn arn:aws:iam::107289374856:role/role_name --[data_source_type]-config {params}
- CDK
-
在使用之前CDK,我们建议您查看CDK的官方文档以及 AWS AppSyncCDK参考文献。
下面列出的步骤仅显示用于添加特定资源的一般代码片段示例。这并不意味着,它是您的生产代码中的有效解决方案。我们还假设您已具有正常工作的应用程序。
要添加您的特定数据来源,您需要将构造添加到堆栈文件中。可以在此处找到一个数据来源类型列表:
-
一般来说,您可能需要将 import 指令添加到您使用的服务中。例如,它可能采用以下形式:
import * as x
from 'x
'; # import wildcard as the 'x' keyword from 'x-service'
import {a
, b
, ...} from 'c
'; # import {specific constructs} from 'c-service'
例如,您可以通过以下方式导入 AWS AppSync 和 DynamoDB 服务:
import * as appsync from 'aws-cdk-lib/aws-appsync';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
-
有些服务(如创建、角色和访问凭证)RDS需要在堆栈文件中进行一些额外的设置,然后才能VPC创建数据源。有关更多信息,请参阅相关CDK页面中的示例。
-
对于大多数数据源,尤其是 AWS 服务,您将在堆栈文件中创建数据源的新实例。通常,这会如下所示:
const add_data_source_func
= new service_scope
.resource_name
(scope: Construct, id: string, props: data_source_props);
例如,以下是一个示例 Amazon DynamoDB 表:
const add_ddb_table = new dynamodb.Table(this, 'Table_ID', {
partitionKey: {
name: 'id',
type: dynamodb.AttributeType.STRING,
},
sortKey: {
name: 'id',
type: dynamodb.AttributeType.STRING,
},
tableClass: dynamodb.TableClass.STANDARD,
});
大多数数据来源至少具有一个必需的属性(不使用 ?
符号表示)。请查阅CDK文档以了解需要哪些道具。
-
接下来,你需要将数据源链接到 GraphQL API。建议的方法是,在为管道解析器创建函数时添加数据来源。例如,下面的代码片段是一个扫描 DynamoDB 表中的所有元素的函数:
const add_func = new appsync.AppsyncFunction(this, 'func_ID', {
name: 'func_name_in_console',
add_api,
dataSource: add_api.addDynamoDbDataSource('data_source_name_in_console', add_ddb_table),
code: appsync.Code.fromInline(`
export function request(ctx) {
return { operation: 'Scan' };
}
export function response(ctx) {
return ctx.result.items;
}
`),
runtime: appsync.FunctionRuntime.JS_1_0_0,
});
在dataSource
道具中,你可以调用 G API raphQL add_api
() 并使用其内置方法之一 addDynamoDbDataSource
() 在表和 GraphQL 之间建立关联。API参数是此链接的名称,该链接将存在于 AWS AppSync 控制台data_source_name_in_console
中(在本例中)和表方法(add_ddb_table
)。您在下一节中开始创建解析器,此时,将介绍有关该主题的更多信息。
可以使用多种替代方法链接数据来源。从技术上讲,您可以将 api
添加到表函数的属性列表中。例如,以下是第 3 步中的片段,但其中的api
道具包含 GraphQL:API
const add_api = new appsync.GraphqlApi(this, 'API_ID', {
...
});
const add_ddb_table = new dynamodb.Table(this, 'Table_ID', {
...
api: add_api
});
或者,您可以单独调用 GraphqlApi
构造:
const add_api = new appsync.GraphqlApi(this, 'API_ID', {
...
});
const add_ddb_table = new dynamodb.Table(this, 'Table_ID', {
...
});
const link_data_source = add_api.addDynamoDbDataSource('data_source_name_in_console', add_ddb_table);
我们建议仅在函数的属性中创建关联。否则,你要么必须在 AWS AppSync 控制台中手动将解析器函数链接到数据源(如果你想继续使用控制台值data_source_name_in_console
),要么在函数中使用另一个名称创建单独的关联,比如data_source_name_in_console_2
。这是由于属性处理信息的方式的限制造成的。
IAM信任政策
如果您为数据源使用现有IAM角色,则需要向该角色授予相应的权限,以便对您的 AWS 资源(例如在 Amazon DynamoDB 表PutItem
上)执行操作。您还需要修改该角色的信任策略 AWS AppSync 以允许将其用于资源访问,如以下示例策略所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "appsync.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
您也可以根据需要在信任策略中添加条件,以限制对数据来源的访问。目前,可以在这些条件中使用 SourceArn
和 SourceAccount
键。例如,以下策略仅限账户 123456789012
访问数据来源:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "appsync.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "123456789012"
}
}
}
]
}
或者,您可以使用以下策略将对数据源的访问权限限制为特定的数据源 APIabcdefghijklmnopq
,例如:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "appsync.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "arn:aws:appsync:us-west-2:123456789012:apis/abcdefghijklmnopq"
}
}
}
]
}
您可以使用以下策略将访问权限限制为 AWS AppSync APIs来自特定区域的所有人us-east-1
,例如:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "appsync.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "arn:aws:appsync:us-east-1:123456789012:apis/*"
}
}
}
]
}
在下一节(配置解析器)中,我们将添加解析器业务逻辑,并将其附加到架构中的字段以处理数据来源中的数据。
有关角色策略配置的更多信息,请参阅《IAM用户指南》中的修改角色。
有关解析人员的跨账户访问权限的更多信息 AWS AppSync,请参阅为构建跨账户 AWS LambdaAWS Lambda解析器。 AWS AppSync