Amazon OpenSearch Service의 교차 클러스터 검색 - Amazon OpenSearch 서비스

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

Amazon OpenSearch Service의 교차 클러스터 검색

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

워크로드별 도메인을 사용하면 다음 작업을 수행할 수 있습니다.

  • 특정 워크로드에 대한 인스턴스 유형을 선택하여 각 도메인을 최적화합니다.

  • 워크로드 전반에 걸쳐 결함 격리 경계를 설정합니다. 즉, 워크로드 중 하나가 실패하면 해당 특정 도메인 내에 결함이 포함되며 다른 워크로드에 영향을 주지 않습니다.

  • 여러 도메인에서 더욱 쉽게 조정

클러스터 간 검색은 OpenSearch Dashboards를 지원하므로 모든 도메인에서 시각화 및 대시보드를 생성할 수 있습니다. 도메인 간에 전송된 검색 결과에 대한 표준 AWS 데이터 전송 요금을 지불합니다.

참고

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

제한 사항

클러스터 간 검색에는 몇 가지 중요한 제한 사항이 있습니다.

  • Elasticsearch 도메인을 OpenSearch 도메인과 연결할 수 없습니다.

  • 자체 관리형 OpenSearch/Elasticsearch 클러스터에는 연결할 수 없습니다.

  • 리전 간에 도메인을 연결하려면 두 도메인 모두 Elasticsearch 7.10 이상이거나 OpenSearch를 사용해야 합니다.

  • 도메인에는 최대 20개의 발신 연결이 있을 수 있습니다. 마찬가지로 도메인에는 최대 20개의 수신 연결이 있을 수 있습니다. 즉, 한 도메인은 최대 20개의 다른 도메인에 연결할 수 있습니다.

  • 원본 도메인은 대상 도메인과 같거나 상위 버전에 있어야 합니다. 두 도메인 간에 양방향 연결을 설정하고 둘 중 하나 또는 둘 다 업그레이드하려는 경우 먼저 연결 중 하나를 삭제해야 합니다.

  • 클러스터 간 검색에는 사용자 지정 사전이나 SQL을 사용할 수 없습니다.

  • AWS CloudFormation을 사용하여 도메인을 연결할 수 없습니다.

  • M3 또는 버스트 가능(T2 및 T3) 인스턴스에서는 클러스터 간 검색을 사용할 수 없습니다.

클러스터 간 검색 전제 조건

클러스터 간 검색을 설정하기 전에 도메인이 다음 요구 사항을 충족하는지 확인하십시오.

  • 버전 6.7 이상의 OpenSearch 도메인 또는 Elasticsearch 도메인 2개

  • 세분화된 액세스 제어를 사용하도록 설정됨

  • 노드 간 암호화를 사용하도록 설정됨

클러스터 간 검색 요금

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

연결 설정

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

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

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

클러스터 간 검색 권한 부여 흐름

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

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

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

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

  4. AWS 계정 및 리전 또는 다른 계정 또는 리전의 도메인 연결 중에서 선택합니다.

    • AWS 계정 및 리전의 클러스터에 연결하려면 드롭다운 메뉴에서 도메인을 선택하고 [요청(Request)]을 선택합니다.

    • 다른 AWS 계정 또는 리전의 클러스터에 연결하려면 원격 도메인의 ARN을 선택하고 [요청(Request)]을 선택합니다. 리전 간에 도메인을 연결하려면 두 도메인 모두 Elasticsearch 버전 7.10 이상이거나 OpenSearch를 실행해야 합니다.

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

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

  7. 연결 요청이 성공적으로 검증되면 대상 도메인으로 전송되어 승인을 받아야 합니다. 이 승인이 이루어질 때까지 연결은 Pending acceptance 상태로 유지됩니다. 대상 도메인에서 연결 요청이 수락되면 상태가 Active으로 변경되고 대상 도메인을 쿼리에 사용할 수 있게 됩니다.

    • 도메인 페이지에는 대상 도메인의 전체 도메인 상태 및 인스턴스 상태 세부 정보가 표시됩니다. 도메인 소유자만 도메인과의 연결을 유연하게 생성하고 보고 제거하고 모니터링할 수 있습니다.

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

연결 제거

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

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

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

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

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

보안 설정 및 샘플 시연

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

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

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "es:ESHttp*" ], "Resource": "arn:aws:es:region:account: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에 대한 액세스를 허용해야 합니다.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:user/test-user" ] }, "Action": "es:ESHttpGet", "Resource": "arn:aws:es:region:account:domain/src-domain/*" } ] }
  3. 소스 도메인에 대한 세분화된 액세스 제어가 요청을 평가합니다.

    • 요청이 유효한 IAM 또는 HTTP 기본 자격 증명으로 서명되었습니까?

    • 그렇다면 사용자에게 검색을 수행하고 데이터에 액세스할 수 있는 권한이 있습니까?

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

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

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

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

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:ESCrossClusterGet", "Resource": "arn:aws:es:region:account:domain/dst-domain" } ] }

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

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

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "es:ESHttp*" ], "Resource": "arn:aws:es:region:account:domain/dst-domain/*" }, { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:ESCrossClusterGet", "Resource": "arn:aws:es:region:account:domain/dst-domain" } ] }
    참고

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

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

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

  7. 테스트 요청을 위해 Postman을 사용하는 것이 좋습니다.

    • 대상 도메인에서 문서를 인덱싱합니다.

      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_bdomain-a -> domain-b와 연결 별칭이 cluster_cdomain-a -> domain-c 간에 연결을 설정하는 경우, 다음과 같이 domain-a, domain-bdomain-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": "Lets unite the new mutants", "likes": 0 } }, { "_index": "cluster_b:b_index", "_type": "_doc", "_id": "0", "_score": 2, "_source": { "user": "domino", "message": "I'm different", "likes": 0 } }, { "_index": "cluster_c:c_index", "_type": "_doc", "_id": "0", "_score": 3, "_source": { "user": "domino", "message": "So am I", "likes": 0 } } ] } }

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

OpenSearch Dashboards

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