亚马逊AWS官方博客
AWS Amplify 新推出针对 AWS CDK 的 MySQL 和 PostgreSQL 数据库查询功能
今天,我们宣布正式发布一项新功能:支持通过 AWS Cloud Development Kit(AWS CDK)连接和查询您现有的 MySQL 数据库和 PostgreSQL 数据库,为 Amazon Web Services(AWS)内部或外部的关系数据库创建实时、安全的 GraphQL API。现在,您只需使用数据库端点和凭证,即可为关系数据库的所有操作生成完整的 API。当您的数据库架构发生变化时,您可以通过运行命令,应用最新的表架构更改。
2021 年,我们宣布推出了 AWS Amplify GraphQL Transformer 第 2 版,让即使只具有少量云技术专业知识开发人员也能够基于 GraphQL,开发功能丰富、灵活性高、可扩展性强的应用程序后端。这个新版本的 GraphQL Transformer 经过彻底重新设计,能够生成可扩展的管道解析器,以分发 GraphQL API 请求,应用业务逻辑(如授权),并与 Amazon DynamoDB 等底层数据来源进行通信。
然而,除了 Amazon DynamoDB 外,客户也希望使用 Amazon RDS 或 Amazon Aurora 等关系数据库为 GraphQL API 提供数据来源。您现在可以将 @model
类型的 Amplify GraphQL API 用于关系数据库和 DynamoDB 这两种数据来源。关系数据库信息将生成到单独的 schema.sql.graphql
文件中。您可以继续使用常规的 schema.graphql
文件创建和管理 DynamoDB 支持的类型。
如果您仅提供 MySQL 或 PostgreSQL 数据库的信息,无论该数据库是隐藏在虚拟私有云(VPC)中,还是可通过互联网公开访问,AWS Amplify 都将自动生成可修改的 GraphQL API。该 API 可以安全地连接您的数据库表,并公开创建、读取、更新或删除 (CRUD)查询和变更。您也可以重命名数据模型,使其更符合前端命名习惯。例如,一个数据库表名为“todos”(复数,字母全部小写),但以“ToDo”(单数,帕斯卡命名法)这个名称公开给客户端。
只需一行代码,您就可以将任何现有的 Amplify GraphQL 授权规则添加到您的 API 中,以便无缝构建基于所有者的授权或公开只读模式等用例。生成的 API 基于 AWS AppSync 的 GraphQL 功能构建,因此提供现成可用的安全实时订阅功能。从任何数据模型订阅任何 CRUD 事件也只需几行代码。
在 AWS CDK 中利用 MySQL 数据库开始使用
AWS CDK 允许您使用编程语言强大的表达能力,在云端构建可靠、可扩展、经济实惠的应用程序。若要开始使用,请在本地计算机上安装 AWS CDK。
运行以下命令,验证安装是否正确,并打印 AWS CDK 的版本号。
接下来,为您的应用程序创建一个新目录:
使用 cdk init
命令初始化 CDK 应用程序。
在新的 CDK 项目中安装 Amplify 的 GraphQL API 架构:
打开 CDK 项目中的主堆栈文件(路径通常为 lib/<your-project-name>-stack.ts
)。在文件顶部导入必要的架构:
通过在您的 MySQL 数据库中执行以下 SQL 语句,为新的关系数据库 API 生成 GraphQL 架构。请确保将结果输出到 .csv 文件中,其中应包含列标题,然后将 <database-name>
替换为数据库或/和架构的名称。
运行以下命令,将 <path-schema.csv>
替换为在上一步中创建的 .csv 文件的路径。
您可以打开 schema.sql.graphql
文件,查看从 MySQL 数据库架构导入的数据模型。
如果您尚未完成,请前往 AWS Systems Manager 控制台中的参数存储部分,为数据库连接的详细信息(如主机名称/URL
、数据库名称
、端口
、用户名
和密码
)创建参数。在下一步,Amplify 需要这些信息才能成功连接您的数据库,并对其执行 GraphQL 查询或变更。
在主堆栈类中,添加以下代码,定义新的 GraphQL API。将 dbConnectionConfg
选项替换为在上一步中创建的参数路径。
此配置假设您的数据库可通过互联网访问。此外,AWS AppSync 的默认授权模式已设置为 Api 密钥,并启用了沙盒模式,使所有模型均可被公开访问。这有助于您在添加更精细的授权规则之前,对 API 进行测试。
最后,将您的 GraphQL API 部署到 AWS Cloud。
现在,您可以前往 AWS AppSync 控制台,找到您创建的 GraphQL API。
选择您的项目和查询菜单。您可以看到新创建的,并与您的 MySQL 数据库表兼容的 GraphQL API,例如,用于获取一个项目的 getMeals
,或用于列出所有项目的 listRestaurants
。
举例而言,当您选择包含 address
、city
、name
和 phone_number
等字段的项目时,可以看到新的 GraphQL 查询。选择运行按钮,即可看到来自 MySQL 数据库的查询结果。
如果您查询 MySQL 数据库,可以看到相同的结果。
如何为数据库自定义 GraphQL 架构
要在您的 SQL 中添加自定义查询或变更,请打开生成的 schema.sql.graphql
文件,然后通过 @sql(statement: "")
传入使用 :<variable>
表示法的参数。
对于较长、较复杂的 SQL 查询,您可以在 customSqlStatements
配置选项中引用 SQL 语句。引用值必须与映射到 SQL 语句的属性名称相匹配。以下示例引用了 customSqlStatements
中的 searchPosts
属性:
以下是在 API 定义中映射 SQL 语句的方式。
SQL 语句将像在架构中以内联方式定义过一样执行。在使用参数、确保 SQL 语法有效,以及匹配返回类型方面,同样的规则也适用。使用引用文件可保持架构的整洁,并允许跨字段复用 SQL 语句。对于较长、较复杂的 SQL 查询,这是最佳做法。
或者,您也可以使用 @refersTo
指令更改字段和模型的名称。如果您未提供 @refersTo
指令,AWS Amplify 将假设模型和字段的名称与数据库表和列的名称完全匹配。
如果您想在两个数据库表之间创建关系,请使用 @hasOne
和 @hasMany
指令建立一对一或一对多关系。使用 @belongsTo
指令可创建指向关系父项的双向关系。例如,您可以在餐厅与它的餐单之间建立一对多关系。
每当您更改了 GraphQL 架构或数据库实例中的数据库架构,都应将更改部署到云端:
每当您更改了 GraphQL 架构或数据库实例中的数据库架构,都应重新运行 SQL 脚本,并再次执行本指南前面提到的导出到 .csv 的步骤,以重新生成 schema.sql.graphql
,然后将您的更改部署到云端:
$ cdk deploy
要了解更多信息,请参阅 AWS Amplify 文档中的《将 API 连接到现有的 MySQL 或 PostgreSQL 数据库》。
现已推出
AWS Amplify 现在已经支持关系数据库,能够与部署在 Amazon VPC 内部,甚至 AWS Cloud 外部的任何 MySQL 数据库或 PostgreSQL 数据库协同工作。
不妨做出尝试,并将反馈发送至 AWS Amplify 的 AWS re:Post、Amplify GraphQL API 的 GitHub 存储库。或者,您也可以通过您常用的 AWS Support 联系方式提交反馈。
– Channy
附言:特别感谢 AWS 首席产品经理 René Huangtian Brandel 编写的示例代码。