Amazon Elasticsearch Service 클러스터의 수동 스냅샷 오류를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 5월 20일

Amazon Elasticsearch Service(Amazon ES) 클러스터의 수동 스냅샷을 복원하려고 합니다. 그러나 리포지토리를 등록하거나 등록된 리포지토리에 액세스하려고 하면 오류가 발생합니다. 왜 이런 현상이 발생하며, 이 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

Amazon ES의 수동 스냅샷에서 데이터를 성공적으로 마이그레이션하려면 다음 단계를 수행하세요.

1.    스냅샷을 저장할 Amazon Simple Storage Service(Amazon S3) 버킷을 선택합니다.

2.    Amazon ES 소스 클러스터에 Amazon S3 버킷을 등록합니다.

3.    Amazon ES 소스 클러스터의 스냅샷을 만들어 Amazon S3 버킷에 저장합니다.

4.    수동 스냅샷을 볼 수 있도록 동일한 Amazon S3 버킷에 대상 클러스터를 등록합니다.

5.    Amazon ES의 대상 클러스터에 수동 스냅샷을 복원합니다.

이렇게 하지 않으면 다음 문제 중 하나가 발생할 수 있습니다.

  • 403 Unauthorized 오류
  • repository_missing_exception
  • concurrent_snapshot_execution_exception
  • snapshot_restore_exception
  • a_w_s_security_token_service_exception
  • ‘PARTIAL’ 스냅샷 상태
  • Amazon S3 Glacier 스토리지 클래스 문제

해결 방법

403 Unauthorized 오류

Amazon ES 도메인에서 FGAC(세분화된 액세스 제어)를 활성화한 경우, 스냅샷을 만들 때 다음과 같은 오류가 발생할 수 있습니다.

{"error":{"root_cause":[{"type":"security_exception","reason":"no permissions for [cluster:admin/repository/put] and User [name=arn:aws:iam::012345678912:user/username, backend_roles=[], requestedTenant=null]"}],"type":"security_exception","reason":"no permissions for [cluster:admin/repository/put] and User [name=arn:aws:iam::012345678912:user/username, backend_roles=[], requestedTenant=null]"},"status":403}

403 Unauthorized 오류를 해결하려면 수동 스냅샷을 만들 때마다 username:password 파라피터를 지정해야 합니다.

curl -XPUT -u username:password123$ 'elasticsearch-domain-endpoint/_snapshot/snapshot-repository-name/snapshot-name'

참고: Amazon ES 도메인에 대해 세분화된 액세스 제어를 활성화하려면 수퍼유저여야 합니다. 수퍼유저 이름 및 암호를 사용하거나 AWS Identity Access Management(IAM) 역할을 수퍼유저로 설정할 수 있습니다. 클러스터 스냅샷에 액세스할 때 수퍼유저 자격 증명 또는 IAM 역할을 지정합니다. IAM 역할을 지정하는 경우 IAM 역할은 sigv4를 사용하여 HTTP 요청에 서명해야 합니다. 세분화된 액세스 제어 및 IAM 역할 사용에 대한 자세한 내용은 Amazon Elasticsearch Service 도메인 생성 및 관리를 참조하세요.

또한 스냅샷에 스냅샷 리포지토리를 등록하고 manage_snapshots 역할을 IAM 역할에 매핑해야 합니다. manage_snapshots 역할에는 IAM 역할(TheSnapshotRole)을 수임할 수 있는 적절한 권한(IAM:PassRole)이 있어야 합니다. 자세한 내용은 수동 스냅샷 필수 조건을 참조하세요.

manage_snapshots 역할을 IAM 역할에 매핑하려면 다음 단계를 수행하세요.

1.    Kibana 콘솔을 엽니다.

2.    기본 사용자로 로그인합니다.

3.    [보안(Security)]을 선택합니다.

4.    [역할(Roles)]을 선택합니다.

5.    사용자 역할로 managed_snapshots을 선택합니다.

6.    매핑된 사용자(Mapped users)를 선택합니다.

7.    매핑 관리를 선택합니다.

8.    사용자 아래에 사용자 ARN(예: ‘arn:aws:iam::012345678912:user/username’)을 추가합니다.

9.    수동 스냅샷 리포지토리를 등록합니다.

Repository_missing_exception

수동 인덱스 스냅샷을 만들기 전에 Amazon ES에 수동 스냅샷 리포지토리를 등록해야 합니다. IAM 역할(TheSnapshotRole)도 Amazon S3에서 작동하도록 설정해야 합니다.

수동 스냅샷을 만들기 전에 스냅샷 리포지토리를 등록하지 않았거나 잘못된 리포지토리 이름을 사용하는 경우 다음과 같은 오류가 발생합니다.

{"error":{"root_cause":[{"type":"repository_missing_exception","reason":"[snapshot-repository-name] missing"}],"type":"repository_missing_exception","reason":"[snapshot-repository-name] missing"},"status":404}

이 오류를 해결하려면 수동 스냅샷 필수 조건을 충족하는지 확인합니다. 또한 리포지토리 이름에 오타가 있는지 확인합니다.

Concurrent_snapshot_execution_exception

스냅샷이 현재 진행 중인 경우 다른 스냅샷을 만들려고 할 때 다음과 같은 오류가 발생합니다.

The below error “concurrent_snapshot_execution_exception” means that a snapshot is already in progress
{"error":{"root_cause":[{"type":"concurrent_snapshot_execution_exception","reason":"[snapshot-repository-name:snapshot-name] a snapshot is already running"}],"type":"concurrent_snapshot_execution_exception","reason":"[snapshot-repository-name:snapshot-name] a snapshot is already running"}

진행 중인 다른 스냅샷이 있는지 확인하려면 다음 명령을 실행합니다.

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

스냅샷이 이미 진행 중인 경우 현재 스냅샷이 완료될 때까지 기다립니다. 또는 스냅샷이 중단되었다고 의심되는 경우 시간별 스냅샷 기록을 확인합니다. 자세한 내용은 Amazon Elasticsearch Service 클러스터를 업그레이드하는 동안 발생하는 ‘이전 스냅샷 작업이 아직 완료되지 않음’ 오류를 해결하려면 어떻게 해야 합니까?를 참조하세요.

Snapshot_restore_exception

온프레미스 Elasticsearch 클러스터에서 Amazon ES 도메인으로 데이터를 마이그레이션하려고 하면 다음과 같은 예외가 발생할 수 있습니다.

{
  "error": {
    "root_cause": [
      {
        "type": "snapshot_restore_exception",
        "reason": "[manual-snapshot-repo:my-manual-snapshot1/HPOcIJryTj6a6GJvyP79bw] the snapshot was created with Elasticsearch version [6.8.0] which is higher than the version of this node [6.7.0]"
      }
    ],
    "type": "snapshot_restore_exception",
    "reason": "[manual-snapshot-repo:my-manual-snapshot1/HPOcIJryTj6a6GJvyP79bw] the snapshot was created with Elasticsearch version [6.8.0] which is higher than the version of this node [6.7.0]"
  },
  "status": 500
}

이 오류 메시지는 기존 클러스터에서 만들어진 스냅샷이 Amazon ES가 아닌 다른 버전의 Elasticsearch에서 실행 중일 때 발생합니다. 클러스터가 Amazon ES보다 이전 버전의 Elasticsearch에서 실행 중인 경우 Elasticsearch 버전을 업그레이드하는 것이 좋습니다. 또는 원격 인덱스 재지정 API를 사용하여 인덱스를 마이그레이션할 수 있습니다.

a_w_s_security_token_service_exception

수동 스냅샷과 연결된 IAM 역할에 ‘es.amazonaws.com’에 대해 설정된 신뢰 관계가 없는 경우 다음과 같은 예외가 발생합니다.

{
  "error" : {
    "root_cause" : [
      {
        "type" : "repository_exception",
        "reason" : "[es_01082021_repo] Could not determine repository generation from root blobs"
      }
    ],
    "type" : "repository_exception",
    "reason" : "[es_01082021_repo] Could not determine repository generation from root blobs",
    "caused_by" : {
      "type" : "i_o_exception",
      "reason" : "Exception when listing blobs by prefix [index-]",
      "caused_by" : {
        "type" : "a_w_s_security_token_service_exception",
        "reason" : "a_w_s_security_token_service_exception: User: arn:aws:sts::332315457451:assumed-role/cp-sts-grant-role/swift-us-west-2-prod-679203657591 is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::679203657591:role/ES_Backup_Role (Service: AWSSecurityTokenService; Status Code: 403; Error Code: AccessDenied; Request ID: 36d09b93-d94f-457e-8fa5-b0a50ba436c3)"
      }
    }
  },
  "status" : 500
}

Amazon ES 스냅샷을 사용하면 내부 역할이 생성됩니다(예: arn:aws:sts::332315457451:assumed-role/cp-sts-grant-role/swift-us-west-2-prod-679203657591). 이 내부 역할은 수동 스냅샷과 연결된 IAM 역할을 수임한 다음 필요한 작업을 수행합니다.

보안 토큰 예외를 해결하려면 수동 스냅샷과 연결된 IAM 역할을 지정해야 합니다. 수동 스냅샷과 연결된 IAM 역할이 없는 경우에는 IAM 역할을 생성해야 합니다. 자세한 내용은 수동 스냅샷 필수 조건을 참조하세요.

또한 수동 스냅샷과 연결된 IAM 역할에 대한 신뢰 관계를 확인합니다. 역할에 대한 신뢰 관계는 다음과 같이 보안 주체 문에 Amazon ES를 지정해야 합니다.

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

PARTIAL 스냅샷 상태

스냅샷은 다음과 같은 이유로 ‘PARTIAL’ 상태가 됩니다.

부분 스냅샷은 샤드의 데이터를 저장할 수 없음을 나타냅니다. 부분 스냅샷에서도 데이터를 복원할 수는 있지만 누락된 인덱스를 복원하려면 이전 스냅샷을 사용해야 합니다. 클러스터가 “PARTIAL” 상태로 진입했는지 확인하려면 스냅샷 기록을 확인하세요. 자세한 내용은 스냅샷 복원을 참조하세요.

Amazon S3 Glacier 스토리지 클래스 문제

복원된 스냅샷을 Amazon Simple Storage Service Glacier 스토리지 클래스에 저장하는 경우 버킷에 Amazon S3 Glacier 수명 주기 규칙을 적용하지 않아야 합니다. 수동 스냅샷은 Amazon S3 Glacier 스토리지 클래스를 지원하지 않습니다. 따라서 Amazon S3 Glacier 수명 주기 정책을 S3 버킷에 적용하는 경우 이전되는 모든 객체를 다시 옮겨야 합니다.

객체를 표준 Amazon S3 스토리지 클래스로 다시 옮긴 후 해당 스냅샷에서 객체를 복원할 수 있습니다. 자세한 내용은 수동 스냅샷 필수 조건을 참조하세요.