본문 바로가기
CLOUD/AWS

Opensearch snapshot을 S3에 저장 및 복구,복원 (수동 스냅샷)

by Rainbound-IT 2023. 8. 30.
반응형

목차

     

    특정 정보를 저장하는 opensearch의 백업을 해달라는 요청이 들어왔다.

    일반적으로 opensearch는 증분 백업을 자동으로 s3에 하지만 특정 순간의 백업을 14일 이후로 보관할수 없고 복구가 잘 안될 수도 있다. 그러므로 특정 시간의 정보를 저장하려면 S3에 저장해야한다.

     

    자동백업 정책

    • Elasticsearch 5.3 OpenSearch 이상을 실행하는 도메인의 경우 OpenSearch 서비스는 매시간 자동 스냅샷을 생성하여 14일 동안 최대 336개의 스냅샷을 보존합니다. 시간당 스냅샷은 증분 특성으로 인해 중단이 적습니다. 또한 도메인 문제가 발생할 경우 보다 최근의 복구 시점을 제공합니다.
    • Elasticsearch 5.1 이하를 실행하는 도메인의 경우 OpenSearch Service는 지정한 시간 동안 매일 자동 스냅샷을 생성하여 최대 14개까지 보존하고 30일 이상 스냅샷 데이터를 보존하지 않습니다.

     

    그래서 수동 스냅샷을 생성해야하는데 AWS의 거의 모든서비스가 그렇듯이 S3에 스냅샷을 저장할 수가 있어 opensearch도 마찬가지로 S3로 저장해야한다.

     

    S3 버킷생성

    S3 버킷생성은 특별히 다를게 없기 때문에 그냥 생성하면된다.

     

     

    IAM 역할 설정

    opensearch에서 역할관련 설정을 해야한다.

     

    IAM - 역할 에서 역할 만들기에 들어간다.

     

    사용자 지정 신뢰 정책 선택

     

    신뢰할 수 있는 엔터티 선택에서 사용자 지정 신뢰 정책을 선택한다.

     

    신뢰 관계 편집

    아래 편집에 다음과 같이 입력한다.

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

    (공식문서는 옛날이라 es로 되어있는데 안될것 같아서 opensearch로 해놓았다.)

     

     

     

     

    권한 추가

    다음으로 넘어가면 권한 정책 설정이 나오는데 정책 생성을 클릭하여 다음 정책을 추가하고 선택한뒤 다음으로 넘어가자

     

     

    S3 버킷 액세스 정책

    {
      "Version": "2012-10-17",
      "Statement": [{
          "Action": [
            "s3:ListBucket"
          ],
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::s3-bucket-name"
          ]
        },
        {
          "Action": [
            "s3:GetObject",
            "s3:PutObject",
            "s3:DeleteObject"
          ],
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::s3-bucket-name/*"
          ]
        }
      ]

     

     

    스냅샷 리포지토리를 역할에 등록하려면 OpenSearch Service에 전달할 수 있어야 합니다. es:ESHttpPut 작업에도 액세스해야 하기 위한 추가 정책입니다. 한번에 해도 되고 나눠서 해도 될것 같네요.

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "iam:PassRole",
          "Resource": "arn:aws:iam::123456789012:role/TheSnapshotRole"
        },
        {
          "Effect": "Allow",
          "Action": "es:ESHttpPut",
          "Resource": "arn:aws:es:region:123456789012:domain/domain-name/*"
        }
      ]
    }

     

     

    역할 이름을 넣고 생성하면 됩니다.

     

     

    나머지는 확인 사항이라 확인하시고 문제 없으면 역할 생성을 합니다.

     

     

     

    리포지토리 등록

    이제 스냅샷 디렉터리를 opensearch 에 등록하면된다.

     

    Curl 사용

    curl -X PUT "domain-endpoint/_snapshot/my-snapshot-repo-name" `
      -H "Content-Type: application/json" `
      -d '{"type":"s3","settings":{"bucket":"s3-bucket-name","region":"region","role_arn":"arn:aws:iam::123456789012:role/TheSnapshotRole"}}'

    (윈도우 powershell을 사용할 경우입니다)

     

    Python 클라이언트 사용

    import boto3
    import requests
    from requests_aws4auth import AWS4Auth
    
    host = '' # domain endpoint with trailing /
    region = '' # e.g. us-west-1
    service = 'es'
    credentials = boto3.Session().get_credentials()
    awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
    
    # Register repository
    
    path = '_snapshot/my-snapshot-repo-name' # the OpenSearch API endpoint
    url = host + path
    
    payload = {
      "type": "s3",
      "settings": {
        "bucket": "s3-bucket-name",
        "region": "us-west-1",
        "role_arn": "arn:aws:iam::123456789012:role/snapshot-role"
      }
    }
    
    headers = {"Content-Type": "application/json"}
    
    r = requests.put(url, auth=awsauth, json=payload, headers=headers)
    
    print(r.status_code)
    print(r.text)
    python 클라이언트로 할경우 linux나 mac은 상관없으나 boto3 사용하려면 윈도우는 까다로울 수 있는데 anaconda를 설치하여 진행하면 쉽게 할수 있다.ㅏ

     

     

    여기서 s3 버킷의 특정 폴더에 snapshot을 저장하고 싶으면

    settings에 "base_path": "opensearch/", 를 추가하면 된다.

     

    위 에 것들을  정상적으로 실행하면

    이렇게 나온다

    "accepted":true 라고 메시지가 나온다.

     

     

    수동 스냅샷 생성

     

    curl -XPUT 'domain-endpoint/_snapshot/repository-name/snapshot-name'

    위 명령어 입력하면 정상적으로 되면 등록과 마찬가지로 accepted: ture가 발생한다.

     

     

    opensearch의 용량에 따라 snapshot 생성되는 시간이 다를텐데 끝났는지 확인하려면 다음과 같이 입력한다.

     

    curl -XGET 'domain-endpoint/_snapshot/_status'

     

    이런식으로 처리과정이 나온다.

     

    진행중이라면 위와 같이 나오고 다 끝나면 아래와 같이 내용이 나오지 않는다.

    끝나면 내용이 안나온다.

     

    S3에 가보면 파일이 저장되어 있다.

    이런식으로 저장이 되어 있다.

     

     

    복원,복구

    새 opensearch를 생성한경우

    snapshot repository를 등록한다.

     

    curl -XPOST 'domain-endpoint/_snapshot/repository-name/snapshot-name/_restore'

    위 명령어를 통하여 복구를 진행하면 된다.

     

    이미 등록되어 있는경우는 위 명령어만 입력하면된다.

     

     

     

     

     

     

     

    Reference

    https://docs.aws.amazon.com/ko_kr/opensearch-service/latest/developerguide/managedomains-snapshots.html#managedomains-snapshot-prerequisites

     

    아마존 OpenSearch 서비스에서 인덱스 스냅샷 생성 - 아마존 OpenSearch 서비스

    기본 샤드 중 일부만 관련 인덱스에 사용할 수 있는 경우, 스냅샷에 state의 PARTIAL이(가) 있을 수 있습니다. 이 값은 최소한 샤드 하나의 데이터가 제대로 저장되지 않았음을 의미합니다. 부분 스

    docs.aws.amazon.com

     

     

    반응형

    댓글