

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

# 連接資料來源 in AWS AppSync
<a name="attaching-a-data-source"></a>

資料來源是您 AWS 帳戶中 GraphQL APIs 可與之互動的資源。 AWS AppSync 支援多種資料來源 AWS Lambda，例如 Amazon DynamoDB、關聯式資料庫 (Amazon Aurora Serverless)、Amazon OpenSearch Service 和 HTTP 端點。An AWS AppSync API 可以設定為與多個資料來源互動，讓您能夠在單一位置彙總資料。 AWS AppSync 可以使用您帳戶中的現有 AWS 資源，或從結構描述定義代表您佈建 DynamoDB 資料表。

下一節將示範如何將資料來源連接至 GraphQL API。

## 資料來源的類型
<a name="data-source-types"></a>

現在您已在 AWS AppSync 主控台中建立結構描述，您可以將資料來源連接至該結構描述。當您最初建立 API 時，可以選擇在建立預先定義的結構描述期間佈建 Amazon DynamoDB 資料表。不過，我們不會在本節中涵蓋該選項。您可以在[啟動結構描述](https://docs.aws.amazon.com//appsync/latest/devguide/schema-launch-start.html)區段中看到此範例。

反之，我們將查看 AWS AppSync 支援的所有資料來源。為您的應用程式挑選正確的解決方案有許多因素。以下各節將為每個資料來源提供一些額外的內容。如需資料來源的一般資訊，請參閱[資料來源](https://docs.aws.amazon.com/appsync/latest/devguide/data-source-components.html)。

### Amazon DynamoDB
<a name="data-source-type-ddb"></a>

Amazon DynamoDB 是可擴展應用程式 AWS的主要儲存解決方案之一。DynamoDB 的核心元件是 **資料表**，只是資料集合。您通常會根據 `Book`或 等實體建立資料表`Author`。資料表項目資訊會儲存為**項目**，這些項目是每個項目唯一的欄位群組。完整項目代表資料庫中的資料列/記錄。例如，`Book`項目的項目可能包含 `title`和 `author`及其值。`title` 和 等個別欄位`author`稱為**屬性**，與關聯式資料庫中的資料欄值類似。

您可以猜測，資料表將用於存放應用程式的資料。 AWS AppSync 可讓您將 DynamoDB 資料表連接至 GraphQL API 以操作資料。從*前端 Web 和行動部落格*取得此[使用案例](https://aws.amazon.com/blogs/mobile/new-real-time-multi-group-app-with-aws-amplify-graphql-build-a-twitter-community-clone/)。此應用程式可讓使用者註冊社交媒體應用程式。使用者可以加入群組，並上傳廣播給其他訂閱該群組的使用者的文章。其應用程式會將使用者、文章和使用者群組資訊存放在 DynamoDB 中。GraphQL API （由 管理 AWS AppSync) 會與 DynamoDB 資料表連接。當使用者在系統進行將反映在前端的變更時，GraphQL API 會擷取這些變更並將其即時廣播給其他使用者。

### AWS Lambda
<a name="data-source-type-lam"></a>

Lambda 是一種事件驅動服務，可自動建置必要的資源，以執行程式碼作為事件的回應。Lambda 使用 **函數**，這些函數是包含程式碼、相依性和組態的群組陳述式，用於執行資源。函數會在偵測到**觸發**條件時自動執行，這是叫用函數的一組活動。觸發可以是發出 API 呼叫的應用程式、您帳戶中啟動資源 AWS 的服務等。觸發時， 函數會處理事件，這些**事件**是包含要修改之資料的 JSON 文件。

Lambda 非常適合執行程式碼，無需佈建資源即可執行。從*前端 Web 和行動部落格*取得此[使用案例](https://aws.amazon.com/blogs/mobile/building-a-graphql-api-with-java-and-aws-lambda/)。此使用案例與 DynamoDB 區段中展示的使用案例略有相似。在此應用程式中，GraphQL API 負責定義物件的操作，例如新增文章 （變動） 和擷取該資料 （查詢）。為了實作其操作的功能 （例如 `getPost ( id: String ! ) : Post`、`getPostsByAuthor ( author: String ! ) : [ Post ]`)，他們使用 Lambda 函數來處理傳入請求。在*選項 2： AWS AppSync 搭配 Lambda 解析程式*下，他們使用 AWS AppSync 服務來維護其結構描述，並將 Lambda 資料來源連結至其中一個操作。呼叫 操作時，Lambda 會與 Amazon RDS Proxy 連接，以在資料庫上執行業務邏輯。

### Amazon RDS
<a name="data-source-type-RDS"></a>

Amazon RDS 可讓您快速建置和設定關聯式資料庫。在 Amazon RDS 中，您將建立一般**資料庫執行個體**，做為雲端中隔離的資料庫環境。在此執行個體中，您將使用 **資料庫引擎**，這是實際的 RDBMS 軟體 (PostgreSQL、MySQL 等）。此服務使用 AWS基礎設施、修補和加密等安全服務，以及降低部署的管理成本，來卸載大部分後端工作。

從 Lambda 區段取得相同的[使用案例](https://aws.amazon.com/blogs/mobile/building-a-graphql-api-with-java-and-aws-lambda/)。在*選項 3： AWS AppSync 使用 Amazon RDS 解析程式*下，顯示的另一個選項是直接將 中的 GraphQL API 連結至 AWS AppSync Amazon RDS。使用[資料 API](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/data-api.html)，它們會將資料庫與 GraphQL API 建立關聯。解析程式會連接到欄位 （通常是查詢、變動或訂閱），並實作存取資料庫所需的 SQL 陳述式。當用戶端發出呼叫 欄位的請求時，解析程式會執行陳述式並傳回回應。

### Amazon EventBridge
<a name="data-source-type-eventbridge"></a>

在 EventBridge 中，您將建立**事件匯流排**，這是從您連接的服務或應用程式 (**事件來源**) 接收事件，並根據一組規則處理事件的管道。**事件**是執行環境中的一些狀態變更，而**規則**是事件的一組篩選條件。規則遵循**事件模式**或事件狀態變更的中繼資料 (id、區域、帳戶號碼、ARN (s) 等）。當事件符合事件模式時，EventBridge 會將整個管道的事件傳送至目的地服務 (**目標**)，並觸發規則中指定的動作。

EventBridge 非常適合將變更狀態的操作路由到其他一些 服務。從*前端 Web 和行動部落格*取得此[使用案例](https://aws.amazon.com/blogs/mobile/appsync-eventbridge/)。此範例描述的電子商務解決方案有數個團隊維護不同的服務。這些服務之一會在前端交付的每個步驟 （下單、進行中、運送、交付等） 為客戶提供訂單更新。不過，管理此服務的前端團隊無法直接存取排序系統資料，因為這是由個別後端團隊所維護。後端團隊的排序系統也被描述為黑色方塊，因此很難收集有關他們建構資料的方式的資訊。不過，後端團隊確實設定了一個系統，透過 EventBridge 管理的事件匯流排發佈訂單資料。為了存取來自事件匯流排的資料並將其路由到前端，前端團隊建立了指向其 GraphQL API 的新目標 AWS AppSync。他們也建立了規則，只傳送與訂單更新相關的資料。進行更新時，來自事件匯流排的資料會傳送至 GraphQL API。API 中的結構描述會處理資料，然後將其傳遞至前端。

### 無資料來源
<a name="data-source-type-none"></a>

如果您不打算使用資料來源，您可以將其設定為 `none`。雖然`none`資料來源仍明確分類為資料來源，但 不是儲存媒體。一般而言，解析程式會在某個時間點調用一或多個資料來源來處理請求。不過，在某些情況下，您可能不需要操作資料來源。將資料來源設定為 `none` 將執行請求、略過資料調用步驟，然後執行回應。

從 EventBridge 區段取得相同的[使用案例](https://aws.amazon.com/blogs/mobile/appsync-eventbridge/)。在結構描述中，變動會處理狀態更新，然後將其傳送給訂閱者。回顧解析程式的運作方式，通常至少有一個資料來源調用。不過，此案例中的資料已由事件匯流排自動傳送。這表示不需要變動來執行資料來源叫用；訂單狀態可以直接在本機處理。變動設定為 `none`，可做為沒有資料來源調用的傳遞值。然後，結構描述會填入傳送給訂閱者的資料。

### OpenSearch
<a name="data-source-type-opensearch"></a>

Amazon OpenSearch Service 是一套工具，可實作全文搜尋、資料視覺化和記錄。您可以使用此服務來查詢您上傳的結構化資料。

在此服務中，您將建立 OpenSearch 的執行個體。這些稱為**節點**。在節點中，您將新增至少一個**索引**。在概念上，索引有點像關聯式資料庫中的資料表。（不過，OpenSearch 不符合 ACID 規範，因此不應以此方式使用）。您將使用上傳到 OpenSearch 服務的資料填入索引。上傳資料時，資料將會以索引中存在的一或多個碎片編製索引。**碎片**就像索引的分割區，其中包含一些資料，可以與其他碎片分開查詢。上傳後，您的資料會建構為稱為 **文件**的 JSON 檔案。然後，您可以查詢節點以取得文件中的資料。

### HTTP 端點
<a name="data-source-type-http"></a>

您可以使用 HTTP 端點做為資料來源。 AWS AppSync 可以傳送請求到具有參數和承載等相關資訊的端點。HTTP 回應將公開給解析程式，該解析程式會在完成其 （操作） 操作後傳回最終回應。

## 新增資料來源
<a name="adding-a-data-source"></a>

如果您建立了資料來源，您可以將其連結至 AWS AppSync 服務，更具體地說是 API。

------
#### [ Console ]

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

   1. 在**儀表板**中選擇您的 API。

   1. 在**側邊欄中**，選擇**資料來源**。

1. 選擇 **Create data source (建立資料來源)**。

   1. 為您的資料來源命名。您也可以提供描述，但這是選用的。

   1. 選擇您的**資料來源類型**。

   1. 對於 DynamoDB，您必須選擇您的區域，然後選擇區域中的資料表。您可以選擇建立新的一般資料表角色或匯入資料表的現有角色，以指定與資料表的互動規則。您可以啟用[版本控制](https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html)，當多個用戶端同時嘗試更新資料時，它可以為每個請求自動建立資料版本。版本控制用於保留和維護多個資料變體，以用於偵測和解決衝突。您也可以啟用自動產生結構描述，這會取得資料來源，並產生在結構描述中存取它所需的一些 CRUD、 `List`和 `Query`操作。

      對於 OpenSearch，您必須選擇您的區域，然後選擇區域中的網域 （叢集）。您可以選擇建立新的一般資料表角色或匯入資料表的現有角色，以指定與網域的互動規則。

      對於 Lambda，您必須選擇您的區域，然後選擇區域中 Lambda 函數的 ARN。您可以選擇建立新的一般資料表角色或匯入資料表的現有角色，以指定與 Lambda 函數的互動規則。

      針對 HTTP，您必須輸入 HTTP 端點。

      對於 EventBridge，您必須選擇您的區域，然後選擇區域中的事件匯流排。您可以選擇建立新的一般資料表角色或匯入資料表的現有角色，以指定與事件匯流排的互動規則。

      對於 RDS，您必須選擇您的區域，然後選擇秘密存放區 （使用者名稱和密碼）、資料庫名稱和結構描述。

      對於無，您將新增沒有實際資料來源的資料來源。這是用於在本機處理解析程式，而不是透過實際的資料來源。
**注意**  
如果您要匯入現有的角色，他們需要信任政策。如需詳細資訊，請參閱 [IAM 信任政策](#iam-trust-policy.title)。

1. 選擇**建立**。
**注意**  
或者，如果您要建立 DynamoDB 資料來源，您可以前往主控台中的**結構描述**頁面，選擇頁面頂端的**建立資源**，然後填寫預先定義的模型以轉換為資料表。在此選項中，您將填寫或匯入基本類型、設定包含分割區索引鍵的基本資料表資料，以及檢閱結構描述變更。

------
#### [ CLI ]
+ 執行 [https://docs.aws.amazon.com/cli/latest/reference/appsync/create-data-source.html](https://docs.aws.amazon.com/cli/latest/reference/appsync/create-data-source.html)命令來建立資料來源。

  您需要為此特定命令輸入幾個參數：

  1. 您 API `api-id`的 。

  1. 資料表`name`的 。

  1. 資料來源`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 的[官方文件](https://docs.aws.amazon.com/cdk/v2/guide/home.html)以及 CDK AWS AppSync參考。 [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html)  
下列步驟只會顯示用來新增特定資源之程式碼片段的一般範例。這**並非**您生產程式碼中的工作解決方案。我們也假設您已經有運作中的應用程式。

若要新增特定資料來源，您需要將 建構新增至堆疊檔案。您可以在這裡找到資料來源類型的清單：
+  [ DynamoDbDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.DynamoDbDataSource.html) 
+  [ EventBridgeDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.EventBridgeDataSource.html) 
+  [ HttpDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.HttpDataSource.html) 
+  [ LambdaDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.LambdaDataSource.html) 
+  [ NoneDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.NoneDataSource.html) 
+  [ OpenSearchDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.OpenSearchDataSource.html) 
+  [ RdsDataSource ](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync.RdsDataSource.html) 

1. 一般而言，您可能需要將匯入指令新增至您正在使用的服務。例如，它可能會遵循以下表單：

   ```
   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';
   ```

1. 某些像 RDS 的服務在建立資料來源 （例如，VPC 建立、角色和存取憑證） 之前，需要在堆疊檔案中進行一些額外的設定。如需詳細資訊，請參閱相關 CDK 頁面中的範例。

1. 對於大多數資料來源，特別是 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 文件，了解需要哪些道具。

1. 接著，您需要將資料來源連結至 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`道具中，您可以呼叫 GraphQL API (`add_api`)，並使用其中一個內建方法 (`addDynamoDbDataSource`) 建立資料表與 GraphQL API 之間的關聯。引數是將存在於 AWS AppSync 主控台 (`data_source_name_in_console`在此範例中為 ) 和資料表方法 () 中的此連結名稱`add_ddb_table`。當您開始建立解析程式時，將在下一節中顯示有關此主題的更多資訊。

   有替代方法來連結資料來源。您可以在技術上`api`新增至資料表函數中的道具清單。例如，以下是步驟 3 的程式碼片段，但具有包含 `api` GraphQL API 的 props：

   ```
   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 信任政策
<a name="iam-trust-policy"></a>

如果您為資料來源使用現有的 IAM 角色，則需要授予該角色適當的許可，以對 AWS 資源執行操作，例如在 Amazon DynamoDB 資料表`PutItem`上執行操作。您也需要修改該角色的信任政策，以允許 AWS AppSync 將其用於資源存取，如下列範例政策所示：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
        "Effect": "Allow",
        "Principal": {
            "Service": "appsync.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
        }
    ]
}
```

------

您也可以將條件新增至信任政策，以視需要限制對資料來源的存取。目前， `SourceArn` 和 `SourceAccount`金鑰可用於這些條件。例如，下列政策會將對資料來源的存取限制在帳戶 `123456789012`：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "appsync.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "123456789012"
        }
      }
    }
  ]
}
```

------

或者，您可以使用下列政策`abcdefghijklmnopq`，將資料來源的存取限制為特定 API，例如 ：

------
#### [ JSON ]

****  

```
{
  "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"
        }
      }
    }
  ]
}
```

------

您可以使用`us-east-1`下列政策，限制從特定區域存取 all AWS AppSync APIs，例如 ：

------
#### [ JSON ]

****  

```
{
  "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/*"
        }
      }
    }
  ]
}
```

------

在下一節 ([設定解析程式](https://docs.aws.amazon.com//appsync/latest/devguide/resolver-config-overview.html)) 中，我們將新增解析程式商業邏輯，並將其連接到結構描述中的欄位，以處理資料來源中的資料。

如需角色政策組態的詳細資訊，請參閱《*IAM 使用者指南*》中的[修改角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_manage_modify.html)。

如需 AWS Lambda 解析程式 for AWS AppSync 跨帳戶存取的詳細資訊，請參閱[建置跨帳戶 AWS Lambda 解析程式 for AWS AppSync](https://aws.amazon.com/blogs/mobile/appsync-lambda-cross-account/)。