

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 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 AWS Service가 구성된 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 도메인을 생성하는 데 최대 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 스택을 시작할 수 있습니다.

 [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로 이동하여 **데이터 소스** 탭을 선택합니다. **새로 만들기**를 선택하고 '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 도메인에 대한 적정 작업 및 리소스를 사용하여 다음과 비슷한 정책을 추가해야 합니다. **보안 주체**는 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 콘솔의 스키마 편집기에서 `searchPosts` 쿼리를 포함하도록 이전 `Posts` 스키마를 수정합니다.

```
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` 필드에 대한 쿼리 용어로 채워져서 클라이언트에서 인수로 전달됩니다. 또한 원할 경우 표준 텍스트 같은 미리 채워진 정보를 사용하거나 다른 [유틸리티](resolver-context-reference.md#aws-appsync-resolver-mapping-template-context-reference)를 사용할 수도 있습니다.

이 해석기를 사용하려는 경우 이전 예와 동일한 정보를 **Response Mapping Template(응답 매핑 템플릿)**에 입력합니다.

## 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`를 업데이트해야 합니다. 이 예제는 `$context.arguments`를 사용하여 GraphQL 변형 인수에서 템플릿을 채우는 방법도 보여줍니다.

계속 진행하기 전에 다음 응답 매핑 템플릿을 사용하여 뮤테이션 작업 결과 또는 오류 정보를 출력으로 반환합니다.

```
#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` 인수를 사용하므로 이 문은 단일 문서를 반환합니다. 하지만 지금은 목록이 아니라 단일 항목을 반환하려고 하므로 다음과 같은 응답 매핑 템플릿을 사용해야 합니다.

```
$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)에서 설명했듯이 OpenSearch Service를 Amazon DynamoDB와 함께 사용할 수도 있습니다.
+  AWS AppSync 서비스 역할이 클러스터에 액세스할 수 있도록 허용해야만 도메인에 대한 액세스 권한을 부여합니다.
+ 최저 비용 클러스터를 제공하는 간단한 개발부터 시작하여, 프로덕션으로 들어가면서 고가용성(HA)을 제공하는 대규모 클러스터로 이동할 수 있습니다.