Amazon OpenSearch Service시작하기

mingTato
9 min readMar 17, 2024

--

Amazon에서 만든 OpenSearch 프로젝트는 이전 버전의 Elasticsearch와 Kibana를 기반으로 하는 포크(fork)된 검색 프로젝트 입니다.

OpenSearch는 ElasticSearch 기반 오픈 소스 검색 및 분석 제품군으로 주로 어플리케이션 모니터링, 로그 분석 및 시각화와 같은 곳에서 쓰이며,

웹사이트 또는 애플리케이션의 검색 기능을 향상시키기 위한 표준 프로토콜 및 형식, 사용자가 특정 웹사이트나 애플리케이션에서 내부 검색 기능을 사용하여 콘텐츠를 찾을 때 사용합니다.

아래는 도메인 생성 및 인덱스 생성*조회 부분의 내용입니다.

1. OpenSearch Service 도메인 생성

https://aws.amazon.com 으로 이동 후, 로그인 진행

Amazon OpenSearch Serivce 검색하여 대시보드에 들어갑니다.

이후 우측 위의 도메인 생성을 눌러 도메인의 이름을 입력 해줍니다.

순서대로 표준 생성, 개발 및 테스트, 대기 상태 도메인을 선택합니다.

엔진 옵션은 최신 선택, 데이터 노드의 값은 건들지 않고 진행했습니다.

만약 세부 값 조정이 필요하다면, 아래 링크를 참고 하시면 좋을 것 같습니다.

네트워크는 간단한 설명 및 테스트를 위해 퍼블릭 액세스 선택, 액세스 제어는 마스터 사용자 생성 클릭후 원하는 이름과 암호 설정

세분화된 액세스 제어만 사용 선택, AWS 소유 키 사용 선택

고급 클러스터 설정 → 최대 절 수에 1024 입력
(공백으로 냅두고 생성할 시, 사진 하단과 같은 에러 발생)

이후 오른쪽 하단 생성 버튼 클릭

성공적으로 생성 됨을 알 수 있고, 생성된 엔드포인트를 어딘가 기록 해두는 것이 좋음

2. 인덱싱을 위한 데이터 업로드

인덱싱을 위한 데이터 업로드 방법은 두가지가 있습니다.

  1. curl을 이용한 document 업로드 : 소량 Document 소량 업로드 시 적합
curl -XPOST -u 'master-user:master-user-password' 'domain-endpoint/_bulk' --data-binary @file-name.json -H 'Content-Type: application/json'

또는 openSearch대시 보드 Dev Tools 사용해 업로드 가능 → Dev Tools 링크에서 튜토리얼 확인이 가능

2. opensearch.js 라이브러리를 이용한 document 업로드 : 대량 Document 업로드 시 적합

[이른/실습] Amazon OpenSearch Service-1편(생성)

저는 간단하게 확인을 위해 Dev Tools을 활용했습니다.

3. Python 코드로 요청 보내기

아래 코드를 이용해 aws 서버에 데이터 post 요청을 보내봤습니다.

import requests
import gzip
import json

# OpenSearch의 기본 URL 및 사용자 인증 정보를 설정합니다.
base_url = '<https://search-ai-qa-system.aos.ap-northeast-2.on.aws/>' # OpenSearch의 도메인 URL
auth = ('name', 'password') # OpenSearch에 대한 인증 정보 (사용자 이름과 비밀번호)

# 요청에 사용될 헤더를 설정합니다.
headers = {'Accept-Encoding': 'gzip', # gzip 압축을 받을 수 있도록 Accept-Encoding을 설정합니다.
'Content-Type': 'application/json', # 요청의 컨텐츠 유형을 JSON으로 설정합니다.
'Content-Encoding': 'gzip'} # 요청의 본문이 gzip으로 압축되었음을 명시합니다.

# 색인할 문서를 정의합니다.
document = {
"name": "miimimimn",
"director": "naver12@gmail.com"
}

# 문서를 gzip으로 압축합니다.
compressed_document = gzip.compress(json.dumps(document).encode())

# 색인 요청을 보냅니다.
path = 'test/_doc?refresh=true' # 색인 경로를 지정합니다. 'test'는 색인할 인덱스 이름입니다.
url = base_url + path
response = requests.post(url, auth=auth, headers=headers, data=compressed_document)

# 응답 상태 코드 및 내용을 출력합니다.
print(response.status_code) # 응답 상태 코드를 출력합니다.
print(response.text) # 응답 내용을 출력합니다.
#출력 콘솔 결과
201
{"_index":"test","_id":"yG8hMY4BGO_A2mhshy91","_version":1,"result":"created","forced_refresh":true,"_shards":{"total":3,"successful":3,"failed":0},"_seq_no":1,"_primary_term":1}
Process finished with exit code 0

쿼리를 통한 조회 시, 코드 동작 전에는 3개의 데이터만 표시되고, 코드 동작 이후엔, 새로 추가한 문서까지 4개의 데이터가 조회 됨을 볼 수 있습니다.

다른 요청들도 테스트 해봤습니다.

import requests
import gzip
import json

# OpenSearch의 기본 URL 및 사용자 인증 정보를 설정합니다.
base_url = '<https://search-ai-qa-system.aos.ap-northeast-2.on.aws/>' # OpenSearch의 도메인 URL
auth = ('name', 'password') # OpenSearch에 대한 인증 정보 (사용자 이름과 비밀번호)

# 요청에 사용될 헤더를 설정합니다.
headers = {'Accept-Encoding': 'gzip', # gzip 압축을 받을 수 있도록 Accept-Encoding을 설정합니다.
'Content-Type': 'application/json', # 요청의 컨텐츠 유형을 JSON으로 설정합니다.
'Content-Encoding': 'gzip'} # 요청의 본문이 gzip으로 압축되었음을 명시합니다.

get_document = {
"query" : {
"match_all" : {}
}
}

# 문서를 gzip으로 압축합니다.
compressed_document = gzip.compress(json.dumps(get_document).encode())

get_path = 'test/_search' # 검색을 위한 경로입니다.
url = base_url + get_path

response = requests.get(url, auth=auth, headers=headers)

# 응답 상태 코드 및 내용을 출력합니다.
print(response.status_code) # 응답 상태 코드를 출력합니다.
print(response.text) # 응답 내용을 출력합니다.
#출력 콘솔 결과
200
{"took":6,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":{"value":4,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"test","_id":"3","_score":1.0,"_source":{
"name" : "김먼재",
"E-mail" : "alswl123@naver.com"
}
},{"_index":"test","_id":"2","_score":1.0,"_source":{
"name" : "김민재",
"E-mail" : "minji.sql@naver.com"
}
},{"_index":"test","_id":"1","_score":1.0,"_source":{
"name" : "김민지",
"E-mail" : "minji.sql@gmail.com"
}
},{"_index":"test","_id":"yG8hMY4BGO_A2mhshy91","_score":1.0,"_source":{"name": "miimimimn", "director": "naver12@gmail.com"}}]}}
Process finished with exit code 0

GET 요청도 잘 나오는 것을 볼 수 있습니다.

Amazon OpenSearch Service에서 HTTP 요청 압축 — 아마존 OpenSearch 서비스

--

--