步驟 2:附加資料來源 - AWS AppSync

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

步驟 2:附加資料來源

資料來源是您的資源AWS圖形 SQL API 可以與之互動的帳戶。AWSAppSync支持多種數據源,例如AWS Lambda, 亞馬遜動態資料庫, 關聯式資料庫 (亞馬遜極光無伺服器), 亞馬遜OpenSearch服務和 HTTP 端點。一個AWS AppSyncAPI 可設定為與多個資料來源互動,讓您能夠在單一位置彙總資料。AWSAppSync可以使用現有的AWS您帳戶中的資源,或代表您從結構描述定義佈建 DynamoDB 表格。

以下部分將向您展示如何將數據源附加到 GraphQL API。

資料來源的類型

現在,您已經在AWS AppSync控制台中,您可以將數據源附加到它。當您一開始建立 API 時,可以選擇在建立預先定義的結構描述期間佈建 Amazon DynamoDB 表格。但是,我們將不會在本節中介紹該選項。你可以看到這個例子啟動結構描述部分。

相反,我們將查看所有數據源AWS AppSync支持。為您的應用選擇正確的解決方案有很多因素。以下各節將為每個資料來源提供一些額外的上下文。如需有關資料來源的一般資訊,請參閱資料來源

Amazon DynamoDB

亞馬遜是其中之一AWS'可擴展應用的主要存儲解決方案。動態支援的核心元件是,這只是一個數據的集合。您通常會根據實體創建表Book或者Author。表格項目資訊儲存為項目,是每個項目唯一的欄位群組。完整項目代表資料庫中的列/記錄。例如,對於一個項目Book項目可能包括titleauthor連同它們的價值觀。各個字段titleauthor被稱為屬性,類似於關聯式資料庫中的欄值。

您可以猜到,表將用於存儲應用程序中的數據。AWS AppSync可讓您將 DynamoDB 資料表連結至您的圖形 SQL API 來操作資料。拿著這個使用案例前端 Web 和移動博客。該應用程序允許用戶註冊社交媒體應用程序。使用者可以加入群組並上傳廣播給訂閱群組的其他使用者的貼文。其應用程式會將使用者、貼文和使用者群組資訊儲存在 DynamoDB 中。圖形 SQL 應用程式介面 (由管理AWS AppSync) 與動態資料表的介面。當使用者在將反映在前端的系統中進行變更時,GraphQL API 會擷取這些變更,並即時將其廣播給其他使用者。

AWS Lambda

Lambda 是一項事件驅動型服務,可自動建置必要的資源,以便執行程式碼作為回應事件。拉姆達使用功能,這是包含用於執行資源的程式碼、相依性和組態的群組陳述式。函數在偵測到時自動執行觸發器,一組調用您的函數的活動。觸發器可以是類似於進行 API 調用的應用程序,AWS您帳戶中的服務旋轉資源等 觸發時,函數將處理事件,這是包含要修改之資料的 JSON 文件。

Lambda 非常適合執行程式碼,而不必佈建資源來執行程式碼。拿著這個使用案例前端 Web 和移動博客。此使用案例有點類似於 DynamoDB 一節中展示的使用案例。在此應用程序中,GraphQL API 負責定義諸如添加帖子(突變)和獲取數據(查詢)之類的操作。為了實現其操作的功能(例如,getPost ( id: String ! ) : Post,getPostsByAuthor ( author: String ! ) : [ Post ]),他們使用 Lambda 函數來處理輸入請求。下選項二:AWS AppSync使用拉姆達解析器,他們使用AWS AppSync維護其結構描述並將 Lambda 資料來源連結至其中一項作業的服務。呼叫作業時,Lambda 會與 Amazon RDS 代理進行介面,以便在資料庫上執行商業邏輯。

Amazon RDS

Amazon RDS 可讓您快速建置和設定關聯式資料庫。在亞馬遜 RDS,你會創建一個通用資料庫實例這將作為雲中隔離的數據庫環境。在這種情況下,您將使用資料庫引擎這是實際的數據庫管理系統軟件(PostgreSQL,MySQL 等)。該服務通過使用提供可擴展性來卸載大部分後端工作AWS'基礎架構、修補和加密等安全服務,以及降低部署的管理成本。

採取相同的使用案例從拉姆達部分。下選項三:AWS AppSync與亞馬遜 RDS 解析器,提供的另一個選項是將 GraphQL API 連接到AWS AppSync直接到亞馬遜 RDS。使用資料 API,它們會將資料庫與 GraphQL API 建立關聯。解析器附加到字段(通常是查詢,突變或訂閱),並實現訪問數據庫所需的 SQL 語句。當調用字段的請求是由客戶端提出,解析器執行語句並返回響應。

Amazon EventBridge

在EventBridge,您將創建活動巴士,它們是從您附加的服務或應用程式接收事件的管道 (事件來源) 並根據一組規則處理它們。一個事件是執行環境中的某些狀態變化,而 a規則是一組用於事件的過濾器。規則遵循事件模式,或事件狀態變更的中繼資料 (ID、地區、帳號、ARN 等)。當事件與事件模式匹配時,EventBridge將通過管道將事件發送到目的地服務(目標) 並觸發規則中指定的處理行動。

EventBridge對於將狀態更改操作路由到其他服務有好處。拿著這個使用案例前端 Web 和移動博客。這個例子描述了一個電子商務解決方案,該解決方案具有多個團隊維護 其中一項服務會在前端的每個交貨步驟 (下訂單、進行中、出貨、交付等),為客戶提供訂單更新。但是,管理此服務的前端團隊無法直接存取訂購系統資料,因為這些資料是由個別的後端團隊所維護的。後端團隊的訂購系統也被描述為黑匣子,因此很難收集有關他們構建數據方式的信息。但是,後端團隊確實設置了一個系統,該系統通過管理的事件總線發布訂單數據EventBridge。為了訪問來自事件總線的數據並將其路由到前端,前端團隊創建了一個指向其 GraphQL API 的新目標AWS AppSync。他們也建立了一個規則,只傳送與訂單更新相關的資料。進行更新時,事件匯流排中的資料會傳送至 GraphQL API。API 中的結構描述會處理資料,然後將其傳遞至前端。

無資料來源

如果您不打算使用資料來源,可以將其設定為none。一個none資料來源雖然仍明確分類為資料來源,但不是儲存媒體。通常,解析器會在某個時候調用一個或多個數據源來處理請求。但是,在某些情況下,您可能不需要操作資料來源。將資料來源設定為none將運行請求,跳過數據調用步驟,然後運行響應。

採取相同的使用案例從EventBridge部分。在結構描述中,突變會處理狀態更新,然後將其傳送給訂閱者。回顧解析器如何工作,通常至少有一個數據源調用。不過,此案例中的資料已由事件匯流排自動傳送。這意味著不需要突變來執行數據源調用; 訂單狀態可以簡單地在本地處理。突變設置為none,它充當沒有資料來源叫用的傳遞值。然後,結構描述會填入資料,資料會傳送給訂閱者。

OpenSearch

亞馬遜OpenSearch服務是一套工具,用於實現全文搜索,數據可視化和日誌記錄。您可以使用此服務查詢已上傳的結構化資料。

在此服務中,您將建立的執行個體OpenSearch。這些被稱為節點。在節點中,您將至少添加一個指數。在概念上,索引有點像關係數據庫中的表。(但是,OpenSearch不符合 ACID 標準,因此不應該以這種方式使用)。您將在索引中填入您上傳到OpenSearch服務。上傳數據後,它將在索引中存在的一個或多個分片中進行索引。一個碎片就像索引的一個分區,其中包含一些數據,並且可以與其他碎片分開查詢。上傳後,您的數據將結構為 JSON 文件,稱為文件。然後,您可以查詢文檔中的數據節點。

HTTP 端點

您可以使用 HTTP 端點做為資料來源。AWSAppSync可以使用參數和有效負載等相關信息將請求發送到端點。HTTP 響應將暴露給解析器,該解析器將在完成其操作後返回最終響應。

新增資料來源

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

Console
  1. 登入 AWS Management Console 並開啟 AppSync主控台

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

    2. 側邊欄,選擇資料來源

  2. 選擇 Create data source (建立資料來源)

    1. 為您的資料來源命名。你也可以給它一個描述,但這是可選的。

    2. 選擇您的資料來源類型

    3. 對於 DynamoDB,您必須選擇您的區域,然後選擇區域中的表格。您可以選擇設定新的泛用表格角色或匯入表格的現有角色,來指定與表格互動規則。您可以啟用版本化,當多個用戶端同時嘗試更新資料時,可自動為每個要求建立資料版本。版本控制用於保留和維護數據的多種變體,用於衝突檢測和解決目的。您還可以啟用自動模式生成,這將需要您的數據源並生成一些 CRUD,List,以及Query在模式中訪問它所需的操作。

      對於OpenSearch,您必須選擇您的區域,然後選擇區域中的域(集群)。您可以選擇設定新的泛用表格角色或匯入表格的現有角色,來指定與網域的互動規則。

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

      對於 HTTP,您必須輸入您的 HTTP 端點。

      對於EventBridge,您必須選擇您的地區,然後選擇該地區的活動巴士。您可以選擇建立新的泛用表格角色或匯入表格的現有角色,來指定與事件匯流排的互動規則。

      對於 RDS,您必須選擇您的區域,然後選擇秘密存儲區(用戶名和密碼),數據庫名稱和模式。

      如果是 none,您將新增沒有實際資料來源的資料來源。這是用於在本地處理解析器,而不是通過實際的數據源處理。

      注意

      如果您要匯入現有角色,則他們需要信任原則。如需詳細資訊,請參閱IAM 信任政策

  3. 選擇 建立

    注意

    或者,如果您要建立 DynamoDB 資料來源,您可以移至綱要在控制台頁面中,選擇建立資源在頁面頂部,然後填寫預先定義的模型以轉換為表格。在此選項中,您將填寫或匯入基礎類型、設定包含分割區索引鍵的基本資料表資料,以及檢閱結構描述變更。

CLI
  • 執行以建立資料來源create-data-source指令。

    您需要為此特定命令輸入一些參數:

    1. api-id你的 API。

    2. name你的桌子。

    3. 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 的官方文件隨著AWS AppSync的CDK 參考資料

下面列出的步驟將僅顯示用於添加特定資源的代碼片段的一般示例。這是意味著成為生產代碼中的工作解決方案。我們還假設您已經有一個可用的應用程序。

要添加特定的數據源,您需要將構造添加到堆棧文件中。您可以在此處找到資料來源類型的清單:

  1. 通常,您可能必須將 import 指令添加到您正在使用的服務中。例如,它可以遵循以下形式:

    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和動態支援服務:

    import * as appsync from 'aws-cdk-lib/aws-appsync'; import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
  2. 某些服務 (例如 RDS) 需要在堆疊檔案中進行一些額外的設定,才能建立資料來源 (例如 VPC 建立、角色和存取認證)。如需詳細資訊,請參閱相關 CDK 頁面中的範例。

  3. 對於大多數資料來源,尤其是AWS服務,您將在堆棧文件中創建數據源的新實例。通常情況下,這看起來像下面這樣:

    const add_data_source_func = new service_scope.resource_name(scope: Construct, id: string, props: data_source_props);

    例如,以下是亞馬遜動態資料表的範例:

    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, });
    注意

    大多數資料來源至少會有一個必要 prop (將表示)一個?符號)。請參閱 CDK 文件以瞭解需要哪些道具。

  4. 接下來,您需要將資料來源連結至 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道具,你可以調用圖形 SQL API(add_api)並使用其中一種內置方法(addDynamoDbDataSource) 以建立資料表與 GraphQL API 之間的關聯性。參數是此鏈接的名稱,將存在於AWS AppSync控制台(data_source_name_in_console在這個例子中)和表方法(add_ddb_table). 當您開始製作解析器時,下一節將顯示有關此主題的更多信息。

    有用於連結資料來源的替代方法。你可以在技術上添加api到表格函數中的 prop 列表。例如,這是步驟 3 中的代碼片段,但帶有api包含一個圖形 SQL API 的道具:

    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);

    我們建議您只在函數的 prop 中建立關聯。否則,您必須在中手動將解析器函數鏈接到數據源AWS AppSync控制台(如果你想繼續使用控制台值data_source_name_in_console)或以另一個名稱在函數中創建一個單獨的關聯data_source_name_in_console_2。這是由於 prop 處理資訊的方式有所限制。

    注意

    您必須重新部署應用程式才能查看變更。

IAM 信任政策

如果您為資料來源使用現有的 IAM 角色,則需要授予該角色適當的許可,才能在您的資料來源上執行操作AWS資源,例如PutItem在亞馬遜動態 B 表上。您也需要修改該角色的信任原則,以允許AWS AppSync以將其用於資源訪問,如以下示例策略所示:

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

您也可以在信任原則中新增條件,以視需要限制對資料來源的存取。目前,SourceArnSourceAccount金鑰可以在這些條件下使用。例如,下列政策會限制對帳戶對資料來源的存取123456789012:

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

或者,您可以將資料來源的存取限制為特定 API,例如abcdefghijklmnopq,使用下列原則:

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

您可以限制對所有人的存取AWS AppSync來自特定區域的 API,例如us-east-1,使用下列原則:

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

在下一節中(配置解析器),我們將添加解析器業務邏輯並將其附加到模式中的字段,以處理數據源中的數據。

如需有關角色原則組態的詳細資訊,請參閱修改角色IAM 使用者指南

有關跨帳戶訪問的更多信息AWS Lambda解析器AWS AppSync,請參閱建立跨帳戶AWS Lambda解析器AWS AppSync