合併 中的 GraphQL 解析程式 AWS AppSync - AWS AppSync GraphQL

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

合併 中的 GraphQL 解析程式 AWS AppSync

GraphQL 結構描述中的解析程式與欄位具有一對一的關係,以及高度的彈性。由於資料來源是在獨立於結構描述的解析器上設定,因此您可以透過不同的資料來源來解析或操作 GraphQL 類型,讓您混合和比對結構描述,以最符合您的需求。

下列案例示範如何在 結構描述中混合和比對資料來源。在開始之前,您應該熟悉為 AWS Lambda、Amazon DynamoDB 和 Amazon OpenSearch Service 設定資料來源和解析程式。

範例結構描述

下列結構描述的 類型Post各有三個 Query和 個Mutation操作:

type Post { id: ID! author: String! title: String content: String url: String ups: Int downs: Int version: Int! } type Query { allPost: [Post] getPost(id: ID!): Post searchPosts: [Post] } type Mutation { addPost( id: ID!, author: String!, title: String, content: String, url: String ): Post updatePost( id: ID!, author: String!, title: String, content: String, url: String, ups: Int!, downs: Int!, expectedVersion: Int! ): Post deletePost(id: ID!): Post }

在此範例中,您總共會有六個解析器,每個解析器都需要資料來源。解決此問題的方法之一是將這些連結到稱為 的單一 Amazon DynamoDB 資料表Posts,其中AllPost欄位執行掃描,searchPosts欄位執行查詢 (請參閱 JavaScript DynamoDB 的解析器函數參考)。不過,您並不限於 Amazon DynamoDB ;Lambda 或 OpenSearch Service 等不同資料來源的存在,可滿足您的業務需求。

透過解析程式變更資料

您可能需要從 AWS AppSync 資料來源未直接支援的第三方資料庫傳回結果。您可能還必須對資料執行複雜的修改,然後再傳回用戶端 API(用戶端)。這可能是由於資料類型的格式不正確,例如用戶端上的時間戳記差異,或處理向後相容性問題所致。在這種情況下,將 AWS Lambda 函數作為資料來源連接到您的 AWS AppSync API 是適當的解決方案。為了說明起見,在以下範例中, AWS Lambda 函數會操作從第三方資料存放區擷取的資料:

export const handler = (event, context, callback) => { // fetch data const result = fetcher() // apply complex business logic const data = transform(result) // return to AppSync return data };

這是一個非常有效的 Lambda 函式,可以連結至 GraphQL 結構描述中的 AllPost 欄位,如此,任何傳回所有結果的查詢,都會取得支持票和不支持票票數的隨機數量。

DynamoDB 和服務 OpenSearch

對於某些應用程式,您可以對 DynamoDB 執行突變或簡易查詢,並具有背景程序將文件傳輸至 OpenSearch Service。您只需將searchPosts解析器連接至 OpenSearch 服務資料來源,並使用 GraphQL 查詢傳回搜尋結果 (來自源自 DynamoDB 的資料)。在將進階搜尋操作新增至您的應用程式時,例如關鍵字、模糊字彙相符,甚至是地理空間查詢,這可能會非常強大。從 DynamoDB 傳輸資料可以透過ETL程序完成,或者,您可以使用 Lambda 從 DynamoDB 串流。

若要開始使用這些特定資料來源,請參閱我們的 DynamoDBLambda 教學課程。

例如,使用上一個教學課程中的結構描述,下列突變會將項目新增至 DynamoDB

mutation addPost { addPost( id: 123 author: "Nadia" title: "Our first post!" content: "This is our first post." url: "https://aws.amazon.com/appsync/" ) { id author title content url ups downs version } }

這會將資料寫入 DynamoDB ,然後透過 Lambda 將資料串流至 Amazon OpenSearch Service,然後用於依不同欄位搜尋文章。例如,由於資料位於 Amazon OpenSearch Service 中,因此您可以使用自由格式文字搜尋作者或內容欄位,即使是空格,如下所示:

query searchName{ searchAuthor(name:" Nadia "){ id title content } } ---------- or ---------- query searchContent{ searchContent(text:"test"){ id title content } }

由於資料會直接寫入 DynamoDB ,因此您仍然可以使用 allPost{...}getPost{...}查詢,針對資料表執行有效的清單或項目查詢操作。此堆疊會針對 DynamoDB 串流使用下列範例程式碼:

注意

此 Python 程式碼是範例,不代表要用於生產程式碼。

import boto3 import requests from requests_aws4auth import AWS4Auth region = '' # e.g. us-east-1 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) host = '' # the OpenSearch Service domain, e.g. https://search-mydomain.us-west-1.es.amazonaws.com index = 'lambda-index' datatype = '_doc' url = host + '/' + index + '/' + datatype + '/' headers = { "Content-Type": "application/json" } def handler(event, context): count = 0 for record in event['Records']: # Get the primary key for use as the OpenSearch ID id = record['dynamodb']['Keys']['id']['S'] if record['eventName'] == 'REMOVE': r = requests.delete(url + id, auth=awsauth) else: document = record['dynamodb']['NewImage'] r = requests.put(url + id, auth=awsauth, json=document, headers=headers) count += 1 return str(count) + ' records processed.'

然後,您可以使用 DynamoDB 串流,將其連接至主索引鍵為 的 DynamoDB 資料表id,而 DynamoDB 來源的任何變更都會串流至您的 OpenSearch 服務網域。如需進行這項設定的詳細資訊,請參閱 DynamoDB 串流文件