

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

# 使用 RDS 内省构建 GraphQ APIs L
<a name="rds-introspection"></a>

AWS AppSync的自省实用程序可以从数据库表中发现模型并建议 GraphQL 类型。 AWS AppSync 控制台的 “创建 API” 向导可以立即从 Aurora MySQL 或 PostgreSQL 数据库生成 API。它会自动创建用于读取和写入数据的类型和 JavaScript 解析器。

AWS AppSync 通过亚马逊 RDS 数据 API 提供与亚马逊 Aurora 数据库的直接集成。Amazon RDS 数据 API 不要求永久数据库连接，而是提供了一个安全 HTTP 终端节点，可以 AWS AppSync 连接到该终端节点以运行SQL语句。您可以利用这一点在 Aurora 上为您的 MySQL 和 PostgreSQL 工作负载创建关系数据库 API。

使用为关系数据库构建 API AWS AppSync 有以下几个优点：
+ 您的数据库不会直接暴露给客户端，从而使接入点与数据库本身分离。
+ 您可以根据不同应用程序的需求 APIs 量身定制构建，从而无需在前端使用自定义业务逻辑。这与 Backend-For-Frontend (BFF) 模式一致。
+ 可以使用各种授权模式在 AWS AppSync 层上实现授权和访问控制，以控制访问权限。无需额外的计算资源即可连接到数据库，例如托管 Web 服务器或代理连接。
+ 可以通过订阅添加实时功能，通过 AppSync 自动将数据变更推送到连接的客户端。
+ 客户端可以使用常用端口（例如 443）通过 HTTPS 连接到 API。

AWS AppSync 使基于现有关系数据库 APIs 的构建变得容易。它的自省实用程序可以从数据库表中发现模型并建议 GraphQL 类型。 AWS AppSync 控制台的*创建 API* 向导可以立即从 Aurora MySQL 或 PostgreSQL 数据库生成 API。它会自动创建用于读取和写入数据的类型和 JavaScript解析器。

AWS AppSync 提供了用于简化在解析器中编写 SQL 语句的集成 JavaScript 实用程序。您可以将 AWS AppSync的`sql`标签模板用于具有动态值的静态语句，也可以使用`rds`模块实用程序以编程方式生成语句。有关更多信息，请参阅 [RDS 的解析器函数参考](https://docs.aws.amazon.com//appsync/latest/devguide/resolver-reference-rds-js.html)数据来源和[内置模块](https://docs.aws.amazon.com//appsync/latest/devguide/built-in-modules-js.html#built-in-rds-modules)。

## 使用自省特征（控制台）
<a name="using-introspection-console"></a>

有关详细教程和入门指南，请参阅[教程：带数据 API 的 Aurora PostgreSQL Serverless](https://docs.aws.amazon.com//appsync/latest/devguide/aurora-serverless-tutorial-js.html)。

 AWS AppSync 控制台允许您在短短几分钟内从配置了数据 API 的现有 Aurora 数据库创建 AWS AppSync GraphQL API。这会根据您的数据库配置快速生成操作架构。您可以按原样使用 API，也可以在它的基础之上构建来添加特征。

1. 登录 AWS 管理控制台 并打开[AppSync控制台](https://console.aws.amazon.com/appsync/)。

   1. 在**控制面板**中，选择**创建 API**。

1. **在 **API 选项下，选择** **GraphQL APIs**、**从亚马逊 Aurora 集群开始**，然后选择 “下一步”。**

   1. 输入 **API 名称**。这将在控制台中用作 API 的标识符。

   1. 对于**联系信息**，您可以输入联系人以指定 API 的管理员。此为可选字段。

   1. 在**私有 API 配置**下面，您可以启用私有 API 功能。只能从配置的 VPC 终端节点 (VPCE) 中访问私有 API。有关更多信息，请参阅[私有 APIs](https://docs.aws.amazon.com//appsync/latest/devguide/using-private-apis.html)。

      对于该示例，我们不建议启用该功能。在检查您的输入后，选择**下一步**。

1. 在**数据库**页面中，选择**选择数据库**。

   1. 您需要从集群中选择数据库。第一步是选择您的集群所在的**区域**。

   1. 从下拉列表中选择 **Aurora 集群**。请注意，在使用资源之前，您必须已创建并[启用](https://docs.aws.amazon.com//AmazonRDS/latest/AuroraUserGuide/data-api.html#data-api.enabling)相应的数据 API。

   1. 接下来，您必须将数据库的凭证添加到服务中。这主要是使用来完成的 AWS Secrets Manager。选择您的密钥所在的**区域**。有关如何检索密钥信息的更多信息，请参阅[查找密钥](https://docs.aws.amazon.com//secretsmanager/latest/userguide/manage_search-secret.html)或[检索密钥](https://docs.aws.amazon.com//secretsmanager/latest/userguide/retrieving-secrets.html)。

   1. 从下拉列表中添加您的密钥。请注意，用户必须对您的数据库具有[读取权限](https://docs.aws.amazon.com//AmazonRDS/latest/UserGuide/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-console)。

1. 选择**导入**。

   AWS AppSync 将开始内省您的数据库，发现表、列、主键和索引。它会检查 GraphQL API 是否支持所发现的表。请注意，为了支持创建新行，表需要一个可以使用多列的主键。 AWS AppSync 将表列映射到类型字段，如下所示：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/appsync/latest/devguide/rds-introspection.html)

1. 表发现完成后，**数据库**部分将填充您的信息。在新的**数据库表**部分中，表中的数据可能已经填充并转换为架构的类型。如果您没有看到某些必填数据，则可以通过以下方式进行检查：选择**添加表**，在出现的模式中单击这些类型的复选框，然后选择**添加**。

   要从**数据库表**部分删除类型，请单击要删除的类型旁边的复选框，然后选择**删除**。如果您想稍后再次添加，删除的类型将置于**添加表**模式中。

   请注意， AWS AppSync 使用表名作为类型名称，但您可以对其进行重命名，例如，将复数表名更改*movies*为类型名称*Movie*。要重命名**数据库表**部分中的类型，请单击要重命名的类型的复选框，然后单击**类型名称**列中的*铅笔*图标。

   要根据您的选择预览架构的内容，请选择**预览架构**。请注意，此架构不能为空，因此必须至少有一个表转换为类型。此外，此架构的大小不能超过 1MB。

   1. 在**服务角色**下，选择是专门为此导入创建新的服务角色，还是使用现有的角色。

1. 选择**下一步**。

1. 接下来，选择是创建只读 API（仅限查询），还是创建用于读取和写入数据（包含查询和突变）的 API。后者还支持由突变触发的实时订阅。

1. 选择**下一步**。

1. 查看您的选择，然后选择**创建 API**。 AWS AppSync 将创建 API 并将解析器附加到查询和突变。生成的 API 可完全运行，可以根据需要进行扩展。

## 使用自省特征 (API)
<a name="using-introspection-api"></a>

您可以使用 `StartDataSourceIntrospection` 自省 API 以编程方式发现数据库中的模型。有关该命令的更多详细信息，请参阅“使用 [https://docs.aws.amazon.com//appsync/latest/APIReference/API_StartDataSourceIntrospection.html](https://docs.aws.amazon.com//appsync/latest/APIReference/API_StartDataSourceIntrospection.html) API”。

要使用`StartDataSourceIntrospection`，请提供您的 Aurora 集群亚马逊资源名称 (ARN)、数据库名称和密钥 AWS Secrets Manager ARN。该命令启动自省过程。您可以使用 `GetDataSourceIntrospection` 命令检索结果。您可以指定该命令是否应返回已发现模型的存储定义语言 (SDL) 字符串。这对于直接从已发现的模型生成 SDL 架构定义非常有用。

 例如，如果您对简单 `Todos` 表使用以下数据定义语言 (DDL) 语句：

```
create table if not exists public.todos  
(  
id serial constraint todos_pk primary key,  
description text,  
due timestamp,  
"createdAt" timestamp default now()  
);
```

您从以下内容开始自省。

```
aws appsync start-data-source-introspection \ 
  --rds-data-api-config resourceArn=<cluster-arn>,secretArn=<secret-arn>,databaseName=database
```

接下来，使用 `GetDataSourceIntrospection` 命令检索结果。

```
aws appsync get-data-source-introspection \
  --introspection-id a1234567-8910-abcd-efgh-identifier \
  --include-models-sdl
```

这会返回以下结果。

```
{
    "introspectionId": "a1234567-8910-abcd-efgh-identifier",
    "introspectionStatus": "SUCCESS",
    "introspectionStatusDetail": null,
    "introspectionResult": {
        "models": [
            {
                "name": "todos",
                "fields": [
                    {
                        "name": "description",
                        "type": {
                            "kind": "Scalar",
                            "name": "String",
                            "type": null,
                            "values": null
                        },
                        "length": 0
                    },
                    {
                        "name": "due",
                        "type": {
                            "kind": "Scalar",
                            "name": "AWSDateTime",
                            "type": null,
                            "values": null
                        },
                        "length": 0
                    },
                    {
                        "name": "id",
                        "type": {
                            "kind": "NonNull",
                            "name": null,
                            "type": {
                                "kind": "Scalar",
                                "name": "Int",
                                "type": null,
                                "values": null
                            },
                            "values": null
                        },
                        "length": 0
                    },
                    {
                        "name": "createdAt",
                        "type": {
                            "kind": "Scalar",
                            "name": "AWSDateTime",
                            "type": null,
                            "values": null
                        },
                        "length": 0
                    }
                ],
                "primaryKey": {
                    "name": "PRIMARY_KEY",
                    "fields": [
                        "id"
                    ]
                },
                "indexes": [],
                "sdl": "type todos\n{\ndescription: String\n\ndue: AWSDateTime\n\nid: Int!\n\ncreatedAt: AW
SDateTime\n}\n"
            }
        ],
        "nextToken": null
    }
}
```