"ท้อมีไว้ให้ลิงถือ"
[AWS] ย้าย EC2 ข้าม Region
26 Nov 2011 18:36   [8564 views]

Blog นี้ Technical ล้วนๆ หากท่านไม่เข้าใจคำว่า AWS และ EC2 แนะนำให้ข้าม Blog นี้ไป -0-

เรื่องของเรื่องคือช่วงนี้มุ่งมั่นกับการลด Cost ค่า Server มาก สิ่งหนึ่งที่ลด Cost ได้อย่างยั่งยืนคือการย้าย EC2 Instance ที่รันอยู่ไปที่ Region Oregon ซึ่งค่าใช้จ่ายโดยรวมลดลงถึง 10-15% เลยทีเดียว ทั้งนี้เพราะ Oregon เป็นรัฐที่ Tax-Free และ Amazon ยังตั้งศูนย์ไว้ใกล้น้ำตกด้วย ทำให้ค่าไฟถูกกว่าปกติ ค่าใช้จ่ายก็เลยถูกเลยด้วยประการฉะนี้


แต่การย้าย Region มันไม่ง่ายเพราะ Amazon เหมือนจะตั้งใจไม่ให้ลูกค้าย้าย Region (ด้วยเหตุผลใดไม่ทราบได้) ทำให้ไม่มีเครื่องมือสำหรับการย้าย Region แบบง่ายๆเลย จึงเป็นเหตุให้ต้องไปค้นหาวิธีย้าย AMI ที่เป็น EBS ข้าม Region จึงค้นพบว่ามีวิธีอยู่ราวๆ 3 หนทาง

1) CloudyScripts - เป็นเครื่องมือฟรีที่เขียนด้วย Ruby Gem แค่ใส่ Key และข้อมูลที่จำเป็นประมาณ 8 ช่องแล้วกดคลิกก็เสร็จแล้ว แต่ครั้นจะใส่ Key อันมีค่าเข้าไปในเว็บใครก็ไม่รู้นี่มันก็ไม่งามเนอะ

2) Ylastic - ต้องจ่ายเงิน $25 ต่อเดือน หรือจะย้ายเสร็จแล้วยกเลิกเลยก็ได้ แต่แม่มไม่เท่ ... (จริงๆคืออยากมีความรู้เชิงลึกหนะ)

3) ทำเองล้วนผ่าน Command Line และ AWS Console !!


ซึ่งแน่นอนว่าเราเลือกข้อ 3 เพราะอยากเข้าใจ EC2 มากขึ้น .... หลังจากงมมาราว 2 วัน ก็พบว่ามันไม่มีวิธีโยก EBS AMI ไปแบบตรงๆ ต้องทำ S3 AMI ขึ้นมาแล้วค่อยไปสร้าง EBS AMI ตอนถึง Region ปลายทางเองอีกที สรุปวิธีได้ดังนี้จ๊ะ


เตรียมข้าวเตรียมของ

- ดาวน์โหลด Amazon API Tools แล้วติดตั้งไว้ใน Instance ที่รันอยู่และต้องการย้าย ด้วยคำสั่ง tar หรือ unzip มาตรฐาน จากนั้นก็ export PATH ด้วย เพื่อให้สามารถสั่งงานผ่าน Command Line จากโฟลเดอร์ไหนก็ได้

- ยัด Private Key และ Public Key ของ EC2 (มันคือ X.509 Certificates ของ Account AWS) ไว้ใน Server แนะนำให้ใส่ไว้ในโฟลเดอร์ /mnt เพราะมันจะไม่ถูกก็อปไปด้วยใน Server ที่ถูกย้ายไป สมมติว่าเซฟเป็นไฟล์ชื่อว่า pk.pem (Private Key) และ cert.pem (Public Key) ละกันนะครับ

- เปิด AWS Access Key และ Secret Key ดูจากหน้า Security Credentials ของ AWS Account แล้วจดไว้

- จด User ID ซึ่งเป็นตัวเลข 12 หลักจากหน้า Security Credentials ไว้เช่นกัน


สร้าง AMI ของ Instance หรือที่เรียกว่า Bundle


1) ssh เข้าไปใน Instance แล้วสั่ง sudo su เพื่อเข้าถึง Root


2) Stop Service ทุกตัวที่อาจทำให้มีการเปลี่ยนแปลงของไฟล์ขึ้นเช่น /etc/init.d/httpd stop (หากไม่อยากให้เว็บล่มก็ Duplicate Instance ขึ้นมาอีกตัวแล้วทำจากตัวใหม่ก็ได้ นี่มัน Cloud นะเฟร้ย!! ใช้เวลาไม่นาน จ่ายแค่ 1-2 ชั่วโมงเท่านั้น)


3) ทำการสร้าง Bundle ด้วยคำสั่ง

ec2-bundle-vol -d /mnt -k /mnt/pk.pem -c /mnt/cert.pem -u xxxx-xxxx-xxxx -p ami-migrate

โดย /mnt/pk.pem คือ Path ของ Private Key ส่วน /mnt/cert.pem คือ Path ของ Public Key ส่วน xxxx-xxxx-xxxx คือ User ID ส่วน ami-migrate คือชื่อ AMI ที่ต้องการสร้าง (ตั้งชื่อเป็นอะไรก็ได้) ซึ่งพอ Enter แล้วมันอาจจะขึ้นมาถาม Architecture ว่าเป็น i386 หรือ x86_64 ก็แค่กด Enter ไปง่ายๆ


จากนั้นรอเวลาไปอีกสักพัก น่าจะไม่เกิน 10 นาที มันจะทำเสร็จ แต่ถ้าไม่สำเร็จเช่นขึ้นว่า Execution Failed ตรง rsync (เจอกันบ่อยมาก) อันนี้อาจจะเกิดมาจากมีพื้นที่ไม่พอที่จะสร้าง Image ให้จัดการขยายเนื้อที่ให้พอด้วยการยิง Instance ตัวใหม่ให้ขนาดใหญ่ขึ้น เดี๋ยวจะหาว่าหล่อไม่เตือน


4) เมื่อสำเร็จก็จะได้ไฟล์จำนวนมากไว้ใน /mnt ก็จะมีชื่อประมาณว่า ami-migrate.manifest.xml และ ami-migrate.part.000, ami-migrate.part.001, ami-migrate.part.002 .... จนถึง ami-migrate.part.xxx


จัดการแก้ไข Manifest ของ Bundle ให้ใช้ใน Region ใหม่ได้และอัพขึ้น S3


1) การย้าย Region มันไม่ได้ง่ายเหมือนแค่ก็อปไฟล์ไปบู้ทอีก Region เพราะ Kernel ID ของแต่ละ Region ไม่เหมือนกัน ย้ายไปตรงๆมันจะบู้ทไม่ขึ้นเอา เราต้องใช้คำสั่ง ec2-migrate-manifest ในการแก้ไข Manifest เพื่อแก้ไขข้อมูลต่างๆให้ใช้บน Region ใหม่ได้ (แล้วก็อย่าไปแก้ manifest.xml เองนะ เพราะไฟล์ part ต่างๆมันต้องถูก Sign ด้วย จะสร้างเป็น AMI ปลายทางไม่ได้อีกเช่นกัน) วิธีเรียกคำสั่งมีดังนี้

ec2-migrate-manifest -k /mnt/pk.pem -c /mnt/cert.pem -m /mnt/ami-migrate.manifest.xml --region us-west-2 --access-key ACCESS_KEY --secret-key SECRET_KEY

โดย us-west-2 คือรหัส Region ปลายทาง อย่างในกรณีนี้ us-west-2 คือ Oregon ส่วน ACCESS_KEY และ SECRET_KEY คือรหัส Access Key ที่ให้เตรียมไว้ข้างต้น


2) หลังจากรันเสร็จแล้วเราก็จะได้ AMI ที่พร้อมจะโยกไปอยู่บน S3 เพื่อส่งต่อไปยังอีก Region แล้ว ก่อนอื่นเราต้องสร้าง S3 Bucket ขึ้นมาตัวนึงไว้ใน Region ใหม่ที่ต้องการจะย้ายไปก่อน สมมติว่าใช้ชื่อว่า ami-migration-bucket ละกันนะ แล้วก็ตั้ง Permission ให้ Everyone สามารถ Read หรือ List ได้ จากนั้นก็อัพ Bundle ขึ้น S3 ด้วยคำสั่ง

ec2-upload-bundle -b ami-migration-bucket -m /mnt/ami-migrate.manifest.xml -a ACCESS_KEY -s SECRET_KEY --acl aws-exec-read

โดย ACCESS_KEY และ SECRET_KEY คือรหัส Access Key ที่ให้เตรียมไว้ข้างต้น


3) รอมันอัพจนเสร็จ ใช้เวลาไม่เกิน 5 นาที แล้วก็ทำการ Register AMI ไว้กับ Region ปลายทางได้เลยด้วยคำสั่ง

ec2-register -K /mnt/pk.pem -C /mnt/cert.pem ami-migration-bucket/ami-migrate.manifest.xml --region us-west-2


4) คราวนี้พอไปเช็คใน AWS Console ก็จะพบ AMI โผล่ที่ปลายทางเรียบร้อยแล้ว ให้ทดสอบด้วยการยิง Instance ขึ้นมาดูว่าใช้งานได้มั้ย เป็นอันเสร็จพิธี


สร้าง EBS AMI


แต่ AMI ที่ถูกสร้างขึ้นยังเป็น S3 AMI ทำให้บู้ทเป็น Instance Store ได้เท่านั้น หากต้องการจะทำเป็น EBS AMI ก็ทำได้ด้วยการ


1) สร้าง Instance ขึ้นมาแล้วสั่งรันได้เลย


2) ใน AWS Console สร้าง EBS Volume ขึ้นมาตัวนึงให้ได้ขนาดที่ต้องการ (มาตรฐานคือ 10GB แต่ถ้าใครต้องการใหญ่ๆไปเลยก็ 32GB โลด เสียเงินเพิ่มอีกนิดเดียวเท่านั้น กิ๊กละ 5 บาทต่อเดือน)


3) Attach Volume ดังกล่าวไว้กับ Instance ที่ถูกสร้างมา เลือก Device ตามใจชอบ ส่วนตัวชอบ /dev/sdf


4) ssh เข้าไปใน Instance แล้วสั่ง sudo su เพื่อเข้าถึง Root


5) Stop ทุก Service เช่นเคย


6) สั่งคำสั่ง dd เพื่อก็อปปี้ Instance เข้าไปใน Volume

dd bs=65536 if=/dev/sda1 of=/dev/sdf

* ทั้งนี้ /dev/sda1 อาจเปลี่ยนแปลงไปตาม Root Device ของ Instance นั้นๆ ใช้คำสั่ง df เพื่อเช็คได้


7) สั่งเช็ค EBS Volume ด้วยคำสั่ง

fsck /dev/sdf


8) สร้างโฟลเดอร์ ebs-vol และ Mount EBS Volume เข้าไป

mkdir /root/ebs-vol

mount /dev/sdf /root/ebs-vol


9) vi ไฟล์ /root/ebs-vol/etc/fstab แล้วลบบรรทัดที่ Mount /mnt ทิ้ง (ถ้าไม่มีก็ดีไปไม่ต้องลบ)


10) เสร็จภารกิจ Unmount ได้

umount /dev/sdf


11) สร้าง Snapshot จาก Volume ผ่านทาง AWS Console แล้วจด Snapshot ID ไว้ (อาจจะใช้เวลาสร้าง Snapshot เล็กน้อย อดทนรอ อดทน อดทน) ... ระหว่างรอมันสร้าง Snapshot ให้แอบไปจด Kernel ID ของ Instance ที่ถูกใช้งานอยู่นี้ไว้ด้วย ต้องใช้ในขั้นตอนถัดไป รหัสมันจะเป็นประมาณว่า aki-12345678


12) เมื่อสร้าง Snapshot เสร็จก็ถึงเวลาสร้าง EBS AMI ขึ้นมาแล้ว ด้วยคำสั่ง

ec2-register -K /mnt/pk.pem -C /mnt/cert.pem -s snap-xxxxxxxx -d "Description of AMI" -n "name-of-image" -a x86_64 --kernel aki-yyyyyyyy --region us-west-2


ถ้าไม่มีอะไรผิดพลาดมันก็จะขึ้นรหัส AMI ID ตัวใหม่ ... เรียบร้อย !! คุณได้ EBS AMI แล้ว ! ขอเชิญ Boot ผ่าน EBS กันได้อย่างสบายใจก๊ะ


ก็เป็นอันเสร็จพิธี ไปไล่ลบสิ่งที่ไม่จำเป็นทิ้งได้เลยได้แก่

- S3 Bucket

- Instance ที่ถูกยิงขึ้นมาเพื่อการย้าย Server

- Volume (เพราะ EBS AMI ใช้อ้างอิงจาก Snapshot ไม่ได้ใช้ Volume)


ก็เป็นข้อมูล Technical ที่จดไว้เพื่อตัวเองแหละ เผื่อจะต้องย้ายโน่นย้ายนี่อีก จะได้ไม่เสียเวลาไปค้น เหนื่อยๆ


Reference

- Create and Move an Amazon EC2 AMI from us to eu region

- Amazon EC2 - Swap root instance store device with EBS device - Stack Overflow

บทความที่เกี่ยวข้อง

Aug 27, 2010, 23:30
5513 views
ประสบการณ์ส่งแอพขึ้น Ovi Store
Dec 6, 2012, 16:06
15741 views
ความท้าทายของ Windows Phone
0 Comment(s)
Loading