Calm Hill My Random Thoughts

AWS EBS Snapshot

Blog လေးအရင်တစ်ပါတ်ထဲက နည်းနည်းပြဿနာတက်သွားတယ်။ တိုက်တိုက်ဆိုင်ဆိုင် အရင်တစ်ပါတ်ထဲက Server Upgrade လုပ်လိုက်မိပြီး Restart လုပ်ပြီးတဲ့နောက် Server ကပြန်မတက်လာတော့ဘူး။ Upgrade မှာတစ်ခုခုပြဿနာတက်တယ် ထင်လိုက်မိတယ် နောက်မှရှင်းမယ်ဆိုပြီး Server တစ်ခုထပ်ပြီးတော့လုပ် Database Backup ကို Restore လုပ်ပြီး IP ကိုပြောင်းထားလိုက်တော့ Blog ကတော့ ကြာကြာ Down မသွားလိုက်ဘူး။ Server အဟောင်းကို ပြန်စစ်မယ်ဆိုပြီး Stop လုပ်တဲ့အချိန်ကြမှ Server ရပ်လို့မရတော့ဘူး Force Stop လုပ်လည်းမရ အဲဒီတော့မှ တစ်ခုခုတော့မှားနေပြီဆိုတာ သိလိုက်တော့တယ်။ အဲဒါနဲ့ Amazon ကိုသွားပြော Amazon ကလူကလည်း Hardware တစ်ခုခုဖြစ်နေတယ် ကြည့်ပေးပါ့မယ်ဆိုပြီးပြောပြီး ခဏနေတော့ Server ပြန်ပြီးတော့အလုပ်လုပ်တယ်။

ခဏ Down သွားတဲ့အချိန်မှာ သတိထားလိုက်မိတာက Database Backup တစ်ခုပဲရှိရင် Server ကို Restore လုပ်ရတာ ထင်သလောက်တော့ မမြန်ပါဘူး Software Install ပြန်လုပ်ရတယ် Site ကိုပြန်တင်ရတယ် Theme တွေကလည်း Customize လုပ်ထားတော့ အဲဒါတွေလိုက်ပြင်ရတာလည်း အတော်လေးကြာပါတယ်။ အဲဒီတော့ Site တွေကိုပါ Backup လုပ်ထားမှပဲ အမြန်ဆုံးအနေနဲ့ Restore လုပ်လို့ရလိမ့်မယ် ဒါတောင်မှ Software Installation & Configuration တွေကအချိန်ပေးရဦးမှာပါ။ အလွယ်ဆုံးနည်းက EBS Volume ကို Snapshot လုပ်ထားတာရှိရင် Snapshot ကနေ Volume တစ်ခုအသစ်ပြန်လုပ်ပြီး Instance တစ်ခုပြန်လုပ်ပြီး Elastic IP ကိုပြောင်းလိုက်တာက အမြန်ဆုံးနည်းဖြစ်လိမ့်မယ် အချိန် ၁၀မိနစ် ၁၅မိနစ် အတွင်းမှာပြီးနိုင်သလို ဘာမှလည်းစဉ်းစားစရာမလိုဘူး။

ပြဿနာက AWS မှာ EBS Volume Snapshot က Automated လုပ်လို့မရသေးဘူး ကိုယ်ကလည်းအဲဒီအထဲက ဝင်ဖြစ်တာမဟုတ်တော့ စိ်တ်ကူးပေါက်တဲ့အချိန် ဝင်ဝင်ပြီတော့ Manual Snapshot လုပ်ဖို့ဆိုတာက တကယ်ကမလုပ်ဖြစ်သလောက်ပဲ အဲဒါနဲ့ Snapshot ကို Automated လုပ်ဖို့နည်းနည်းစဉ်းစားရတယ် တကယ်ကတော့ API တွေကရှိပြီးသားပါ ရေးမယ်ဆိုရင်တော့ ခက်ခက်ခဲခဲအလုပ်လည်းမဟုတ်ပါဘူး။ Server Down သွားပြီးနည်းနည်း အလုပ်ရှုပ်သွားတော့ ပျင်းနေလို့မဖြစ်ပါဘူးဆိုပြီး Python နဲ့ Boto ကိုသုံးပြီးတော့ Snapshot လုပ်ဖို့အတွက် Script တစ်ခုရေးပြီးတော့ Crontab နဲ့ တစ်ပါတ်တစ်ခါ Automate လုပ်ထားလိုက်တယ်။

Script

!/usr/bin/env python

import boto.ec2 import collections

Constants

aws_access_key = 'AWS Access Key' aws_secret_key = 'AWS Secret Key'

AWS Regions

us-east-1 (N. Virginai)

us-west-1 (Oregon)

us-west-2 (N. California)

eu-west-1 (Ireland)

ap-southeast-1 (Singapore)

ap-northeast-1 (Tokyo)

ap-southeast-2 (Sydney)

se-east-1 (Sao Paulo)

aws_region = 'ASW Region' aws_volume_id = 'vol-volumeid' max_snapshot = 5

Connect to AWS

con = boto.ec2.connect_to_region(aws_region, aws_access_key_id=aws_access_key, aws_secret_access_key=aws_secret_key)

Create Snapshot

print 'Creating snapshot of volume:', aws_volume_id new_snapshot = con.create_snapshot(aws_volume_id, 'Automated Snapshot') print 'Started creating snapshot:', new_snapshot.id

Get snapshot list

snapshot_raw = con.get_all_snapshots(filters={'volume-id': aws_volume_id})

Un-ordered List

snapshot_list = {} for snapshot in snapshot_raw: snapshot_list[snapshot.start_time]=snapshot.id

Sort by Date

snapshots = collections.OrderedDict(sorted(snapshot_list.items()))

Delete the oldest snapshot

if len(snapshots.keys())>max_snapshot: oldest_snapshot_id = snapshots[snapshots.keys()[0]] print 'Deleting snapshot:', oldest_snapshot_id con.delete_snapshot(oldest_snapshot_id) print 'Finish deleting snapshot'

Repository
https://github.com/yelinkyaw/aws-ebs-snapshot
EBS S3 Snapshot တွေက တကယ်တော့ Incremental ဆိုတော့ ပြန်ပြီးတော့ အဟောင်းတွေကို ဖျက်စရာမလိုပါဘူး ဒါပေမယ့် အများကြီးမထားချင်တော့ ၁ လစာလောက်တော့ ချန်ထားပြီးတော့ အရမ်းကြာသွားတာတွေကို ဖျက်လိုက်တယ်။ S3 Snapshot စျေးက 1GB ကို Singapore Region မှာဆိုရင် 0.095\( ဆိုတော့ အဲဒီလောက်ကပေးနိုင်ပါတယ် ကိုယ်သုံးနေတဲ့ Data Size ကအလွန်ဆုံး 2GB တောင်မပြည့်ဘူး Snapshot တစ်လစာချန်ထားလည်း တစ်လတစ်လလည်း Data Changes က ဘယ်လောက်ရှိနိုင်မလဲ အဲဒီတော့ Data Size ကသိပ်မကွာပါဘူး တစ်လကိုအလွန်ဆုံးပေးရ 0.5\) လောက်ပါပဲ။

တစ်စုံတစ်ရာ အမှားအယွင်းရှိခဲ့ရင် AWS Keys တွေဟာ အရေးကြီးပါတယ် ကိုယ်သုံးတဲ့ Amazon Account ရဲ့ Keys တွေဖြစ်နေရင် အကုန်လုပ်လို့ရသွားလိမ့်မယ် အဲဒီတော့ Amazon Account က Keys တွေကို မသုံးတာကောင်းတယ် အကောင်းဆုံးနည်းက AWS IAM ထဲကနေ Account တစ်ခု Create လုပ်ပြီး EBS Snapshot အတွက်ပဲ Permission ပဲပေးပြီးတော့ အဲဒီ Account ရဲ့ Keys တွေနဲ့လုပ်တာစိတ်ချရတယ်။ ဘလော့အတွက်ပဲ ရည်ရွယ်ပြီးရေးလိုက်တော့ Volume တစ်ခုအတွက်ပဲ Snapshot လုပ်လို့ရတယ် တစ်ခုထက်ပိုတဲ့ Volume တွေအတွက်ဆို နည်းနည်းပြင်ရေးရမယ် Script ထဲမှာပဲ Array နဲ့ပြင်ရေးလည်းရတယ် ဒါမှမဟုတ်အပြင်မှာ Config File တစ်ခုထားပြီးတော့ ဖတ်ရင်လည်းရတယ်။ နောက်တစ်ခုက Snapshot က Process လုပ်ချိန်ကြာပါတယ် ချက်ချင်းမပြီးတော့ ပြီးသွားတဲ့အချိန်မှာ SNS နဲ့ Notification တစ်ခုခုလုပ်ပေးနိင်ရင် အဆင်ပြေလိမ့်မယ် အားတဲ့အချိန်မှဖြည့်ရေးရမယ်။