Opensearch에서 다른 Opensearch로 인덱스를 마이그레이션하는 방법에 대해 알아보겠습니다. (Opensearch의 Engine이 Elasticsearch여도 마이그레이션하는 방법은 아래와 동일합니다.)
설명을 위해 지금부터 기존 Opensearch를 '기존 Opensearch', 인덱스가 마이그레이션 될 Opensearch를 '신규 Opensearch'라고 명명하겠습니다.
Snapshot Repository 생성을 위한 사전 작업을 진행하겠습니다.
마이그레이션 할 기존 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 등록
까지 똑같이 진행하면 됩니다.)
Opensearch가 S3 Bucket에 폴더 및 오브젝트를 생성할 수 있도록 Trust entities가 es
인 IAM Role을 생성합니다.
{
"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>/*"
]
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "es.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
참고: 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를 아래와 같이 설정합니다.
{
"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>/*"
]
}
]
}
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>" ]
}'
위에서 말했듯이 Opensearch 대시보드에서는 Snapshot respository 등록이 불가능하기 때문에 curl 명령어나 Postman 툴 등을 활용해야 합니다.
curl을 활용하는 방법을 설명해 보겠습니다.
IAM User의 AccessKey/SecretKey를 export
$ export AWS_ACCESS_KEY="AK************"
$ export AWS_SECRET_KEY="************************"
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"
등록 확인
GET _snapshot?pretty=true
기존 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
개인적으로 공부하며 작성한 글로, 내용에 오류가 있을 수 있습니다.