목차
특정 정보를 저장하는 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
끝
'CLOUD > AWS' 카테고리의 다른 글
AWS 기본 서브넷 퍼블릭 서브넷 (0) | 2023.09.14 |
---|---|
AWS opensearch Disk Throughput Throttle 이벤트 (0) | 2023.08.30 |
aws eks 에 container insight 설정하는 예제 (0) | 2023.08.23 |
AWS EKS nodegroup: still creating 계속 지속 (0) | 2023.07.31 |
aws ecs container cpu memory 매핑 에러 TaskFailedToStart: RESOURCE:MEMORY (0) | 2023.07.28 |
댓글