

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

# Amazon OpenSearch Service의 교차 클러스터 검색
<a name="cross-cluster-search"></a>

Amazon OpenSearch Service의 클러스터 간 검색을 사용하면 연결된 여러 도메인에서 쿼리 및 집계를 수행할 수 있습니다. 특히 여러 유형의 워크로드를 실행하는 경우 큰 단일 도메인 대신 여러 개의 작은 도메인을 사용하는 것이 더 좋습니다.

워크로드별 도메인을 사용하면 다음 작업을 수행할 수 있습니다.
+ 특정 워크로드에 대한 인스턴스 유형을 선택하여 각 도메인을 최적화합니다.
+ 워크로드 전반에 걸쳐 결함 격리 경계를 설정합니다. 즉, 워크로드 중 하나가 실패하면 해당 특정 도메인 내에 결함이 포함되며 다른 워크로드에 영향을 주지 않습니다.
+ 여러 도메인에서 더욱 쉽게 조정

클러스터 간 검색은 OpenSearch Dashboards를 지원하므로 모든 도메인에서 시각화 및 대시보드를 생성할 수 있습니다. 도메인 간에 [전송된 검색 결과에 대해 표준 AWS 데이터 전송 요금을](https://aws.amazon.com/opensearch-service/pricing/) 지불합니다.

**참고**  
오픈 소스 OpenSearch에는 클러스터 간 검색을 위한 [설명서](https://opensearch.org/docs/latest/search-plugins/cross-cluster-search/)도 제공합니다. 관리형 Amazon OpenSearch Service 도메인과 비교했을 때 오픈 소스 클러스터에 대한 설정은 크게 다릅니다. 특히 OpenSearch Service에서는 cURL AWS Management Console 대신를 사용하여 클러스터 간 연결을 구성합니다. 또한 관리형 서비스는 세분화된 액세스 제어 외에도 클러스터 간 인증에 AWS Identity and Access Management (IAM)를 사용합니다. 따라서 오픈 소스 OpenSearch 설명서 대신 이 설명서를 사용하여 도메인에 대한 교차 클러스터 검색을 구성하는 것이 좋습니다.

**Topics**
+ [제한 사항](#cross-cluster-search-limitations)
+ [클러스터 간 검색 전제 조건](#cross-cluster-search-pp)
+ [클러스터 간 검색 요금](#cross-cluster-search-pricing)
+ [연결 설정](#cross-cluster-search-set-up-connection)
+ [연결 제거](#cross-cluster-search-remove-connection)
+ [보안 설정 및 샘플 시연](#cross-cluster-search-walkthrough)
+ [OpenSearch Dashboards](#cross-cluster-search-dashboards)

## 제한 사항
<a name="cross-cluster-search-limitations"></a>

클러스터 간 검색에는 몇 가지 중요한 제한 사항이 있습니다.
+ Elasticsearch 도메인을 OpenSearch 도메인과 연결할 수 없습니다.
+ 자체 관리형 OpenSearch/Elasticsearch 클러스터에는 연결할 수 없습니다.
+ 리전 간에 도메인을 연결하려면 두 도메인 모두 Elasticsearch 7.10 이상이거나 OpenSearch를 사용해야 합니다.
+ 도메인에는 최대 20개의 발신 연결이 있을 수 있습니다. 마찬가지로 도메인에는 최대 20개의 수신 연결이 있을 수 있습니다. 즉, 한 도메인은 최대 20개의 다른 도메인에 연결할 수 있습니다.
+ 원본 도메인은 대상 도메인과 같거나 상위 버전에 있어야 합니다. 두 도메인 간에 양방향 연결을 설정하고 둘 중 하나 또는 둘 다 업그레이드하려는 경우 먼저 연결 중 하나를 삭제해야 합니다.
+ 클러스터 간 검색에는 사용자 지정 사전이나 SQL을 사용할 수 없습니다.
+  CloudFormation 를 사용하여 도메인을 연결할 수 없습니다.
+ M3 또는 버스트 가능(T2 및 T3) 인스턴스에서는 클러스터 간 검색을 사용할 수 없습니다.

## 클러스터 간 검색 전제 조건
<a name="cross-cluster-search-pp"></a>

클러스터 간 검색을 설정하기 전에 도메인이 다음 요구 사항을 충족하는지 확인하십시오.
+ 버전 6.7 이상의 OpenSearch 도메인 또는 Elasticsearch 도메인 2개
+ 세분화된 액세스 제어를 사용하도록 설정됨
+ 노드 간 암호화를 사용하도록 설정됨
+ 두 도메인 중 하나가 VPC에 있는 경우 도메인은 VPC 피어링 또는 Transit Gateway를 통해 연결되어야 하며 보안 그룹은 도메인 간 트래픽을 허용해야 합니다.

## 클러스터 간 검색 요금
<a name="cross-cluster-search-pricing"></a>

도메인 간 검색에는 추가 요금이 부과되지 않습니다.

## 연결 설정
<a name="cross-cluster-search-set-up-connection"></a>

“소스” 도메인은 클러스터 간 검색 요청이 시작된 도메인을 나타냅니다. 즉, 소스 도메인은 초기 검색 요청을 보내는 도메인입니다.

“대상” 도메인은 소스 도메인이 쿼리하는 도메인입니다.

클러스터 간 연결은 소스 도메인에서 대상 도메인으로 단방향입니다. 즉, 대상 도메인이 소스 도메인을 쿼리할 수 없습니다. 그러나 반대 방향으로 다른 연결을 설정할 수 있습니다.

![\[클러스터 간 검색 권한 부여 흐름\]](http://docs.aws.amazon.com/ko_kr/opensearch-service/latest/developerguide/images/ccs.png)


소스 도메인은 대상 도메인에 대한 "아웃바운드" 연결을 생성합니다. 대상 도메인은 소스 도메인에서 “인바운드” 연결 요청을 받습니다.

**연결을 설정하려면**

1. 도메인 대시보드에서 도메인을 선택하고 **연결(Connections)** 탭을 선택합니다.

1. [**아웃바운드 연결(Outbound connections)**] 섹션에서 [**요청(Request)**]을 선택합니다.

1. [**연결 별칭(Connection alias)**]에 연결 이름을 입력합니다.

1.  AWS 계정 및 리전 또는 다른 계정 또는 리전의 도메인에 연결할지 선택합니다.
   +  AWS 계정 및 리전의 클러스터에 연결하려면 드롭다운 메뉴에서 도메인을 선택하고 **요청을** 선택합니다.
   + 다른 AWS 계정 또는 리전의 클러스터에 연결하려면 원격 도메인의 ARN을 선택하고 **요청을** 선택합니다. 리전 간에 도메인을 연결하려면 두 도메인 모두 Elasticsearch 버전 7.10 이상이거나 OpenSearch를 실행해야 합니다.

1. 클러스터 쿼리에 사용할 수 없는 클러스터를 건너뛰려면 **사용할 수 없는 클러스터 건너뛰기**를 선택합니다. 이 설정을 사용하면 하나 이상의 원격 클러스터에서 오류가 발생하더라도 클러스터 간 쿼리가 일부 결과를 반환할 수 있습니다.

1. 클러스터 간 검색은 먼저 연결 요청을 검증하여 전제 조건이 충족되는지 확인합니다. 도메인이 호환되지 않는 것으로 확인되면 연결 요청이 `Validation failed` 상태로 들어갑니다.

1. 연결 요청이 성공적으로 검증되면 대상 도메인으로 전송되어 승인을 받아야 합니다. 이 승인이 이루어질 때까지 연결은 `Pending acceptance` 상태로 유지됩니다. 대상 도메인에서 연결 요청이 수락되면 상태가 `Active`으로 변경되고 대상 도메인을 쿼리에 사용할 수 있게 됩니다.
   + 도메인 페이지에는 대상 도메인의 전체 도메인 상태 및 인스턴스 상태 세부 정보가 표시됩니다. 도메인 소유자만 도메인과의 연결을 유연하게 생성하고 보고 제거하고 모니터링할 수 있습니다.

연결이 설정되면 연결된 도메인의 노드 간에 흐르는 모든 트래픽이 암호화됩니다. VPC 도메인을 VPC가 아닌 도메인에 연결하고 VPC가 아닌 도메인이 인터넷에서 트래픽을 수신할 수 있는 퍼블릭 엔드포인트인 경우, 도메인 간의 클러스터 간 트래픽은 여전히 암호화되고 안전합니다.

## 연결 제거
<a name="cross-cluster-search-remove-connection"></a>

연결을 제거하면 인덱스에 대한 교차 클러스터 작업이 중지됩니다.

1. 도메인 대시보드에서 [**연결(Connections)**] 탭으로 이동합니다.

1. 제거할 도메인 연결을 선택하고 **삭제(Delete)**를 선택한 다음 삭제를 확인합니다.

소스 도메인이나 대상 도메인에서 이러한 단계를 수행하여 연결을 제거할 수 있습니다. 연결을 제거한 후에도 15일 동안 `Deleted` 상태로 계속 표시됩니다.

활성 클러스터 간 연결이 있는 도메인은 삭제할 수 없습니다. 도메인을 삭제하려면 먼저 해당 도메인과의 수신 연결과 발신 연결을 모두 제거합니다. 그러면 도메인을 삭제하기 전에 클러스터 간 도메인 사용자를 고려할 수 있습니다.

## 보안 설정 및 샘플 시연
<a name="cross-cluster-search-walkthrough"></a>

1. 소스 도메인에 클러스터 간 검색 요청을 보냅니다.

1. 소스 도메인은 해당 도메인 액세스 정책을 기준으로 해당 요청을 평가합니다. 클러스터 간 검색에는 세분화된 액세스 제어가 필요하므로 소스 도메인에서 오픈 액세스 정책을 사용하는 것이 좋습니다.

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": [
             "*"
           ]
         },
         "Action": [
           "es:ESHttp*"
         ],
         "Resource": "arn:aws:es:us-east-1:111122223333:domain/src-domain/*"
       }
     ]
   }
   ```

------
**참고**  
경로에 원격 인덱스를 포함하는 경우 도메인 ARN에서 URI를 URL로 인코딩해야 합니다. 예를 들어 `arn:aws:es:us-east-1:123456789012:domain/my-domain/local_index,dst:remote_index` 대신 `arn:aws:es:us-east-1:123456789012:domain/my-domain/local_index,dst%3Aremote_index`를 사용합니다.

   세분화된 액세스 제어 외에 제한적인 액세스 정책을 사용하도록 선택하는 경우 정책에서 최소한 `es:ESHttpGet`에 대한 액세스를 허용해야 합니다.

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": [
             "arn:aws:iam::111122223333:user/test-user"
           ]
         },
         "Action": "es:ESHttpGet",
         "Resource": "arn:aws:es:us-east-1:111122223333:domain/src-domain/*"
       }
     ]
   }
   ```

------

1. 소스 도메인에 대한 [세분화된 액세스 제어](fgac.md)가 요청을 평가합니다.
   + 요청이 유효한 IAM 또는 HTTP 기본 자격 증명으로 서명되었습니까?
   + 그렇다면 사용자에게 검색을 수행하고 데이터에 액세스할 수 있는 권한이 있습니까?

   요청이 대상 도메인(예: `dest-alias:dest-index/_search`)의 데이터만 검색하는 경우 대상 도메인에 대한 사용 권한만 필요합니다.

   요청이 두 도메인(예: `source-index,dest-alias:dest-index/_search`)에서 데이터를 검색하는 경우 두 도메인에 대한 사용 권한이 필요합니다.

   세분화된 액세스 제어에서 사용자는 관련 인덱스에 대한 표준 `read` 또는 `search` 권한 외에 `indices:admin/shards/search_shards` 권한도 있어야 합니다.

1. 소스 도메인은 요청을 대상 도메인에 전달합니다. 대상 도메인은 해당 도메인 액세스 정책을 기준으로 이 요청을 평가합니다. 대상 도메인에 대한 `es:ESCrossClusterGet` 권한을 포함해야 합니다.

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "*"
         },
         "Action": "es:ESCrossClusterGet",
         "Resource": "arn:aws:es:us-east-1:111122223333:domain/dst-domain"
       }
     ]
   }
   ```

------

   `es:ESCrossClusterGet` 권한이 `/dst-domain/*`이 아닌 `/dst-domain`에 적용되었는지 확인합니다.

   그러나 이 최소 정책은 클러스터 간 검색만 허용합니다. 문서 인덱싱 및 표준 검색 수행과 같은 다른 작업을 수행하려면 추가 권한이 필요합니다. 대상 도메인에서 다음 정책을 사용하는 것이 좋습니다.

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": [
             "*"
           ]
         },
         "Action": [
           "es:ESHttp*"
         ],
         "Resource": "arn:aws:es:us-east-1:111122223333:domain/dst-domain/*"
       },
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "*"
         },
         "Action": "es:ESCrossClusterGet",
         "Resource": "arn:aws:es:us-east-1:111122223333:domain/dst-domain"
       }
     ]
   }
   ```

------
**참고**  
도메인 간의 모든 클러스터 간 검색 요청은 기본적으로 노드 간 암호화의 일부로 전송 중에 암호화됩니다.

1. 대상 도메인은 검색을 수행하고 결과를 소스 도메인에 반환합니다.

1. 소스 도메인은 자체 결과(있는 경우)를 대상 도메인의 결과와 결합하여 반환합니다.

1. 테스트 요청을 위해 [Postman](https://www.postman.com/)을 사용하는 것이 좋습니다.
   + 대상 도메인에서 문서를 인덱싱합니다.

     ```
     POST https://dst-domain.us-east-1.es.amazonaws.com/books/_doc/1
     
     {
       "Dracula": "Bram Stoker"
     }
     ```
   + 소스 도메인에서 이 인덱스를 쿼리하려면 쿼리 내에 대상 도메인의 연결 별칭을 포함합니다.

     ```
     GET https://src-domain.us-east-1.es.amazonaws.com/<connection_alias>:books/_search
     
     {
         ...
       "hits": [
         {
           "_index": "source-destination:books",
           "_type": "_doc",
           "_id": "1",
           "_score": 1,
           "_source": {
             "Dracula": "Bram Stoker"
           }
         }
       ]
     }
     ```

     도메인 대시보드의 **연결(Connections)** 탭에서 연결 별칭을 찾을 수 있습니다.
   + 연결 별칭이 `cluster_b`인 `domain-a -> domain-b`와 연결 별칭이 `cluster_c`인 `domain-a -> domain-c` 간에 연결을 설정하는 경우, 다음과 같이 `domain-a`, `domain-b` 및 `domain-c`를 검색합니다.

     ```
     GET https://src-domain.us-east-1.es.amazonaws.com/local_index,cluster_b:b_index,cluster_c:c_index/_search
     {
       "query": {
         "match": {
           "user": "domino"
         }
       }
     }
     ```

     **응답**

     ```
     {
       "took": 150,
       "timed_out": false,
       "_shards": {
         "total": 3,
         "successful": 3,
         "failed": 0,
         "skipped": 0
       },
       "_clusters": {
         "total": 3,
         "successful": 3,
         "skipped": 0
       },
       "hits": {
         "total": 3,
         "max_score": 1,
         "hits": [
           {
             "_index": "local_index",
             "_type": "_doc",
             "_id": "0",
             "_score": 1,
             "_source": {
               "user": "domino",
               "message": "This is message 1",
               "likes": 0
             }
           },
           {
             "_index": "cluster_b:b_index",
             "_type": "_doc",
             "_id": "0",
             "_score": 2,
             "_source": {
               "user": "domino",
               "message": "This is message 2",
               "likes": 0
             }
           },
           {
             "_index": "cluster_c:c_index",
             "_type": "_doc",
             "_id": "0",
             "_score": 3,
             "_source": {
               "user": "domino",
               "message": "This is message 3",
               "likes": 0
             }
           }
         ]
       }
     }
     ```

     연결 설정에서 사용할 수 없는 클러스터를 건너뛰도록 선택하지 않은 경우 검색 요청이 성공적으로 실행되려면 검색하는 모든 대상 클러스터를 사용할 수 있어야 합니다. 그렇지 않으면 전체 요청이 실패합니다. 도메인 중 하나를 사용할 수 없더라도 검색 결과가 반환되지 않습니다.

## OpenSearch Dashboards
<a name="cross-cluster-search-dashboards"></a>

`connection-alias:index`을(를) 사용하여 원격 인덱스에 액세스해야 한다는 점을 제외하면 연결된 여러 도메인의 데이터를 단일 도메인과 동일한 방식으로 시각화할 수 있습니다. 따라서 인덱스 패턴이 `connection-alias:index`와 일치해야 합니다.