での GraphQL リゾルバーの組み合わせ AWS AppSync - AWS AppSync

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

での GraphQL リゾルバーの組み合わせ AWS AppSync

GraphQL スキーマのリゾルバーとフィールドには、非常に柔軟性の高い 1 対 1 の関係があります。データソースはスキーマとは独立してリゾルバーに設定されるため、ニーズに応じてスキーマ上で組み合わせやマッチングを行い、さまざまなデータソースを使用して GraphQL 型の解決や操作が行うことができます。

次のシナリオでは、スキーマ内のデータソースを組み合わせやマッチングを行う方法を紹介します。開始する前に、、Amazon DynamoDB AWS Lambda、および Amazon OpenSearch Service のデータソースとリゾルバーの設定に精通している必要があります。

スキーマの例

次のスキーマは Post タイプで、それぞれ 3 つの QueryMutation オペレーションがあります。

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 }

この例では、それぞれにデータソースが必要な、合計で 6 つのリゾルバーを使用します。この問題を解決する方法の 1 つは、これらを という 1 つの Amazon DynamoDB テーブルにフックすることです。このテーブルではPostsAllPostフィールドがスキャンを実行し、 searchPostsフィールドがクエリを実行します (JavaScriptDynamoDB のリゾルバー関数リファレンスを参照)。ただし、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 に転送する場合があります。GraphQL クエリを使用して、リsearchPostsゾルバーを OpenSearch サービスデータソースにアタッチし、検索結果 (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 テーブルにこれをアタッチできます。DynamoDB のソースへの変更idはすべて、 OpenSearch サービスドメインにストリーミングされます。この設定の詳細については、DynamoDB Streams のドキュメントを参照してください。