での Amazon OpenSearch Service リゾルバーの使用 AWS AppSync - AWS AppSync

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

での Amazon OpenSearch Service リゾルバーの使用 AWS AppSync

注記

現在、主に APPSYNC_JS ランタイムとそのドキュメントをサポートしています。APPSYNC_JS ランタイムとそのガイドをここで使用することを検討してください。

AWS AppSync は、 内に存在しない限り、独自の AWS アカウントでプロビジョニングしたドメインからの Amazon OpenSearch Service の使用をサポートしますVPC。ドメインをプロビジョニングした後、データソースを使用してそれに接続できます。この時点で、スキーマにリゾルバーを設定し、クエリ、ミューテーション、サブスクリプションなどの GraphQL 処理を実行することができます。このチュートリアルでは、いくつかの一般的な例を説明します。

詳細については、 のリゾルバーマッピングテンプレートリファレンス OpenSearchを参照してください。

ワンクリックでのセットアップ

Amazon OpenSearch Service を設定 AWS AppSync して で GraphQL エンドポイントを自動的にセットアップするには、この AWS CloudFormation テンプレートを使用します。

Blue button labeled "Launch Stack" with an arrow icon indicating an action to start.

AWS CloudFormation デプロイが完了したら、実行中の GraphQL クエリとミューテーション に直接スキップできます。

新しい OpenSearch サービスドメインを作成する

このチュートリアルを開始するには、既存の OpenSearch Service ドメインが必要です。ドメインがない場合は、次のサンプルが使用できます。 OpenSearch サービスドメインが作成されるまでに最大 15 分かかる場合があります AWS AppSync。

aws cloudformation create-stack --stack-name AppSyncOpenSearch \ --template-url https://s3.us-west-2.amazonaws.com/awsappsync/resources/elasticsearch/ESResolverCFTemplate.yaml \ --parameters ParameterKey=OSDomainName,ParameterValue=ddtestdomain ParameterKey=Tier,ParameterValue=development \ --capabilities CAPABILITY_NAMED_IAM

AWS アカウントの米国西部 2 (オレゴン) リージョンで次の AWS CloudFormation スタックを起動できます。

Blue button labeled "Launch Stack" with an arrow icon indicating an action to start.

OpenSearch サービスのデータソースを設定する

OpenSearch サービスドメインを作成したら、 AWS AppSync GraphQL に移動APIし、データソースタブを選択します。[New (新規)] を選択して、データソースに「oss」などの分かりやすい名前を入力します。次に、データソースタイプAmazon OpenSearch ドメインを選択し、適切なリージョンを選択します。 OpenSearch サービスドメインが一覧表示されます。選択したら、新しいロールを作成し、ロールに適したアクセス許可 AWS AppSync を割り当てるか、既存のロールを選択できます。このロールには、次のインラインポリシーがあります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1234234", "Effect": "Allow", "Action": [ "es:ESHttpDelete", "es:ESHttpHead", "es:ESHttpGet", "es:ESHttpPost", "es:ESHttpPut" ], "Resource": [ "arn:aws:es:REGION:ACCOUNTNUMBER:domain/democluster/*" ] } ] }

また、そのロール AWS AppSync の との信頼関係を設定する必要があります。

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

さらに、 OpenSearch サービスドメインには独自のアクセスポリシーがあり、Amazon OpenSearch Service コンソールから変更できます。 OpenSearch サービスドメインに適したアクションとリソースを使用して、次のようなポリシーを追加する必要があります。プリンシパルは AppSync データソースロールであり、コンソールに作成させると、IAMコンソールで確認できます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNTNUMBER:role/service-role/APPSYNC_DATASOURCE_ROLE" }, "Action": [ "es:ESHttpDelete", "es:ESHttpHead", "es:ESHttpGet", "es:ESHttpPost", "es:ESHttpPut" ], "Resource": "arn:aws:es:REGION:ACCOUNTNUMBER:domain/DOMAIN_NAME/*" } ] }

リゾルバーを接続する

データソースが OpenSearch Service ドメインに接続されているので、次の例に示すように、リゾルバーを使用して GraphQL スキーマに接続できます。

schema { query: Query mutation: Mutation } type Query { getPost(id: ID!): Post allPosts: [Post] } type Mutation { addPost(id: ID!, author: String, title: String, url: String, ups: Int, downs: Int, content: String): AWSJSON } type Post { id: ID! author: String title: String url: String ups: Int downs: Int content: String } ...

Post フィールドを含むユーザー定義の id 型があることに注意してください。次の例では、 がインデックスである のパスルートにマッピングされる、このタイプを OpenSearch サービスドメインに配置するプロセス (自動化可能) があると想定/post/_docpostしています。このルートパスから、個々のドキュメントの検索、/id/post* によるワイルドカード検索、/post/_search の パスを使用した複数ドキュメントの検索が行うことができます。例えば、同じインデックス user でインデックスが付けられた User という別の型がある場合は、/user/_searchパスを使用して複数ドキュメントが検索できます。

AWS AppSync コンソールのスキーマエディタから、searchPostsクエリを含めるように前のPostsスキーマを変更します。

type Query { getPost(id: ID!): Post allPosts: [Post] searchPosts: [Post] }

スキーマを保存します。右側の [searchPosts] で、[Attach resolver (リゾルバーをアタッチ)] を選択します。アクションメニュー で、ランタイムの更新 を選択し、ユニットリゾルバー (VTL のみ) を選択します。次に、 OpenSearch サービスデータソースを選択します。[request mapping template (リクエストマッピングテンプレート)] セクションで、ドロップダウンから [Query posts (投稿のクエリ)] を選択し、基本テンプレートを取得します。path/post/_search に変更します。次のようになります。

{ "version":"2017-02-28", "operation":"GET", "path":"/post/_search", "params":{ "headers":{}, "queryString":{}, "body":{ "from":0, "size":50 } } }

これは、前述のスキーマに、 OpenSearch postフィールドの Service でインデックス付けされたドキュメントがあることを前提としています。データ構造が異なる場合は、更新が必要です。

レスポンスマッピングテンプレートセクションで、 OpenSearch サービスクエリからデータ結果を取得し、GraphQL に変換する場合は、適切な_sourceフィルターを指定する必要があります。以下のテンプレートを使用してください。

[ #foreach($entry in $context.result.hits.hits) #if( $velocityCount > 1 ) , #end $utils.toJson($entry.get("_source")) #end ]

検索を変更する

前述のリクエストマッピングテンプレートは、すべてのレコードに簡単なクエリを実行します。今、特定の筆者で検索する場合を考えます。また、その筆者を、GraphQL クエリに定義した引数にするとします。コンソールのスキーマエディタで AWS AppSync、allPostsByAuthorクエリを追加します。

type Query { getPost(id: ID!): Post allPosts: [Post] allPostsByAuthor(author: String!): [Post] searchPosts: [Post] }

次に、リゾルバーのアタッチを選択し、 OpenSearch サービスデータソースを選択しますが、レスポンスマッピングテンプレート で次の例を使用します。

{ "version":"2017-02-28", "operation":"GET", "path":"/post/_search", "params":{ "headers":{}, "queryString":{}, "body":{ "from":0, "size":50, "query":{ "match" :{ "author": $util.toJson($context.arguments.author) } } } } }

body には author フィールドを含む term クエリが含まれていることに注意してください。これは引数としてクライアントから渡されます。任意で、標準テキストなどの事前に入力された情報を追加したり、他のユーティリティを使用したりすることもできます。

このリゾルバーを使用している場合、以前の例と同じ情報をレスポンスマッピングテンプレートに入力します。

OpenSearch サービスへのデータの追加

GraphQL ミューテーションの結果として、 OpenSearch サービスドメインにデータを追加することもできます。これは検索やその他の目的に非常に役立ちます。GraphQL サブスクリプションを使用してデータをリアルタイム にできるため、 OpenSearch サービスドメイン内のデータの更新をクライアントに通知するメカニズムとして機能します。

AWS AppSync コンソールのスキーマページに戻り、addPost()ミューテーションのリゾルバーをアタッチを選択します。 OpenSearch サービスデータソースを再度選択し、Postsスキーマに次のレスポンスマッピングテンプレートを使用します。

{ "version":"2017-02-28", "operation":"PUT", "path": $util.toJson("/post/_doc/$context.arguments.id"), "params":{ "headers":{}, "queryString":{}, "body":{ "id": $util.toJson($context.arguments.id), "author": $util.toJson($context.arguments.author), "ups": $util.toJson($context.arguments.ups), "downs": $util.toJson($context.arguments.downs), "url": $util.toJson($context.arguments.url), "content": $util.toJson($context.arguments.content), "title": $util.toJson($context.arguments.title) } } }

以前と同様、これはデータ構造の一例です。別のフィールド名またはインデックスがある場合は、必要に応じて pathbody を更新します。この例では、GraphQL ミューテーションの引数からテンプレートを受け取るために $context.arguments を使用する方法も示されています。

次に進む前に、以下のレスポンスマッピングテンプレートを使用してください。これにより、ミューテーション操作の結果またはエラー情報が出力として返されます。

#if($context.error) $util.toJson($ctx.error) #else $util.toJson($context.result) #end

単一のドキュメントの取得

最後に、スキーマ内のgetPost(id:ID)クエリを使用して個々のドキュメントを返す場合は、コンソールの AWS AppSyncスキーマエディタでこのクエリを検索し、リゾルバーのアタッチ を選択します。 OpenSearch サービスデータソースを再度選択し、次のマッピングテンプレートを使用します。

{ "version":"2017-02-28", "operation":"GET", "path": $util.toJson("post/_doc/$context.arguments.id"), "params":{ "headers":{}, "queryString":{}, "body":{} } }

上記の path では id 引数の body が空であるため、単一のドキュメントが返ります。ただし、リストではなく単一の項目が返るため、次のレスポンスマッピングテンプレートを使用する必要があります。

$utils.toJson($context.result.get("_source"))

クエリとミューテーションを実行する

これで、 OpenSearch サービスドメインに対して GraphQL オペレーションを実行できるようになりました。 AWS AppSync コンソールのクエリタブに移動し、新しいレコードを追加します。

mutation addPost { addPost ( id:"12345" author: "Fred" title: "My first book" content: "This will be fun to write!" url: "publisher website", ups: 100, downs:20 ) }

ミューテーションの結果が右側に表示されます。同様に、 OpenSearch サービスドメインに対してsearchPostsクエリを実行できるようになりました。

query searchPosts { searchPosts { id title author content } }

ベストプラクティス

  • OpenSearch サービスは、プライマリデータベースとしてではなく、データをクエリするためのものである必要があります。GraphQL リゾルバーの結合 で説明されているように、Amazon DynamoDB と組み合わせて OpenSearch Service を使用できます。

  • AWS AppSync サービスロールにクラスターへのアクセスを許可することによってのみ、ドメインへのアクセスを許可します。

  • 開発中は、最小限のコストのクラスターを使用して小規模で開始し、その後、本稼働への移行時に高可用性 (HA) を備えた大規模なクラスターへと移行することができます。