AWS Opensearch(Elasticsearch) 인덱스 마이그레이션하기

brillog·2025년 1월 9일
0

AWS

목록 보기
8/8

Opensearch에서 다른 Opensearch로 인덱스를 마이그레이션하는 방법에 대해 알아보겠습니다. (Opensearch의 Engine이 Elasticsearch여도 마이그레이션하는 방법은 아래와 동일합니다.)

설명을 위해 지금부터 기존 Opensearch를 '기존 Opensearch', 인덱스가 마이그레이션 될 Opensearch를 '신규 Opensearch'라고 명명하겠습니다.

Prerequisites

Snapshot Repository 생성을 위한 사전 작업을 진행하겠습니다.

1. S3 Bucket 생성

마이그레이션 할 기존 Opensearch 내 인덱스를 S3에 백업(Manual snapshot)하기 위해 S3를 생성합니다.


아래 2~5번 과정은 기존 Opensearch와 신규 Opensearch가 있는 계정에서 각각 진행합니다. (기존 Opensearch가 있는 계정에서 2. IAM Role 생성-3. IAM User 생성-4. 매핑-5. Repo 등록 진행하고, 신규 Opensearch에서도 2. IAM Role 생성-3. IAM User 생성-4. 매핑-5. Repo 등록까지 똑같이 진행하면 됩니다.)

2. IAM Role 생성

Opensearch가 S3 Bucket에 폴더 및 오브젝트를 생성할 수 있도록 Trust entities가 es인 IAM Role을 생성합니다.

  1. IAM Role의 Permission 설정
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:GetObject",
                    "s3:DeleteObject",
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::<S3_BUCKET_NAME>",
                    "arn:aws:s3:::<S3_BUCKET_NAME>/*"
                ]
            }
        ]
    }
  2. IAM Role의 Trust relationship 설정
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "",
                "Effect": "Allow",
                "Principal": {
                    "Service": "es.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }

3. IAM User 생성

참고: Registering a manual snapshot repository
"Note that you can't use a PUT request in the OpenSearch Dashboards console to register the repository."

Opensearch 대시보드 내 Dev Tools 콘솔에서는 respository를 등록하기 위한 PUT 요청이 불가능하기 때문에 IAM User의 AccessKey/SecretKey로 curl을 활용한 PUT 요청을 수행하기 위해 IAM User를 생성합니다.

이 IAM User가 위에서 생성한 IAM Role을 Opensearch에 전달할 수 있는 권한(PassRole)을 가질 수 있도록 IAM User의 Permission policy를 아래와 같이 설정합니다.

  1. IAM User의 Policy 설정
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "iam:PassRole"
                ],
                "Resource": "arn:aws:iam::<ACCOUNT_ID>:role/<IAM_ROLE_NAME>"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "es:ESHttpPut",
                    "es:ESHttpGet"
                ],
                "Resource": [
                    "arn:aws:es:<REGION>:<ACCOUNT_ID>:domain/<OPENSEARCH_DOMAIN_NAME>",
                    "arn:aws:es:<REGION>:<ACCOUNT_ID>:domain/<OPENSEARCH_DOMAIN_NAME>/*"
                ]
            }
        ]
    }
  2. IAM User의 AccessKey/SecretKey 생성

4. 생성한 Role/User을 Opensearch에 매핑

Opensearch의 Security > Role 중 manage_snapshots Role에 위에서 생성한 IAM Role과 IAM User를 매핑합니다.

이 과정은 Opensearch Dashboard 콘솔에서 해도 되고 아래와 같이 curl 명령어를 활용해도 됩니다.

$ curl -X PUT -H "Content-Type: application/json" 'https://<ID>:<PASSWORD>@<OPENSEARCH_ENDPOINT>/_plugins/_security/api/rolesmapping/manage_snapshots' -d '
{
  "backend_roles" : [ "arn:aws:iam::<ACCOUNT_ID>:role/<IAM_ROLE_NAME>" ],
  "users" : [ "arn:aws:iam::<ACCOUNT_ID>:user/<IAM_USER_NAME>" ]
}'

5. Snapshot Repository 등록

위에서 말했듯이 Opensearch 대시보드에서는 Snapshot respository 등록이 불가능하기 때문에 curl 명령어나 Postman 툴 등을 활용해야 합니다.

curl을 활용하는 방법을 설명해 보겠습니다.

  1. IAM User의 AccessKey/SecretKey를 export

    $ export AWS_ACCESS_KEY="AK************"
    $ export AWS_SECRET_KEY="************************"
  2. Snapshot Repository 등록

    bucket: 1번에서 생성한 S3 Bucket의 Name 입력
    base_path: Snapshot이 저장될 S3 Bucket의 path 입력
    region: S3 Bucket의 Region 입력
    role_arn: 2번에서 생성한 (S3 Bucket에 Allow 권한을 가진) IAM Role의 ARN 입력

     $ curl --user $AWS_ACCESS_KEY:$AWS_SECRET_KEY -X POST -H "Content-Type: application/json" 'https://<ID>:<PASSWORD>@<OPENSEARCH_ENDPOINT>/_snapshot/<SNAPSHOT_REPO_NAME>' -d '
     {
         "type": "s3",
         "settings": {
             "bucket": "<S3_BUCKET_NAME>",
             "base_path": "<S3_PATH>",
             "region": "<REGION>",
             "role_arn": "arn:aws:iam::<ACCOUNT_ID>:role/<IAM_ROLE_NAME>"
         }
     }' --aws-sigv4 "aws:amz:<REGION>:es"
  3. 등록 확인

    GET _snapshot?pretty=true

Snapshot 생성

기존 Opensearch의 인덱스를 S3에 백업하기 위해 Snapshot을 생성합니다.

※ 이미 Snapshot이 생성 중일 경우, Snapshot 생성이 불가능하기 때문에 먼저 하기 GET 명령어로 현재 생성 중인 상태의 Snapshot이 있는지 확인합니다.

GET _snapshot/_status

결과가 아래와 같이 나오면 생성 중인 Snapshot이 없는 상태이므로 다음 단계를 진행하면 됩니다. (결과가 다르다면 아래와 같은 결과가 나올 때까지 기다려야 합니다.)

{
  "snapshots": []
}

이제 Snapshot을 생성합니다.

PUT _snapshot/<REPOSITORY_NAME>/<SNAPSHOT_NAME>

이렇게 생성한 Snapshot은 S3에 저장되며, 상기 5번 과정(Snapshot Repository 등록)에서 기존 Opensearch와 신규 Opensearch 모두에 이 S3를 Snapshot Repository로 등록했기 때문에 기존 Opensearch를 백업한 Snapshot은 신규 Opensearch에서도 조회 및 복구(restore)가 가능합니다.

# Snapshot 조회
GET _cat/snapshots?v

# Snapshot 복구
POST _snapshot/<REPOSITORY_NAME>/<SNAPSHOT_NAME>/_restore

Reference

개인적으로 공부하며 작성한 글로, 내용에 오류가 있을 수 있습니다.

profile
클라우드 엔지니어 ♡

0개의 댓글

관련 채용 정보