수동 스냅샷 리포지토리 등록 - Amazon OpenSearch 서비스

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

수동 스냅샷 리포지토리 등록

수동 인덱스 스냅샷을 생성하려면 OpenSearch Service를 사용해 스냅샷 리포지토리를 등록해야 합니다. 이 일회성 작업을 수행하려면 사전 조건에서 설명하는 것처럼 TheSnapshotRole에 액세스할 수 있는 자격 증명을 이용해 AWS 요청에 서명해야 합니다.

1단계: OpenSearch 대시보드에서 스냅샷 역할 매핑(세분화된 액세스 제어를 사용하는 경우)

세분화된 액세스 제어를 사용하면 리포지토리를 등록할 때 추가 단계가 있습니다. 다른 모든 목적으로 HTTP 기본 인증을 사용하더라도 TheSnapshotRole을 전달할 iam:PassRole 권한이 있는 IAM 역할에 manage_snapshots 역할을 매핑해야 합니다.

  1. OpenSearch Service 도메인에 대한 OpenSearch 대시보드 플러그인으로 이동합니다. OpenSearch Service 콘솔의 도메인 대시보드에서 Dashboards 엔드포인트를 찾을 수 있습니다.

  2. 주 메뉴에서 보안(Security), 역할(Roles)을 선택하고 manage_snapshots 역할을 선택합니다.

  3. 매핑된 사용자(Mapped users), 매핑 관리(Manage mapping)를 차례로 선택합니다.

  4. TheSnapshotRole을 전달할 권한이 있는 역할의 ARN을 추가합니다. Backend roles(백엔드 역할) 아래에 역할 ARN을 배치합니다.

    arn:aws:iam::123456789123:role/role-name
  5. 맵(Map)을 선택하고 매핑된 사용자(Mapped users)에 사용자 또는 역할이 나타나는지 확인합니다.

2단계: 리포지토리 등록

다음 스냅샷 탭은 스냅샷 디렉토리를 등록하는 방법을 보여줍니다. 수동 스냅샷을 암호화하고 새 도메인으로 마이그레이션한 후 스냅샷을 등록하는 것과 관련된 옵션은 관련 탭을 참조하세요.

Snapshots

스냅샷 리포지토리를 등록하려면 PUT 요청을 OpenSearch Service 도메인 엔드포인트로 보냅니다. 대신 샘플 Python 클라이언트, Postman이나 다른 방법으로 서명된 요청을 전송해 스냅샷 리포지토리를 등록합니다. OpenSearch 대시보드 콘솔에서 리포지토리를 등록하는 데 PUT 요청을 사용할 수 없습니다.

요청은 다음과 같은 형식을 취합니다.

PUT domain-endpoint/_snapshot/my-snapshot-repo-name { "type": "s3", "settings": { "bucket": "s3-bucket-name", "base_path": "my/snapshot/directory", "region": "region", "role_arn": "arn:aws:iam::123456789012:role/TheSnapshotRole" } }
참고

리포지토리 이름은 “cs-”로 시작할 수 없습니다. 또한 여러 도메인에서 동일한 리포지토리에 쓰면 안 됩니다. 하나의 도메인에만 리포지토리에 대한 쓰기 액세스 권한이 있어야 합니다.

도메인이 Virtual Private Cloud(VPC)에 상주하는 경우, 요청이 스냅샷 리포지토리를 등록하려면 컴퓨터가 VPC에 연결되어야 합니다. VPC 액세스는 네트워크 구성에 따라 다르지만, VPN 또는 회사 네트워크 연결이 필요할 수 있습니다. OpenSearch Service 도메인에 도달할 수 있는지 알아보려면 웹 브라우저에서 https://your-vpc-domain.region.es.amazonaws.com으로 이동하여 기본 JSON 응답을 받을 수 있는지 확인합니다.

Amazon S3 버킷이 OpenSearch 도메인이 아닌 다른 AWS 리전에 있는 경우 "endpoint": "s3.amazonaws.com" 파라미터를 요청에 추가합니다.

Encrypted snapshots

현재 AWS Key Management Service(KMS) 키를 사용하여 수동 스냅샷을 암호화할 수 없지만 서버 측 암호화(SSE)를 사용하여 이 스냅샷을 보호할 수 있습니다.

스냅샷 리포지토리로 사용하는 버킷에 대해 S3 관리형 키로 SSE를 활성화하려면 PUT 요청의 "settings" 블록에 "server_side_encryption": true를 추가합니다. 자세한 내용은 Amazon Simple Storage Service 사용 설명서Amazon S3 관리형 암호화 키를 사용하여 서버 측 암호화를 통해 데이터 보호를 참조하세요.

또는 스냅샷 리포지토리로 사용하는 S3 버킷에서 서버 측 암호화를 위해 AWS KMS 키를 사용할 수 있습니다. 이 접근 방식을 사용하는 경우 S3 버킷을 암호화하는 데 사용되는 AWS KMS 키에 TheSnapshotRole 허가를 제공했는지 확인하세요. 자세한 내용은 AWS KMS에서 키 정책을 참조하세요.

Domain migration

스냅샷 리포지토리 등록은 일회성 작업입니다. 하지만 한 도메인에서 다른 도메인으로 마이그레이션하려면 기존 도메인과 새 도메인에서 동일한 스냅샷 리포지토리를 등록해야 합니다. 리포지토리 이름은 임의의 이름입니다.

새 도메인으로 마이그레이션하거나 동일한 리포지토리를 여러 도메인으로 등록할 때는 다음 지침을 고려합니다.

  • 새 도메인에 리포지토리를 등록하는 경우 PUT 요청의 "settings" 블록에 "readonly": true를 추가합니다. 이 설정을 사용하면 실수로 이전 도메인의 데이터를 덮어쓰지 않을 수 있습니다. 하나의 도메인에만 리포지토리에 대한 쓰기 액세스 권한이 있어야 합니다.

  • 데이터를 다른 AWS 리전의 도메인으로 마이그레이션하는 경우(예: us-east-2에 있는 이전 도메인 및 버킷에서 us-west-2의 새 도메인으로 마이그레이션하는 경우) PUT 문에서 "region": "region"(을)를 "endpoint": "s3.amazonaws.com"(으)로 대체하고 해당 요청을 다시 시도합니다.

샘플 Python 클라이언트 사용하기

Python 클라이언트는 간단한 HTTP 요청보다 자동화가 쉽고 재사용성이 뛰어납니다. 이 메서드를 사용하여 스냅샷 리포지토리를 등록하려면 다음 샘플 Python 코드를 register-repo.py와 같은 Python 파일로 저장합니다. 클라이언트는 AWS SDK for Python (Boto3), requestsrequests-aws4auth 패키지를 요구합니다. 클라이언트는 다른 스냅샷 작업을 위한 주석 처리된 예제를 포함하고 있습니다.

샘플 코드에서 변수 host, region, path, payload를 업데이트합니다.

import boto3 import requests from requests_aws4auth import AWS4Auth host = '' # domain endpoint 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", "base_path": "my/snapshot/directory", "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) # # Take snapshot # # path = '/_snapshot/my-snapshot-repo-name/my-snapshot' # url = host + path # # r = requests.put(url, auth=awsauth) # # print(r.text) # # # Delete index # # path = 'my-index' # url = host + path # # r = requests.delete(url, auth=awsauth) # # print(r.text) # # # Restore snapshot (all indexes except Dashboards and fine-grained access control) # # path = '/_snapshot/my-snapshot-repo-name/my-snapshot/_restore' # url = host + path # # payload = { # "indices": "-.kibana*,-.opendistro_security,-.opendistro-*", # "include_global_state": False # } # # headers = {"Content-Type": "application/json"} # # r = requests.post(url, auth=awsauth, json=payload, headers=headers) # # print(r.text) # # # Restore snapshot (one index) # # path = '/_snapshot/my-snapshot-repo-name/my-snapshot/_restore' # url = host + path # # payload = {"indices": "my-index"} # # headers = {"Content-Type": "application/json"} # # r = requests.post(url, auth=awsauth, json=payload, headers=headers) # # print(r.text)