ES|QL에 JOIN이 도입되었습니다! 네, 바로 그 JOIN입니다!
Elasticsearch 8.18에는 ES|QL의 LOOKUP JOIN 명령, 즉 Elastic 최초의 SQL 스타일 조인이 포함됩니다.

Elasticsearch 8.18에는 최초의 SQL 스타일 JOIN인 ES|QL의 LOOKUP JOIN 명령이 포함됩니다. 이 명령은 이제 기술 미리보기로 제공되며, 쉽게 업데이트할 수 있는 조회 데이터 세트를 사용하여 데이터 상관 분석 및 보강을 지원합니다. 이벤트에 호스트 및 자산 정보를 추가해야 하나요? 문제없습니다. 어떤 IP 주소 또는 URL이 위협 인텔리전스 목록에 있는지 확인하고 싶으신가요? 물론입니다. 조회 데이터 세트를 업데이트하고 즉시 사용하고 싶으신가요? 바로 시작하세요!
조회 조인은 오른쪽 측에 사용할 조회라는 새 인덱스 모드를 사용하는 SQL 스타일 LEFT OUTER JOIN입니다. 조회 인덱스에는 자산, 알려진 악성 IP와 같은 위협 인텔리전스 데이터, 주문 정보, 직원 또는 고객 정보 등을 사용할 수 있으며, 가능성은 무한합니다.

과거 Elasticsearch에는 조인 기능이 없었습니다. 시간이 지나면서 nested, _parent, join 필드 유형 및 enrich와 같이 이를 위한 몇 가지 시도가 있었습니다. Elastic은 일반적으로 참조 데이터를 이벤트와 함께 동일한 인덱스에 배치하는 데이터 비정규화 또는 클라이언트 측 조인을 권장했습니다. 이러한 솔루션은 대용량 데이터의 확장성을 저해하며, 데이터와 사용 사례의 다양성이 높을 때 제한적일 수 있습니다. Elasticsearch에 조인이 필요한 때입니다. 그리고 이제 가능해졌습니다. ES|QL은 단순한 언어가 아니라 새로운 컴퓨팅 엔진을 기반으로 구축되었습니다. ES|QL 엔진은 조인과 같은 고급 기능을 수행할 수 있게 합니다.
조회 조인을 지원하기 위해 Elastic은 조회라는 새 인덱스 모드를 만들었습니다. 조회 인덱스는 대부분 일반 인덱스와 같습니다. 일반 인덱스의 기본값은 mode:standard이며, 이는 직접 업데이트할 수 있다는 의미입니다. 가장 큰 차이점은 조회 인덱스에 샤드가 하나만 있다는 점입니다. 따라서 단일 샤드의 Lucene 제한인 20억 개 문서로 제한됩니다. 이는 다양한 조회 조인 사용 사례에서 오른쪽 측 데이터를 저장하기에 충분하고도 남을 것입니다.이 제한을 적용하면 조인 오른쪽 측 소스의 카디널리티를 줄여 완전히 분산된 조인과 관련된 몇 가지 문제를 피할 수 있습니다. 또한 이를 통해 사용자가 어떤 데이터 세트를 조회 참조로 사용하려는지 파악할 수 있으므로, 향후 이를 최적화할 방법을 찾을 수 있습니다.
조회 인덱스 모드 외에는 조인을 수행하기 위한 소스 데이터 제약이나 데이터 준비가 필요하지 않습니다. 즉, 조회 데이터 세트를 쉽게 추가하고 최신 상태로 유지할 수 있습니다.
이 기능 중 일부는 ES|QL의 ENRICH 명령으로도 이미 가능했습니다. ENRICH는 수집 파이프라인에서 수집 시점 조회를 수행하거나 자주 변경되지 않는 소규모 데이터 세트에 사용하도록 최적화되어 있어 편리하지만 이상적이지는 않았습니다. 조회 조인은 enrich보다 설정과 관리가 더 쉽습니다.
enrich 정책을 만들 필요가 없습니다.
정책을 실행할 필요가 없습니다.
조회 인덱스에 데이터를 쓸 수 있습니다.
데이터 복사본 수가 더 적습니다.
여러 일치 항목을 더 효과적으로 처리할 수 있습니다. enrich는 여러 항목이 일치할 때 다중값 필드를 생성하는 반면, 조회 조인은 여러 행을 생성합니다. 따라서 사용자당 전송된 바이트 수 또는 주문 합계와 같이 그룹화 및 집계를 수행하는 추가 분석이 더 쉬워집니다.
조회 조인을 사용하면 매치 필드를 즉석에서 지정할 수 있습니다.
LOOKUP JOIN을 활용하는 몇 가지 방법은 다음과 같습니다.
보안 이벤트를 위협 인텔리전스와 조인하여 이벤트를 추가로 보강
현재 호스트 집합을 최신 위협 인텔리전스 또는 내부 메타데이터와 대조
IoT 측정값과 정적 또는 동적 메타데이터(제조업체, 용적 단위)의 상관관계 분석
더 많은 컨텍스트를 확보하고 필터링하기 위해 보안 이벤트를 호스트 정보와 조인
자산 중요도와 같은 사실 추가(예: 이 사용자는 임원입니다)
호스트 이름이 있는 소스에 CrowdStrike AID 추가
특정 IP 주소가 위협 인텔리전스 피드에 포함되어 있는지 확인
이벤트에 직원 정보 추가
가능성은 무한합니다.
사용 예시
실제 예를 통해 이 기능이 얼마나 쉽고 강력한지 살펴보겠습니다.
SRE는 다음 작업을 수행해야 할 수 있습니다.
IP 주소 또는 호스트 이름을 기준으로 로그에 환경 정보 추가
로그에 직원 정보 조인
서버를 소유한 팀 파악
LOOKUP JOIN을 사용하기 전에는 다음을 수행해야 합니다.
참조 데이터(환경)를 인덱스에 저장
해당 인덱스를 기반으로 정책 유형, 매치 필드 및 enrich 필드를 지정하는 enrich 정책 정의
enrich 인덱스를 구축하기 위해 enrich 정책을 한 번 실행
각 참조 데이터 세트(직원, 팀)에 대해 반복
데이터가 변경될 때마다 enrich 정책 실행
LOOKUP JOIN을 사용하면 참조 데이터를 조회 인덱스에 넣기만 하면 바로 사용할 수 있습니다!
전자상거래 사이트에서 사용자에게 오류가 발생한다는 경보를 받았다고 가정해 보겠습니다. 성공을 나타내는 HTTP 응답 코드 200이 아닌 응답이 포함된 웹 로그를 찾았습니다. 프로덕션 고객이 영향을 받는지 확인하기 위해 이를 환경별로 분류하고 싶지만, 로그에는 environment 필드가 없습니다. 괜찮습니다. 다음과 같은 파일을 사용하여 environment에 대한 조회 조인을 추가하면 됩니다.
clientip,environment
192.168.1.9,QA
192.168.14.2,Dev
192.168.12.3,Prod
…이제 environments 조회 인덱스(여기서는 envs_lkp)에 LOOKUP JOIN을 추가합니다.
FROM kibana_sample_data_logs | WHERE response.keyword != "200"
| LOOKUP JOIN envs_lkp ON clientip
| STATS COUNT(*) by response, environment
생산 및 품질 보증(QA) 과정에서 오류가 발생하고 있습니다. 각 웹 서버를 소유한 팀 목록과 조인하여 누구에게 연락해야 하는지 확인할 수 있습니다.
host,team
www.elastic.co,Web team
artifacts.elastic.co,Delivery team
cdn.elastic-elastic-elastic.org,Cloud team
elastic-elastic-elastic.org,Web teamFROM kibana_sample_data_logs | WHERE response.keyword != "200"
| LOOKUP JOIN teams_lkp ON host
| STATS num = COUNT(*) by host, response.keyword, team
| SORT num DESC
보안 분석가라면 조인 작업을 반길 것입니다. 예를 들어 다음과 같은 작업을 수행할 수 있습니다.
알려진 악성 URL을 요청하는 클라이언트 IP 식별
자산 정보와 상관관계를 분석하여 이벤트를 그룹화하고 우선순위 또는 위험도 할당
Abuse.ch의 URLhaus에서 악성 URL 목록을 다운로드하여 조회 인덱스에 업로드할 수 있습니다.
FROM logs
| LOOKUP JOIN urlhaus_lkp ON url
| WHERE threat IS NOT NULL
| KEEP @timestamp, url.keyword, clientip, threat
조회 생성 방법
조회 조인을 사용하려면 조회 인덱스가 하나 이상 필요합니다. Kibana에서 조회 데이터 세트를 쉽게 생성하고 업데이트할 수 있는 방법을 설계하고 있습니다. 지금은 몇 가지 방법으로 조회 인덱스를 생성할 수 있습니다. 핵심은 인덱스 모드를 반드시 '조회'로 설정해야 한다는 점입니다.
Index Management를 사용하여 조회 인덱스 생성
Kibana의 왼쪽 탐색 창에서 Stack Management를 클릭한 다음 Index Management를 클릭합니다. 오른쪽에서 Create index(인덱스 생성)를 클릭합니다.

인덱스 이름을 입력하고 인덱스 모드 드롭다운에서 “조회”를 선택합니다.

Create(생성)를 클릭하여 빈 조회 인덱스를 생성합니다.
API를 통해 조회 인덱스 생성
인덱스 생성 API를 사용하여 조회 인덱스를 생성합니다. 이때 인덱스 모드를 반드시 포함해야 합니다.
PUT mylookupindex
{
"settings": {
"index.mode": "lookup"
}
}ML 파일 업로더를 사용하여 조회 인덱스 생성
Kibana의 왼쪽 탐색 창에서 Machine learning을 클릭한 다음 File data visualizer를 클릭합니다. 또는 Kibana 검색창에 “upload”를 입력합니다.

파일을 선택하거나 끌어다 놓습니다. 이 경우에는 CSV 파일이 적합합니다.
Import(가져오기)를 클릭한 후 인덱스 이름을 입력하고 Advanced(고급)를 클릭하여 Index settings(인덱스 설정)를 표시합니다. 여기에서 index.mode: lookup을 추가해야 합니다.

Import(가져오기)를 클릭하여 파일 업로드를 완료합니다. 인덱스와 데이터 보기가 생성됩니다.
이제 어떤 경우든 ES|QL 쿼리에서 조회 인덱스를 참조할 수 있습니다.
자주 묻는 질문
Q: 조인 작업을 사용하지 말아야 하는 경우는 언제인가요?
LOOKUP JOIN은 매우 강력한 기능이지만, 강력한 기능에는 그만큼의 대가가 따릅니다. 조인 작업은 비용이 많이 들 수 있으며, 조인을 수행할 때마다 쿼리에 지연 시간이 추가됩니다. 조인 작업이 과도하거나 최선의 선택이 아닌 시나리오도 있을 수 있습니다.예를 들어 여러 쿼리에서 특정 필드를 매우 자주 조인한다면, 해당 필드를 왼쪽 인덱스에 비정규화하는 방법을 고려하세요. enrich 수집 프로세서를 사용해 수집 시점에 추가하거나, 파일 수집기 구성을 사용하거나, Logstash 필터를 사용하는 등의 방법이 있습니다. 이러한 일회성 수집 처리는 저장소 사용량을 조금 늘리는 대신 쿼리 속도를 높이는 절충안입니다. 이 방법은 자주 변경되지 않는 참조 값(사용자 ID의 사용자 이름)이나 전혀 변경되지 않는 참조 값(호스트의 제조업체)에 가장 적합합니다.
Q: l조회를 직접 쿼리할 수 있나요?
예. 조회 인덱스는 대부분 '일반 인덱스'와 같으므로 ES|QL로 쿼리할 수 있습니다.
FROM <lookup_index> | …또는 데이터 보기를 생성할 수도 있습니다.

Q: Logstash 또는 에이전트에서 데이터를 보낼 수 있나요?
예. 다만 조회 인덱스는 데이터 스트림이 아니며 샤드가 하나뿐이므로 각 조회 인덱스에 최대 20억 개의 문서만 전송할 수 있습니다.
다음 단계
조회 조인을 정식 출시할 수 있도록, 알려진 몇 가지 제한 사항을 해소하고 있습니다. 또한 조회 데이터 세트를 위한 전용 편집 환경도 설계하고 있습니다. Kibana Discover에서 직접 조회 인덱스를 생성하고 편집하거나, CSV 파일을 Discover에 끌어다 놓아 인덱스를 채울 수 있다고 생각해 보세요. 다음은 이러한 기능의 예상 모습을 보여 주는 목업입니다.

그리고 조회 조인은 시작에 불과합니다. INNER JOIN이나 하위 쿼리와 같은 다른 유용한 조인 유형을 제공하고, 조회 인덱스뿐 아니라 모든 인덱스와 조인할 수 있도록 지원하고자 합니다.
시작하기
이상으로 Elasticsearch 8.18/9.0에서 기술 미리보기로 제공되는 조회 조인을 소개했습니다.
시작할 준비가 되셨나요? 최신 릴리즈의 모든 새로운 기능이 포함된 호스팅 Elasticsearch 서비스인 Elastic Cloud에서 이제 Elastic 8.18 및 9.0을 사용할 수 있습니다. ES|QL 팀을 대표하여 여러분의 피드백을 기다리겠습니다. Discover의 ES|QL 편집기에서 Submit feedback(피드백 제출) 버튼을 사용해 주세요. 끝까지 읽어 주셔서 감사합니다!
이 게시물에서 설명된 모든 기능이나 성능의 출시와 일정은 Elastic의 단독 재량에 따라 결정됩니다. 현재 제공되지 않는 기능이나 성능은 예정된 시간에 출시되지 않을 수도 있으며 아예 제공되지 않을 수도 있습니다.