将现有 AppSync API 与/ Amplify 一起使用

Posted

技术标签:

【中文标题】将现有 AppSync API 与/ Amplify 一起使用【英文标题】:Using an exisiting AppSync API w/ Amplify 【发布时间】:2019-10-08 07:55:28 【问题描述】:

使用: AppSync、DynamoDB 和 Lambda

所以我有点纠结于如何在 React Native 中将 AppSync 集成到 Amplify 中。我在控制台上创建的 AWS AppSync 中有一个现有 API。此 API 有几个不同的模型,例如:用户、视频、视频评论等。这些模型中的一些对象具有自定义映射模板和解析器,这对应用程序非常重要。

例如,这是我们对架构的快速了解。

输入用户

userId:ID!

名称:字符串

uploadedVideos(limit: Int, nextToken: String): VideoConnection

等等等等

输入视频

videoID:ID!

对象:S3Object

userId:ID!

上传者:用户

我们有一个解析器,它运行一个简单的 getVideo 查询,它将使用 userId 检索 uploadBy 属性,并检索该用户的所有必要信息。

此外,我们为模型创建的数据源(dynamoDb 表)具有主键,有些具有排序键。就像 VideoLikes 表一样,它跟踪谁喜欢视频并避免重复,主键是 VideoID,排序键是 UserID。这只是一个小例子,我们在其他地方这样做也是为了访问 LSI。

当我开始使用 Amplify 时,我尝试重新创建 AppSync API,因为我喜欢 CloudFormation 功能在不同的暂存环境中的强大功能。但是,我注意到模型的 DynamoDB 是自动定义的,并被自动设置为 id 作为主键。我们使用 LSI 来帮助按某些值排序,例如,如果我们想按喜欢的数量或 cmets 对视频进行排序,那么不幸的是,这对我们不起作用。因此,当我注意到这一点时,我使用了原始 AppSync API 中的“Codegen”命令并遇到了一个问题,即我的解析器和映射模板没有与架构、查询、突变和订阅一起复制,导致大多数查询失败,因为那些数据源丢失了。

所以我的问题是:

有没有办法在我的 React Native 应用程序中集成/使用现有 AppSync API 中的所有内容?这包括自定义解析器和映射模板。 如果不是

直接在 Amplify CLI 中创建 API 时,是否可以为模型的 DynamoDB 设置主键和排序键? 如果不是

是否有另一种方法可以在不使用 LSI 和 GSI 的情况下在 DynamoDB 中有效地对数据进行排序?如果模型自动生成带有 GSI 的表,这可能会有问题,因为我知道 GSI 有点贵,所以我想尽可能避免使用这些。是否有其他服务可以对 DynamoDB 中可在 AppSync 中使用的数据进行排序? 任何帮助将不胜感激,谢谢。

【问题讨论】:

【参考方案1】:

有没有办法在我的 React Native 应用程序中集成/使用现有 AppSync API 中的所有内容?

是的,您可以根据需要部署 API,然后使用放大客户端工具使用它。您始终可以使用 Ampify CLI 的代码生成功能,而无需通过 amplify api 类别部署 API。您可以使用自定义堆栈来定义不是由@model 生成的自定义解析器,但这将部署一个与现有 API 具有相同结构的新 API。

在 Amplify CLI 中直接创建 API 时,是否可以为模型的 DynamoDB 设置主键和排序键?

很快。这里有一个 RFC https://github.com/aws-amplify/amplify-cli/issues/1062,实现在 PR 这里 https://github.com/aws-amplify/amplify-cli/pull/1463。

是否有另一种方法可以在不使用 LSI 和 GSI 的情况下在 DynamoDB 中有效地对数据进行排序?

不可以,但是您可以使用索引重载来创建 1 个索引存储并对多个不同的概念对象类型进行排序。 TBH 这是一个复杂的主题,但这是一个很好的起点https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-gsi-overloading.html

【讨论】:

谢谢!我非常感谢您的帮助。如果您不介意,请附加问题。您使用过 CloudSearch/ElasticSearch 吗?我们想用我们的 DynamoDB 数据构建一个搜索功能,但我们正在尝试找出使用哪一个 如果您使用@searchable 指令,Amplify 代码生成将创建一个 CloudFormation 堆栈,将数据从 DynamoDB 流式传输到 ElasticSearch,从而允许您直接在 GraphQL 中编写复杂查询

以上是关于将现有 AppSync API 与/ Amplify 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

将手动创建的 Cognito 用户池与放大项目一起使用

将 AppSync 连接到现有 RDS 以更改移动应用程序状态

参考 AppSync 和 Cognito Auth 的现有设置

如何将 Amplify 配置为使用多个 AppSync 端点?

使用 AWS AppSync 将项目附加到 DynamoDB

如何将 Apollo 客户端与 AppSync 一起使用?