วิธีการ Backup และ Restore ข้อมูลใน Elastic Search ด้วย S3
พอดีผมและทีมได้รับงานให้ Backup ข้อมูลจาก Elasticsearch เพื่อทำการ Upgrade Instance เครื่องของ Elasticsearch แต่ด้วยความที่ Document ของ Elasticsearch และ AWS มันอ่านยากซะเหลือเกินทำให้วันนี้จึงอยากจะแชร์สรุปขั้นตอนการ Backup และ Restore ข้อมูลให้อ่านกันครับ
สิ่งที่ต้องการ
- aws cli
- aws credential (require IAM Full Access Permission)
- brew
- curl หรือ Postman
1. ติดตั้ง aws-es-proxy
ขั้นตอนแรกต้องติดตั้งตัว Proxy ของ ES เพื่อทำการ Access เข้าเครื่อง Elastic และ Service ต่าง ๆ ของ AWS โดยการติดตั้ง aws-es-proxy (https://github.com/abutaha/aws-es-proxy)
ติดตั้ง aws-es-proxy ด้วย brew
brew install aws-es-proxy
เมื่อติดตั้งเสร็จแล้วจะเห็น Path ที่ติดตั้ง aws-es-proxy ลงไป ส่วนในเครื่องผมเป็นดังนี้ครับ
==> Summary
🍺 /usr/local/Cellar/aws-es-proxy/0.8: 6 files, 8.8MB
จากนั้นให้ CD เข้าไปใน Directory ที่ติดตั้งไว้ แล้วก็เข้าใน /bin อีกหนึ่งชั้น
cd /usr/local/Cellar/aws-es-proxy/0.8/bin
Run proxy ด้วยคำสั่ง ./aws-es-proxy -endpoint ตามด้วย domain ของ Elasticsearch
./aws-es-proxy -endpoint https://xxx.es.amazonaws.com
จะเห็นว่า Proxy ได้รันอยู่ในเครื่องเราบน IP 127.0.0.1:9200
2. สร้าง aws role เพื่อให้เราสามารถสร้าง Repository สำหรับ Backup ข้อมูลได้ด้วย aws cli คำสั่ง
aws iam create-role --role-name es-s3-repository --assume-role-policy-document '{"Version": "2012-10-17", "Statement": [{"Sid": "", "Effect": "Allow", "Principal": {"Service": "es.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'
3. สร้าง S3 bucket ที่ User aws ของเราสามารถ access
หากใครไม่ซีเรียสเรื่อง Policy ก็ตั้ง s3 เป็น public ก็ได้ครับ
4. สร้าง Policy ใน IAM แล้ว Attach เข้า Role ที่เราใช้ AWS CLI สร้างไว้ในขั้นตอนที่ 2
สร้าง Policy ใน IAM ตามนี้ (เปลี่ยน ฺbucket-name เป็นชื่อ Bucket s3 ที่สร้างไว้ด้วยนะครับ)
จากนั้นใน Attach Policy ที่สร้างไว้เข้า Role ที่สร้างไว้ด้วย aws cli ในขั้นตอนที่ 2
Note. หาก User ไม่มี Permission S3 Full Access ให้ Add Permission ของ Policy นี้เข้า User ด้วย หาก User มี Permission S3 Full Access อยู่แล้วก็ทำขั้นตอนต่อไปได้เลยครับ
5. สร้าง Repository snapshot ของ Elastic search
ขั้นตอนนี้สามารถใช้ Postman หรือ Curl ก็ได้ครับตัวอย่างนี้จะแสดงวิธีด้วย curl นะครับ
5.1 สร้าง Repositry
curl -X PUT \
'http://localhost:9200/_snapshot/ชื่อrepository?master_timeout=10m&pretty=true' \
-d '{
"type": "s3",
"settings": {
"bucket": "ชื่อs3bucket",
"region": "ap-southeast-1",
"role_arn": "arn:aws:iam::xxxxxxx:role/es-s3-repository"
}
}'
- master_timeout มีไว้เผื่อ Elasticsearch ของเรา Set timeout ไว้น้อยเกินไป (Default 30 วินาที) เราสามารถเพิ่ม timeout ได้เผื่อข้อมูลเราเยอะอาจจะใช้เวลานาน
- pretty มีไว้เพื่อให้ response ที่กลับมี Pattern สวยงามดูง่าย
- bucket: ใส่ s3 bucket ที่สร้างไว้
- region: ใส่ region ของเรา
- role_arn: ใส่ชื่อ Role ARN ที่สร้างไว้ในขั้นตอนที่ 2
ลองยิง curl ดูจะได้ผลลัพธ์
5.2 ลอง Get repository ที่สร้างไว้มาดู
curl -X GET 'http://localhost:9200/_snapshot/_all?pretty'
จะได้ response ตามนี้
6. Backup ข้อมูลเข้า S3
สร้าง snapshot แล้วนำข้อมูลเข้า s3 bucket ตามที่เรา set ไว้ใน repository ด้วยคำสั่ง
curl -X PUT 'http://localhost:9200/_snapshot/my-repository/my-snapshot?master_timeout=10m&pretty'
ผลลัพธ์ที่ได้
ทีนี้ลองไปตรวจไฟล์ใน s3 ดูครับว่ามีข้อมูลเข้าหรือยัง
7. การ Restore ข้อมูลเข้า Elasticsearch
ก่อน Restore ให้เช็คว่า aws-es-proxy เรากำลัง run domain ที่เราต้องการ restore เข้าไปหรือไม่ หากถูกต้องแล้วให้ restore ด้วยคำสั่ง
curl -X POST http://localhost:9200/_snapshot/my-repository/my-snapshot/_restore
Note.
- หาก restore ไม่ได้ด้วย error ที่ว่า kibana กำลังเปิดอยู่ ให้ส่ง body เข้าไปดังนี้
curl -X POST \
http://localhost:9200/_snapshot/my-repository/my-snapshot/_restore \
-d '{
"indices": [
"index1",
"index2",
],
"ignore_unavailable": true,
"include_global_state": false
}'
โดยใน “indices” ให้ใส่ชื่อ index ของ Elasticsearch ของเราเข้าไปให้ครบครับ
แค่นี้เราก็สามารถ Backup และ Restore ข้อมูลใน Elasticsearch สำรองไว้ได้แล้วครับ
Ref.
- https://medium.com/@federicopanini/elasticsearch-backup-snapshot-and-restore-on-aws-s3-f1fc32fbca7f
- https://www.elastic.co/guide/en/elasticsearch/reference/6.2/modules-snapshots.html
- https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-managedomains-snapshots.html#es-managedomains-snapshot-restore
- https://aws.amazon.com/blogs/database/use-amazon-s3-to-store-a-single-amazon-elasticsearch-service-index/