

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 RDS 自我檢查建置 GraphQL APIs
<a name="rds-introspection"></a>

AWS AppSync的自我檢查公用程式可以從資料庫資料表探索模型，並提議 GraphQL 類型。 AWS AppSync 主控台的建立 API 精靈可以立即從 Aurora MySQL 或 PostgreSQL 資料庫產生 API。它會自動建立類型和 JavaScript 解析程式來讀取和寫入資料。

AWS AppSync 透過 Amazon RDS Data API 提供與 Amazon Aurora 資料庫的直接整合。Amazon RDS Data API 提供連線至 以 AWS AppSync 執行SQL陳述式的安全 HTTP 端點，而不需要持久性資料庫連線。您可以使用此項目為 Aurora 上的 MySQL 和 PostgreSQL 工作負載建立關聯式資料庫 API。

使用 為關聯式資料庫建置 API AWS AppSync 有幾個優點：
+ 您的資料庫不會直接公開給用戶端，將存取點與資料庫本身解耦。
+ 您可以建置專為不同應用程式需求量身打造的專用 APIs，消除前端自訂商業邏輯的需求。這符合 Backend-For-Frontend (BFF) 模式。
+ 您可以使用各種授權模式在 AWS AppSync layer 實作授權和存取控制，以控制存取。連接到資料庫不需要額外的運算資源，例如託管 Web 伺服器或代理連線。
+ 您可以透過訂閱新增即時功能，並透過 AppSync 進行的資料變動會自動推送至連線的用戶端。
+ 用戶端可以使用常見的連接埠，例如 443，透過 HTTPS 連線至 API。

AWS AppSync 從現有的關聯式資料庫輕鬆建置 APIs。其自我檢查公用程式可以從資料庫資料表探索模型，並提議 GraphQL 類型。主控台的*建立 API* AWS AppSync 精靈可以立即從 Aurora MySQL 或 PostgreSQL 資料庫產生 API。它會自動建立類型和 JavaScript 解析程式來讀取和寫入資料。

AWS AppSync 提供整合的 JavaScript 公用程式，可簡化在解析程式中寫入 SQL 陳述式的程序。您可以針對具有動態值的靜態陳述式使用 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>

如需詳細的教學課程和入門指南，請參閱[教學課程：Aurora PostgreSQL Serverless with Data API](https://docs.aws.amazon.com//appsync/latest/devguide/aurora-serverless-tutorial-js.html)。

 AWS AppSync 主控台可讓您從使用資料 API 設定的現有 Aurora 資料庫，在幾分鐘內建立 AWS AppSync GraphQL API。這會根據您的資料庫組態快速產生操作結構描述。您可以依原狀使用 API，或在 API 上建置以新增功能。

1. 登入 AWS 管理主控台 並開啟 [AppSync 主控台](https://console.aws.amazon.com/appsync/)。

   1. 在**儀表板**上，選擇 **Create API (建立 API)**。

1. 在 **API 選項**下，選擇 **GraphQL APIs**、**從 Amazon Aurora 叢集開始**，然後選擇**下一步**。

   1. 輸入 **API 名稱**。這將用作 主控台中 API 的識別符。

   1. 如需**聯絡詳細資訊**，您可以輸入聯絡點來識別 API 的管理員。此為選用欄位。

   1. 在**私有 API 組態**下，您可以啟用私有 API 功能。私有 API 只能從設定的 VPC 端點 (VPCE) 存取。如需詳細資訊，請參閱[私有 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 中支援探索到的資料表。請注意，若要支援建立新的資料列，資料表需要主索引鍵，可以使用多個 column. AWS AppSync maps 資料表資料欄來輸入欄位，如下所示：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/appsync/latest/devguide/rds-introspection.html)

1. 資料表探索完成後，**資料庫**區段將填入您的資訊。在新的**資料庫資料表**區段中，資料表中的資料可能已填入並轉換為結構描述的類型。如果您沒有看到一些必要資料，您可以選擇**新增資料表**，按一下出現的模態中這些類型的核取方塊，然後選擇**新增**來檢查它。

   若要從**資料庫資料表**區段中移除類型，請按一下您要移除的類型旁的核取方塊，然後選擇**移除**。如果您想要稍後再次新增，移除的類型將放置在**新增資料表**模態中。

   請注意， AWS AppSync 使用資料表名稱做為類型名稱，但您可以重新命名它們，例如，將*電影*等複數資料表名稱變更為類型名稱*電影*。若要重新命名**資料庫資料表**區段中的類型，請按一下您要重新命名之類型的核取方塊，然後按一下**類型名稱**欄中的*鉛筆*圖示。

   若要根據您的選擇預覽結構描述的內容，請選擇**預覽結構描述**。請注意，此結構描述不能為空白，因此您必須至少有一個資料表轉換為 類型。此外，此結構描述的大小不能超過 1 MB。

   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 叢集 Amazon Resource Name (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
    }
}
```