Lambda의 트리거를 이용하여 Opensearch에 데이터를 주기적으로 저장하는 방법
해당기사에서는 AWS EventBridge와 AWS Lambda를 이용하여 지정된 주기에 AWS Opensearch로 데이터를 보내는 방안에 대해서 설명합니다.
OpenSearch를 사용하면 로그 분석, 애플리케이션 검색, 엔터프라이즈 검색 및 기타 다수의 사용 사례에서 데이터의 수집, 보안, 검색, 집계, 보기 및 분석이 쉬워집니다.또한 OpenSearch가 있으면 원하는 방식으로 사용, 수정, 확장, 수익화, 재판매할 수 있다는 100% 오픈 소스 제품의 이점을 누릴 수 있습니다. [1]
해당 기사에서는 AWS EventBridge를 이용하여 매일 0 시에 AWS Lambda를 실행시켜서 새로운 정보들을 Opensearch에 저장하는 간단한 방법에 대해서 설명해드립니다.
사용조건
- AWS Lambda 함수 생성
- AWS Lambda 레이어 생성
- Amazon EventBridge 생성
- Opensearch 도메인 생성
단계1: Lambda 함수 생성
- [함수 이름] 원하는 함수이름을 입력합니다.
- [런타임],[Python 3.11]로 최신버전의 파이썬으로 지정합니다.
- 나머지 사항은 그대로 두고 [함수 생성]을 클릭하여 함수를 생성합니다.
단계2. 배포 패키지 생성
- 명령 프롬프트를 열고 my-openseach-function 프로젝트 디렉터리를 만듭니다. [2]
mkdir my-opensearch-function
- my-sourcecode-function 프로젝트 디렉터리로 이동합니다.
cd my-opensearch-function
- 외부 라이브러리를 새package 디렉터리에 설치합니다.
pip3 install --target ./package boto3
pip3 install --target ./package requests
pip3 install --target ./package requests_aws4auth
- 루트에서 설치된 라이브러리를 포함하는 배포 패키지를 만듭니다. 다음 명령은 프로젝트 디렉터리에my-deployment-package.zip 파일을 생성합니다.
cd package
zip -r ../my-deployment-package.zip
- [Lambda],[추가 리소스].[계층],[계층 생성]을 클릭합니다.
- 계층 구성에 아래와 같이 이름을 입력하고 이전에 생성한 zip파일을 업로드 합니다.
- 이전에 만든 Lambda함수를 클릭하고 [Layers], [Add a layer],[AWS layers]을 클릭한뒤 이전에 만든 레이어를 추가합니다.
단계3. Opensearch 보안 설정
- 도메인 액세스 정책 수정을 아래와 같이 수정합니다. [2]
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "arn:aws:es:us-west-1:123456789012:domain/domain-name/*"
}
]
}
- 추가적으로 Opensearch 대시보드에 접근하여 [Security], [Roles],[Mapped Access], [all_access]에 Lambda의 역할을 매핑합니다.
단계4. Lambda 트리거 생성
- 이전에 생성한 Lambda 함수를 클릭합니다.
- [트리거 추가],[트리거 구성]에서 아래와 같이 Schedule expression에 cron식을 넣어서 설정합니다.
- 해당 cron식의 경우 매일 0시 (UTC+0) 에 실행되는 표현식입니다. [3]
단계5. Lambad 코드 수정
- 이전 단계에서 만든 Lambda 함수를 클릭합니다.
- Lambda 함수에서 [코드],[코드 소스]에 아래와 같은 코드를 넣고 저장한뒤 [Deploy],[Test]를 수행합니다.
- host,region,service, index, datatype은 원하시는 유형으로 넣습니다.
import boto3
import requests
import json
from requests_aws4auth import AWS4Auth
host = <도메인 엔드포인트>
region =<리전>
service = 'es'
def configure(host,region,service):
host = host
region = region
service = service
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
return awsauth
def send_opensearch(index,datatype,document,awsauth):
index = index
datatype = datatype
url = host + index + '/' + datatype
headers = {"Content-Type": "application/json"}
document = document
awsauth=awsauth
r = requests.post(url, auth=awsauth, json=document, headers=headers)
def lambda_handler(event, context):
awsauth=configure(host,region,service)
index = 'movies'
datatype = '_doc'
url = host + index + '/' + datatype
# API를 사용하는 경우 API를 여기에서 호출합니다.
# 호출한 API의 데이터들을 반복문을 적용하여 document에 저장하고 보낼 수 있습니다.
document = {"title": "sample title", "director": "sample director"}
send_opensearch(index,datatype,document,awsauth)
테스트
매일 0시(UTC+0)에 위에서 설정한 코드에 나온대로 데이터들이 Opensearch에 저장됨을 확인할수있습니다. 아래의 GET 메서드를 이용하여 정상적이게 저장됨을 확인할 수 있습니다.
GET movies/_search
참고 자료
[1] OpenSearch란 무엇인가요?
https://aws.amazon.com/ko/what-is/opensearch/
[2] Amazon OpenSearch Service를 사용하여 검색 애플리케이션 생성
https://docs.aws.amazon.com/ko_kr/opensearch-service/latest/developerguide/search-example.html
[3] 크론 표현식 참조
https://docs.aws.amazon.com/ko_kr/eventbridge/latest/userguide/eb-cron-expressions.html