チュートリアル: アマゾンOpenSearchサービスリゾルバー - AWS AppSync

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

チュートリアル: アマゾンOpenSearchサービスリゾルバー

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

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

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

で GraphQL エンドポイントを自動的にセットアップするにはAWS AppSyncAmazon とともにOpenSearchサービスが設定されています。AWS CloudFormationテンプレート:

AWS CloudFormation のデプロイが完了したら、GraphQL クエリとミューテーションの実行をすぐに開始できます。

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

このチュートリアルを開始するには、OpenSearchサービスドメイン。ドメインがない場合は、次のサンプルが使用できます。の場合、最大で 15 分かかることがあります。OpenSearchとの統合に進む前に、サービスドメインを作成します。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=ESDomainName,ParameterValue=ddtestdomain ParameterKey=Tier,ParameterValue=development \ --capabilities CAPABILITY_NAMED_IAM

AWS アカウントでは、米国西部 2 (オレゴン) 地区のこの AWS CloudFormationスタックを起動できます。

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

後、OpenSearchサービスドメインが作成されたら、AWS AppSyncGraphQL API を選択し、データソースタブ。[New (新規)] を選択して、データソースに「oss」などの分かりやすい名前を入力します。次に [] を選択します。アマゾンOpenSearchドメインにとって[Data source type]で、該当する地域を選択します。次に、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サービスコンソール。適切なアクションとリソースを用いて、以下のようなポリシーを追加する必要があります。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サービスドメインの場合、リゾルバーを使用して、以下の例のようにこのドメインを 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): Post } type Post { id: ID! author: String title: String url: String ups: Int downs: Int content: String } ...

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

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

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

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

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

これは、前述のスキーマにドキュメントがidフィールドで、ドキュメントがインデックス化されていることOpenSearchこのフィールドによるサービス。データ構造が異なる場合は、更新が必要です。

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

[ #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":"/id/post/_search", "params":{ "headers":{}, "queryString":{}, "body":{ "from":0, "size":50, "query":{ "term" :{ "author": $util.toJson($context.arguments.author) } } } } }

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

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

にデータを追加するOpenSearchサービス

にデータの追加が必要になる場合があります。OpenSearchGraphQL ミューテーションの結果としてのサービスドメイン。これは検索やその他の目的に非常に役立ちます。GraphQL のサブスクリプションを使ってデータをリアルタイムで作成するの場合、これは、のデータの更新をクライアントに通知するメカニズムとして動作します。OpenSearchサービスドメイン。

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

{ "version":"2017-02-28", "operation":"PUT", "path": $util.toJson("/id/post/$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 を使用する方法も示されています。

次に移る前に、以下のレスポンスマッピングテンプレートを使用します。これは次のセクションで詳しく説明します。

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

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

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

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

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

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

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

これで、に対して GraphQL 処理が実行できます。OpenSearchサービスドメイン。に移動します。クエリのタブAWS AppSyncコンソールを使用して、新しいレコードを追加します。

mutation { addPost( id:"12345" author: "Fred" title: "My first book" content: "This will be fun to write!" ){ id author title } }

レコードが正常に挿入された場合、右側にそのフィールドが表示されます。同様に、searchPostsあなたに対してクエリを実行してくださいOpenSearchサービスドメイン:

query { searchPosts { id title author content } }

ベストプラクティス

  • OpenSearchサービスは、プライマリデータベースとしてではなく、データのクエリ発行のために使用します。使用するとよい場合があります。OpenSearchで説明したように、Amazon DynamoDB と連動したサービスGraphQL リゾルバーの組み合わせ

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

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