

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

# AWS AppSync での Amazon OpenSearch Service リゾルバーの使用
<a name="tutorial-elasticsearch-resolvers"></a>

**注記**  
現在、主に APPSYNC\$1JS ランタイムとそのドキュメントをサポートしています。[こちら](https://docs.aws.amazon.com/appsync/latest/devguide/tutorials-js.html) で APPSYNC\$1JS ランタイムとそのガイドの使用をご検討ください。

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

詳細については、「[OpenSearch 用リゾルバーのマッピングテンプレートリファレンス](resolver-mapping-template-reference-elasticsearch.md#aws-appsync-resolver-mapping-template-reference-elasticsearch)」を参照してください。

## ワンクリックでのセットアップ
<a name="one-click-setup"></a>

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

[https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?templateURL=https://s3.us-west-2.amazonaws.com/awsappsync/resources/elasticsearch/appsynces.yml](https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?templateURL=https://s3.us-west-2.amazonaws.com/awsappsync/resources/elasticsearch/appsynces.yml)

 AWS CloudFormation デプロイが完了したら、[GraphQL クエリとミューテーションの実行](#tutorial-elasticsearch-resolvers-perform-queries-mutations)に直接スキップできます。

## OpenSearch Service ドメインを作成する
<a name="create-a-new-es-domain"></a>

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

```
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 スタックを起動できます。

 [https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?templateURL=https://s3.us-west-2.amazonaws.com/awsappsync/resources/elasticsearch/ESResolverCFTemplate.yaml](https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?templateURL=https://s3.us-west-2.amazonaws.com/awsappsync/resources/elasticsearch/ESResolverCFTemplate.yaml)

## OpenSearch Service のデータソースの設定
<a name="configure-data-source-for-es"></a>

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

------
#### [ JSON ]

****  

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

------

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

------
#### [ JSON ]

****  

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

------

さらに、OpenSearch Service ドメインには独自の**アクセスポリシー**があります。これは Amazon OpenSearch Service コンソールを使用して変更できます。OpenSearch Service ドメインの適切なアクションとリソースを用いて、以下のように同じようなポリシーを追加する必要があります。**Principal** は AppSync のデータソースのロールです。これをコンソールに作成させる場合には、IAM コンソールに表示されるようにします。

------
#### [ JSON ]

****  

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

------

## リゾルバーを接続する
<a name="connecting-a-resolver"></a>

これで、データソースが 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 Service ドメインに配置するプロセス (自動化可能) があることを前提としています。このプロセスでは、`/post/_doc` へのルートパスをマッピングします。`post` はインデックスです。このルートパスから、個々のドキュメントの検索、`/id/post*` によるワイルドカード検索、`/post/_search` の パスを使用した複数ドキュメントの検索が行えます。例えば、同じインデックス `user` でインデックスが付けられた `User` という別の型がある場合は、`/user/_search` の **パス**を使用して複数ドキュメントが検索できます。

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

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

スキーマを保存します。右側の [`searchPosts`] で、[**Attach resolver (リゾルバーをアタッチ)**] を選択します。**[アクション]** メニューで **[ランタイムの更新]** を選択し、**[ユニットリゾルバー (VTL のみ)]** を選択します。次に、OpenSearch Service サービスのデータソースを選択します。[**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
        }
    }
}
```

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

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

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

## 検索を変更する
<a name="modifying-your-searches"></a>

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

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

その後、**[リゾルバーをアタッチ]** を選択し、OpenSearch Service データソースを選択します。ただし、**[レスポンスマッピングテンプレート]** には次の例を使用します。

```
{
    "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 クエリが含まれていることに注意してください。これは引数としてクライアントから渡されます。任意で、標準テキストなどの事前に入力された情報を追加したり、他の[ユーティリティ](resolver-context-reference.md#aws-appsync-resolver-mapping-template-context-reference)を使用したりすることもできます。

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

## OpenSearch Service へのデータの追加
<a name="adding-data-to-es"></a>

GraphQL ミューテーションの結果、OpenSearch Service ドメインにデータの追加が必要になる場合があります。これは検索やその他の目的に非常に役立ちます。GraphQL サブスクリプションを使用して[データをリアルタイムで作成](aws-appsync-real-time-data.md)できるため、これは OpenSearch Service ドメインのデータの更新をクライアントに通知するメカニズムとして動作します。

 AWS AppSync コンソールの**スキーマ**ページに戻り、`addPost()`ミューテーションの**リゾルバーをア**タッチを選択します。再度 OpenSearch Service データソースを選択し、`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)
        }
    }
}
```

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

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

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

## 単一のドキュメントの取得
<a name="retrieving-a-single-document"></a>

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

```
{
    "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"))
```

## クエリとミューテーションを実行する
<a name="tutorial-elasticsearch-resolvers-perform-queries-mutations"></a>

これで、OpenSearch Service ドメインに対して 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 Service ドメインに対して `searchPosts` クエリが実行できます。

```
query searchPosts {
    searchPosts {
        id
        title
        author
        content
    }
}
```

## ベストプラクティス
<a name="best-practices"></a>
+ OpenSearch Service はプライマリデータベースとしてではなく、データのクエリ発行のために使用します。「[GraphQL リゾルバーを組み合わせる](tutorial-combining-graphql-resolvers.md#aws-appsync-tutorial-combining-graphql-resolvers)」で説明したように、Amazon DynamoDB と組み合わせて OpenSearch Service を使用する場合があります。
+ ドメインへのアクセスを許可するには、 AWS AppSync サービスロールにクラスターへのアクセスを許可します。
+ 開発中は、最小限のコストのクラスターを使用して小規模で開始し、その後、本稼働への移行時に高可用性 (HA) を備えた大規模なクラスターへと移行することができます。