Lambda의 트리거를 이용하여 Opensearch에 데이터를 주기적으로 저장하는 방법

3분 분량
콘텐츠 수준: 중급
0

해당기사에서는 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. 배포 패키지 생성

  1. 명령 프롬프트를 열고 my-openseach-function 프로젝트 디렉터리를 만듭니다. [2]
mkdir my-opensearch-function
  1. my-sourcecode-function 프로젝트 디렉터리로 이동합니다.
cd my-opensearch-function
  1. 외부 라이브러리를 새package 디렉터리에 설치합니다.
pip3 install --target ./package boto3
pip3 install --target ./package requests
pip3 install --target ./package requests_aws4auth
  1. 루트에서 설치된 라이브러리를 포함하는 배포 패키지를 만듭니다. 다음 명령은 프로젝트 디렉터리에my-deployment-package.zip 파일을 생성합니다.
cd package
zip -r ../my-deployment-package.zip 
  1. [Lambda],[추가 리소스].[계층],[계층 생성]을 클릭합니다.
  2. 계층 구성에 아래와 같이 이름을 입력하고 이전에 생성한 zip파일을 업로드 합니다. 여기에 이미지 설명 입력
  3. 이전에 만든 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

profile pictureAWS
지원 엔지니어
게시됨 5달 전608회 조회
댓글 없음

관련 콘텐츠