kyucumber
전체 글 보기

Amazon OpenSearch Service 백업을 위한 스냅샷 관리 자동화


엘라스틱서치를 사용하면 인덱스의 도큐먼트를 백업해야 하는 경우가 자주 있습니다.

현재 Amazon OpenSearch Service 서비스를 활용하고 있습니다. Amazon OpenSearch Service 서비스에서 영구적인 데이터 보관을 위해 S3에 어떻게 데이터를 백업하는지 정리합니다.

OpenSearch에서 제공하는 스냅샷 생성 방식

OpenSearch에서는 아래와 같은 두가지 방식의 스냅샷 생성을 제공합니다.

  • Automated snapshots - 자동 스냅샷
  • Manual snapshots - 수동 스냅샷

버전마다 보관 기간은 다르지만 자동 스냅샷은 14일 가량의 짧은 기간동안만 보관되므로 인덱스 데이터를 S3 등에 영구적으로 보관하기 위해서는 수동 스냅샷을 사용해야 합니다.

수동 스냅샷 기능과 ISM(Index State Management)기능을 활용하면 인덱스의 기간, 크기, 문서 수 등의 변화에 따라 수동 스냅샷을 자동으로 생성할 수 있습니다.

해당 문서에서는 수동 스냅샷 생성을 위한 절차와 ISM 정책 적용에 대한 내용에 대해 정리합니다.

OpenSearch 스냅샷 백업을 위한 S3 버킷 생성

OpenSearch가 스냅샷 저장소로 사용할 S3 버킷을 생성합니다. Es snapshot bucket

스냅샷 레파지토리 및 스냅샷 생성을 위한 IAM Role 생성

스냅샷 레파지토리 등록, 스냅샷 저장, 삭제, 조회 등을 위해 OpenSearch에서 S3에 대해 저장, 조회, 삭제 등을 할 수 있는 IAM Role이 필요합니다.

  • IAM Role 생성하기

ES snapshot iam role

  • Policy 생성하기

생성한 IAM Role에 바인딩 할 정책 생성합니다.

{ "Version": "2012-10-17", "Statement": [{ "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::elasticsearch-snapshot" ] }, { "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::elasticsearch-snapshot/*" ] }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "해당 IAM Role 생성 이후 생성된 IAM Role의 arn 입력" }, { "Effect": "Allow", "Action": "es:ESHttpPut", "Resource": "Elasticsearch service에 대한 arn 입력" } ] }
  • IAM Role에 Policy 바인딩

Policy를 IAM Role에 바인딩합니다.

  • 생성된 IAM Role에 Trust relationship 설정하기

OpenSearch가 해당 Role을 Assume할 수 있도록 아래와 같은 Trust Relationship을 생성한 Role에 추가합니다.

{ "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": { "Service": "es.amazonaws.com" }, "Action": "sts:AssumeRole" }] }

스냅샷 레파지토리 생성

스냅샷의 생성 및 관리를 위해서는 Snapshot Repository가 사전에 등록되어 있어야 합니다. 일회성 작업이기 때문에 간단하게 Python 스크립트를 작성해 사용했습니다.

저는 해당 스크립트를 이전에 생성한 IAM Role을 바인딩한 EC2에서 실행했습니다.

import boto3 import requests from requests_aws4auth import AWS4Auth bucket = "elasticsearch-snapshot" role_arn = "arn:aws:iam::00000000000:role/elasticsearchSnapshotRole" host = "https://{$elasticsearchDomain}/" region = "ap-northeast-2" service = "es" credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) # Register snapshot repository path = "_snapshot/" + bucket url = host + path payload = { "type": "s3", "settings": { "bucket": bucket, "region": region, "role_arn": role_arn } } headers = {"Content-Type": "application/json"} r = requests.put(url, auth=awsauth, json=payload, headers=headers) print(r.status_code) print(r.text)

Index State Management

OpenSearch에서는 Open Distro For Elasticsearch 기능을 제공하며 Open Distro에는 ISM(Index State management) 플러그인이 포함되어 있습니다. ISM 플러그인을 활용하면 인덱스 기간, 인덱스 크기, 문서 수 변경을 기반으로 주기적인 인덱스 관리 작업을 자동화 할 수 있습니다.

Index State Management Policy

ISM Policy는 아래와 같은 구조를 가지고 있습니다. 하위에 states 및 ism_template 등의 속성 값을 가집니다.

{ "policy": { "description": "Example policy.", "default_state": "empty", "states": [ { "name": "empty", "actions": [], "transitions": [] } ], "ism_template": { "index_patterns": ["test-index-v1*"], "priority": 100 } } }
  • states

정책이 가지는 여러 상태들에 대해 정의할 수 있습니다. 각각의 상태에는 상태 진입 시 순차적으로 실행되는 action과 모든 action들이 완료된 후 상태 변경을 수행하는 transition이 존재합니다.

  • action

action은 상태 변경에 따라 순차적으로 실행되는 작업입니다. 스냅샷을 생성하거나, 인덱스를 삭제하는 등 다양한 작업을 수행할 수 있습니다.

// occupied 상태로 전환되는 시점에 스냅샷 생성 action 수행 "states": [ { "name": "occupied", "actions": [ { "snapshot": { "repository": "elasticsearch-snapshot" } } ], // ... } ]
  • transition

상태가 변경되기 위해 충족되어야 하는 조건을 정의합니다. 현재 상태의 모든 action의 수행이 완료된 후 transition을 체크하고 상태 변경을 수행합니다.

// empty 상태의 모든 action을 수행하고 조건이 충족되면 occupied 상태로 변경 "states": [ { "name": "empty", "actions": [], "transitions": [ { "state_name": "occupied", "conditions": { "min_index_age": "10d" } } ] }, // ... ]
  • ism_template

템플릿 패턴을 정의해 해당 패턴이 일치하는 인덱스에 자동으로 정책을 적용합니다.

// test-index-v1-* 패턴과 일치하는 인덱스 생성 시 해당 정책 적용 "ism_template": { "index_patterns": ["test-index-v1-*"], "priority": 100 }

Index State Management Policy를 이용한 수동 스냅샷 생성 자동화

위에서 등록한 레파지토리를 기반으로 수동 스냅샷을 생성할 수 있습니다. 레파지토리 등록과 동일하게 Python 코드로 수동 스냅샷 생성을 진행할 수 있지만 여기서는 Index State Management 기능을 이용해 스냅샷을 생성합니다.

일회성 작업이 아니라 지속적으로 스냅샷을 생성해야 한다면 Index State Management 기능을 활용하는게 좋습니다.

Index State Management Policy 생성하기

키바나의 아래 화면 혹은 api 호출을 통해 Policy를 생성할 수 있습니다.

es-snapshot-ism-policy-create

PUT _opendistro/_ism/policies/auto-snapshot-policy { "policy": { "description": "Takes an index snapshot.", "default_state": "empty", "states": [ { "name": "empty", "actions": [], "transitions": [ { "state_name": "occupied", "conditions": { "min_index_age": "10d" } } ] }, { "name": "occupied", "actions": [ { "snapshot": { "repository": "elasticsearch-snapshot", } } ], "transitions": [] } ], "ism_template": { "index_patterns": [ "test-index-v1*" ], "priority": 100 } } }

정책을 생성하면 신규 생성되는 test-index-v1-* 패턴의 인덱스에 대해 생성 10일 뒤 인덱스 스냅샷을 자동으로 생성하게 됩니다.

es-snapshot-ism-policy

snapshot action은 OpenSearch 7.8 버전부터 제공됩니다.

기존에 존재하던 Index들은 패턴이 일치하더라도 자동으로 정책이 적용되지 않습니다.

Index Management > Policy managed indices 메뉴에서 수동으로 정책을 적용해야 합니다.

Reference