Amazon Elasticsearch Service 에서 Curator를 사용하여 데이터 교체 - Amazon Elasticsearch Service

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

Amazon Elasticsearch Service 에서 Curator를 사용하여 데이터 교체

이 섹션에는 AWS Lambda 및큐레이터를 사용하여 Amazon EAmazon Elasticsearch Service (Amazon ES) 에서 인덱스와 스냅샷을 관리할 수 있습니다. Curator에는 수많은 필터가 있으므로 60일 이전에 생성된 인덱스나 완료되지 않은 스냅샷 등 특정 기준에 맞는 인덱스와 스냅샷을 찾는 데 유용합니다. 인덱스 상태 관리에는 몇 가지 유사한 기능이 있으며 또는 별도의 EC2 인스턴스가 필요하지 않습니다. 사용 사례에 따라 전자가 더 나은 선택일 수 있습니다.

Curator는 흔히 CLI (명령줄 인터페이스) 로 사용되지만, Python API도 있기 때문에 함수에 사용할 수 있습니다. 설치 지침은 스냅샷에 큐레이터 사용 단원을 참조하십시오.

Lambda 함수 구성 및 배포 패키지 생성에 대한 자세한 내용은 단원을 참조하십시오.Amazon S3 에서 스트리밍 데이터 로드를 선택합니다. 자세한 내용은 단원을 참조하십시오.AWS Lambda 개발자 안내서를 선택합니다. 이 섹션에서는 샘플 코드, 기본 설정, 트리거 및 권한만 다룹니다.

샘플 코드

아래의 샘플 코드는 Curator와 elasticsearch-py를 사용하여 30일 이상 지난 데이터임을 나타내는 타임스탬프가 이름에 들어 있는 인덱스를 모두 삭제합니다. 예를 들어, 이름이 my-logs-2014.03.02인 인덱스는 삭제됩니다. 만일 이 인덱스를 오늘 만들었어도 삭제됩니다. 이 필터는 인덱스 이름으로 수명을 판단하기 때문입니다.

이 코드에는 생성일로 수명을 판단하는 등 주석 처리된 그 밖의 공통 필터 예제도 들어 있습니다. Python용 AWS SDK (Boto3) 및요청-AWS4인증라이브러리는 Amazon ES에 대한 요청에 서명합니다.

주의

이 섹션의 두 코드 샘플 모두 데이터 (잠재적으로 많은 데이터) 를 삭제합니다. 코드 동작에 만족할 때까지는 중요하지 않은 도메인에서 각 샘플을 수정하면서 테스트하십시오.

인덱스 삭제

import boto3 from requests_aws4auth import AWS4Auth from elasticsearch import Elasticsearch, RequestsHttpConnection import curator host = '' # For example, search-my-domain.region.es.amazonaws.com region = '' # For example, us-west-1 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) # Lambda execution starts here. def lambda_handler(event, context): # Build the Elasticsearch client. es = Elasticsearch( hosts = [{'host': host, 'port': 443}], http_auth = awsauth, use_ssl = True, verify_certs = True, connection_class = RequestsHttpConnection ) # A test document. document = { "title": "Moneyball", "director": "Bennett Miller", "year": "2011" } # Index the test document so that we have an index that matches the timestring pattern. # You can delete this line and the test document if you already created some test indices. es.index(index="movies-2017.01.31", doc_type="movie", id="1", body=document) index_list = curator.IndexList(es) # Filters by age, anything with a time stamp older than 30 days in the index name. index_list.filter_by_age(source='name', direction='older', timestring='%Y.%m.%d', unit='days', unit_count=30) # Filters by naming prefix. # index_list.filter_by_regex(kind='prefix', value='my-logs-2017') # Filters by age, anything created more than one month ago. # index_list.filter_by_age(source='creation_date', direction='older', unit='months', unit_count=1) print("Found %s indices to delete" % len(index_list.indices)) # If our filtered list contains any indices, delete them. if index_list.indices: curator.DeleteIndices(index_list).do_action()

hostregion의 값을 업데이트해야 합니다.

다음 코드 샘플은 2주일 이상 된 스냅샷을 모두 삭제합니다. 또한 새 스냅샷을 캡처합니다.

스냅샷 삭제

import boto3 from datetime import datetime from requests_aws4auth import AWS4Auth from elasticsearch import Elasticsearch, RequestsHttpConnection import logging import curator # Adding a logger isn't strictly required, but helps with understanding Curator's requests and debugging. logger = logging.getLogger('curator') logger.addHandler(logging.StreamHandler()) logger.setLevel(logging.INFO) host = '' # For example, search-my-domain.region.es.amazonaws.com region = '' # For example, us-west-1 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) repository_name = 'my-repo' # Lambda execution starts here. def lambda_handler(event, context): now = datetime.now() # Clunky, but this approach keeps colons out of the URL. date_string = '-'.join((str(now.year), str(now.month), str(now.day), str(now.hour), str(now.minute))) snapshot_name = 'my-snapshot-prefix-' + date_string # Build the Elasticsearch client. es = Elasticsearch( hosts = [{'host': host, 'port': 443}], http_auth = awsauth, use_ssl = True, verify_certs = True, connection_class = RequestsHttpConnection, timeout = 120 # Deleting snapshots can take a while, so keep the connection open for long enough to get a response. ) try: # Get all snapshots in the repository. snapshot_list = curator.SnapshotList(es, repository=repository_name) # Filter by age, any snapshot older than two weeks. # snapshot_list.filter_by_age(source='creation_date', direction='older', unit='weeks', unit_count=2) # Delete the old snapshots. curator.DeleteSnapshots(snapshot_list, retry_interval=30, retry_count=3).do_action() except (curator.exceptions.SnapshotInProgress, curator.exceptions.NoSnapshots, curator.exceptions.FailedExecution) as e: print(e) # Split into two try blocks. We still want to try and take a snapshot if deletion failed. try: # Get the list of indices. # You can filter this list if you didn't want to snapshot all indices. index_list = curator.IndexList(es) # Take a new snapshot. This operation can take a while, so we don't want to wait for it to complete. curator.Snapshot(index_list, repository=repository_name, name=snapshot_name, wait_for_completion=False).do_action() except (curator.exceptions.SnapshotInProgress, curator.exceptions.FailedExecution) as e: print(e)

에 대한 값을 업데이트해야 합니다.host,region,snapshot_name, 및repository_name를 선택합니다. 출력이 너무 자세하다고 생각되면 logging.INFOlogging.WARN으로 변경할 수 있습니다.

스냅샷을 만들고 삭제하는 데 시간이 오래 걸릴 수 있으므로 이 코드는 연결 및 Lambda 시간 초과에 더 민감하므로 추가 로깅 코드가 필요합니다. Elasticsearch 클라이언트에서 제한 시간이 120초로 설정되어 있습니다. 경우DeleteSnapshots함수가 Amazon ES 도메인에서 응답을 받는 데 이보다 오래 걸리는 경우, 이 값을 늘려야 할 수 있습니다. 이와 함께 Lambda 함수의 제한 시간도 기본값인 3초에서 더 늘려야 합니다. 권장되는 값은기본 설정 단원을 참조하십시오.

기본 설정

이 코드 샘플에는 다음 설정을 사용하는 것이 좋습니다.

샘플 코드 Memory Timeout
인덱스 삭제 128MB 10초
스냅샷 삭제 128MB 3 minutes

Triggers

이 함수는 특정 이벤트 (예: Amazon S3 파일 업로드) 에 대응하는 대신 예약 작동하도록 되어 있습니다. 이러한 함수를 더 자주 또는 더 간헐적으로 실행할 수 있습니다.

샘플 코드 서비스 규칙 유형 예제 표현식
인덱스 삭제 CloudWatch 이벤트 예약 표현식 요금(1일)
스냅샷 삭제 CloudWatch 이벤트 예약 표현식 속도(4시간)

Permissions

이 섹션의 Lambda 함수는 둘 다 모든 Lambda 함수에 필요한 기본 로깅 권한과 함께 Amazon ES 도메인에 대한 HTTP 메서드 권한을 요구합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:us-west-1:123456789012:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:us-west-1:123456789012:log-group:/aws/lambda/your-lambda-function:*" ] }, { "Effect": "Allow", "Action": [ "es:ESHttpPost", "es:ESHttpGet", "es:ESHttpPut", "es:ESHttpDelete" ], "Resource": "arn:aws:es:us-west-1:123456789012:domain/my-domain/*" } ] }