ข้อควรทราบของ Virtual Public IP (VIP) บน Windows Azure Virtual Machines กับ DNS

บน Windows Azure ยังไม่มีบริการแบบเดียวกับ Amazon EC2 Elastic IP Addresses ซึ่งเป็นการเช่าชุดหรือเลข IP สำหรับใช้งานกับบริการประมวลผลต่างๆ โดยไม่มีการเปลี่ยนแปลงใดๆ หรือพูดง่ายๆ คือเป็นเจ้าของเพียงผู้เดียว และควบคุมการใช้งานได้ (ถ้าจ่ายเงินไปตลอด)

ซึ่งบน Windows Azure นั้น ตัว Virtual Machines จะใช้ได้แต่ Virtual Public IP (VIP) ซึ่งมีข้อควรจำ (หรือบางคนเรียกว่าข้อเสียก็ได้) ตรงที่จะเปลี่ยนแปลงทุกครั้งที่ Shutdown หรือลบ Virtual Machines แล้วสร้าง Virtual Machines จาก Image Data ชุดเดิม และเราควบคุม VIP ไม่ได้ เพราะฉะนั้น ใช้ A (address record) Type Record บน Zone file ใน DNS ไม่ได้เลย เพราะต้องกลับมาเปลี่ยนตลอดถ้า Virtual Machines ตัวนั้นพังและต้องสร้างใหม่ ทำให้กำหนดการใช้งานผ่าน VIP จะมีปัญหาตอนโยก development/staging machines ด้วย เพราะมันดิ้นไป-มา

แต่แน่นอนว่าคำแนะนำคือให้ใช้ CNAME (alias record) Type Record แทน เพื่อให้ CNAME จับคู่กับ DNS แทนจะทำงานได้ดีก็ตาม (ลบจุดด้อยได้) แต่ก็มีปัญหาต่อมาคือ CNAME มันกำหนด root domain name ไม่ได้ ต้องใช้ A Type Record แล้วกำหนด IP เท่านั้น ซึ่งต้องหาบริการหรือทำ domain forwarding กับตัว root domain name ร่วมด้วย ไม่งั้นทำงานจะมีปัญหาเวลาคนพิมพ์ domain name จาก root เข้าระบบเว็บที่ทำงานบน Windows Azure Virtual Machines ล้วนๆ ไม่ได้

ถ้าอยากใช้ Windows Azure Virtual Machines เค้าคิดราคากันยังไง…

จาก จ่ายเท่าที่ใช้งานกับ Cloud Virtual Machines ซึ่งเป็นแนวคิดเรื่อง deploy ตัวงานขึ้น Windows Azure Virtual Machines นั้น มีหลายคนอยากรู้ว่าราคามันเท่าไหร่เมื่อคิดราคาต่อเดือน ดูตามด้านล่างได้เลยครับ

ผมเสนอแผนและราคาไปคือ Windows Azure Virtual Machines (WAVM) และ GoDaddy.com Secure Sockets Layer (SSL) เพราะเป็นงานด้านเว็บธุรกิจ มีการสื่อสารข้อมูลสำคัญเยอะ เลยมี SSL ด้วย

Windows Azure Virtual Machines (WAVM)

  • Operating System: Linux Virtual Machines (Ubuntu Server 12.04 LTS)
  • Compute: 1 x Extra small VM (Shared 1GHz CPU x 1 core, 768MB RAM)
  • Storage (Geo Redundant): 100GB (IDC Southeast Asia in Singapore and IDC East Asia in Hong Kong/China)
  • Bandwidth: 45GB/mo

GoDaddy.com Secure Sockets Layer (SSL)

  • Standard SSL
  • 1 certificate protects www.domain.com AND domain.com
  • 24/7 live support
  • SSL Installation Tool
  • Site seal options

ราคาที่คิดไว้คือ (Pricing)

  • Compute: $9.36/mo ($0.013/hr)
  • Storage: $9.50/mo
  • Bandwidth: $4.80/mo
  • Standard SSL: $69.99/yr (ถ้ามีคูปองราคาก็ถูกลงไปอีก)

รวมทั้งหมด (Total)

  • WAVM: $23.66/mo (~750Baht/mo)
  • Standard SSL: $69.99/yr (~2,100Baht/yr)

หรือตกปีละประมาณ 11,100 บาท โดยประมาณ (แต่ถ้าเพิ่ม Compute ในบางช่วง หรือัตราแลกเปลี่ยนสูงขึ้น ราคาก็แตกต่างกันไปอีก)

อ้างอิงราคาจาก (Pricing Ref.)

จะเห็นว่าราคาอาจดูสูง แต่ดู Storage (Geo Redundant) ขนาด 100GB และ Bandwidth ขนาด 45GB ต่อเดือน ก็ถือว่าเยอะเมื่อเทียบกับ Hosting โดยทั่วไป ซึ่งถ้าใช้ Storage และ Bandwidth น้อยกว่านี้ราคาก็ถูกลงไปอีก ไม่ได้จ่ายเผื่อแบบจองไว้แบบ Hosting ที่เราๆ ใช้ๆ กันแต่อย่างใด (อย่างที่บอก ใช้เท่าไหร่ จ่ายเท่านั้น) แถมถ้าเป็นช่วงแรกๆ ทดสอบระบบ Bandwidth ใช้ไม่ถึง 5GB ก็ฟรีอีก ไม่ต้องจ่ายเงินแต่อย่างใด ก็ประหยัดไปอีกครับ ลองเอาไปคำนวณเล่นๆ กันดู เผื่อคันไม้คันมืออยากลอง ตอนนี้ Azure มี Trial Account ด้วยนะ ใช้ฟรี 3 เดือน (อยู่ในข้อกำหนดที่พอเอาไปทดลองใช้งานได้สบายๆ เลย)

เมื่อ Windows Azure ไม่ให้ ping ก็ใช้ tcping แทนซิ

การ ping เป็นการใช้ ICMP ในการเรียกเข้าไปยัง Server ปลายทาง ปรกติเอาไว้ทดสอบเรื่องการตอบสนองของ Server ปลายทางว่ายังมีการตอบสนองอยู่หรือไม่ และมีความเร็วในการตอบสนองดีอยู่หรือเปล่า (พื้นฐานทั่วไปใช้ประมาณนี้)

แต่ทีนี้ Windows Azure ดันไม่ยอมให้ ICMP เข้าไปที่ Virtual Machines ด้านหลัง Firewall วิธีที่น่าจะโอเคที่สุดคือตรวจสอบด้วยการ GET ข้อมูลผ่าน TCP แทนว่า service ตัวนั้นยังเปิดใช้งานอยู่หรือไม่ ซึ่งแน่นอนว่าต้องมี service บน port ตรงนั้นก่อน แล้วเปิด Endpoint ที่ port นั้นด้วย

โดยแน่นอนว่าเครื่องมือที่ใช้ในการตรวจสอบว่า port นั้นเปิดอยู่หรือไม่นั้นก็มีเยอะนะ แต่ว่าไม่มีตัวไหนเล็กเท่ากับเจ้า tcping.exe – ping over a tcp connection (http://www.elifulkerson.com/projects/tcping.php) โดยเป็น console application ขนาดเล็ก ที่ทำงานบน Win32 Console ซึ่งทำงานได้บน Windows XP, Vista, 7 และที่ผมใช้อยู่อย่าง Windows 8 ซึ่งเจ้าตัวนี้เป็น license แบบ GPL ที่ตัวหน้าเว็บหลักมี source code ให้สำหรับเผื่อเอาไปพัฒนาต่อได้เองด้วย

ตัว tcping.exe เป็น console application เล็กๆ ที่ทำงานคล้ายๆ กับ ping แต่ทำงานบน tcp protocal ทำให้มันมีความสามารถที่มากกว่า ping ที่ใช้ๆ กันเพียงแค่ request/response ตามปรกติ

ตัว tcping.exe เองนั้น default port ที่ใช้คือ port 80 (http service)

  1. C:\Users\Annop>tcping thaicyberpoint.com
  2.  
  3. Probing 168.63.238.30:80/tcp - Port is open - time=56.492ms
  4. Probing 168.63.238.30:80/tcp - Port is open - time=55.441ms
  5. Probing 168.63.238.30:80/tcp - Port is open - time=44.554ms
  6. Probing 168.63.238.30:80/tcp - Port is open - time=62.413ms
  7.  
  8. Ping statistics for 168.63.238.30:80
  9. 4 probes sent.
  10. 4 successful, 0 failed.
  11. Approximate trip times in milli-seconds:
  12. Minimum = 44.554ms, Maximum = 62.413ms, Average = 54.725ms

แต่ถ้าต้องการที่จะตรวจสอบ port อื่นๆ ก็สามารถกำหนดได้ด้วยการใส่หมายเลข port อื่นๆ ต่อท้ายเอา

  1. C:\Users\Annop>tcping thaicyberpoint.com 22
  2.  
  3. Probing 168.63.238.30:22/tcp - Port is open - time=79.934ms
  4. Probing 168.63.238.30:22/tcp - Port is open - time=60.144ms
  5. Probing 168.63.238.30:22/tcp - Port is open - time=67.704ms
  6. Probing 168.63.238.30:22/tcp - Port is open - time=61.353ms
  7.  
  8. Ping statistics for 168.63.238.30:22
  9. 4 probes sent.
  10. 4 successful, 0 failed.
  11. Approximate trip times in milli-seconds:
  12. Minimum = 60.144ms, Maximum = 79.934ms, Average = 67.284ms

และถ้าต้องการทดสอบความเร็วอื่นๆ นอกจาก response time ปรกติ ก็ใส่ -h เข้าไป ก็ได้ข้อมูลเพิ่มเติมมาอีกพอสมควร

  1. C:\Users\Annop>tcping -h thaicyberpoint.com
  2. ** Requesting "" from thaicyberpoint.com:
  3. (for various reasons, kbit/s is an approximation)
  4.  
  5. Probing 168.63.238.30:80/tcp - HTTP is open - time=39.916ms rcv_time=98.247 status=302 bytes=363 kbit/s=~29.558
  6. Probing 168.63.238.30:80/tcp - HTTP is open - time=34.371ms rcv_time=60.109 status=302 bytes=363 kbit/s=~48.312
  7. Probing 168.63.238.30:80/tcp - HTTP is open - time=35.718ms rcv_time=100.248 status=302 bytes=363 kbit/s=~28.968
  8. Probing 168.63.238.30:80/tcp - HTTP is open - time=36.757ms rcv_time=77.558 status=302 bytes=363 kbit/s=~37.443
  9.  
  10. Ping statistics for 168.63.238.30:80
  11. 4 probes sent.
  12. 4 successful, 0 failed.
  13. Approximate trip times in milli-seconds:
  14. Minimum = 34.371ms, Maximum = 39.916ms, Average = 36.691ms
  15. Approximate download times in milli-seconds:
  16. Minimum = 60.109ms, Maximum = 100.248ms, Average = 84.041ms

สุดท้ายก็หวังว่าหลายๆ คนที่ใช้พวก cloud service จะได้ทำความเข้าใจข้อจำกัดบางอย่างและหาวิธีแก้ไขกันเพื่อให้เราสามารถทำงานได้ต่อไปครับ

การใช้งาน (นำมาจากเว็บ project)

  1. Usage: tcping [-t] [-d] [-i interval] [-n times] server-address [server-port]
  2.  
  3.          -t   : ping continuously until stopped via control-c
  4.          -n 5 : for instance, send 5 pings
  5.          -i 5 : for instance, ping every 5 seconds
  6.          -w 100 : for instance, wait 100 milliseconds for a response
  7.          -d   : include date and time on each line
  8.          -b 1 : enable beeps (1 for on-down, 2 for on-up,
  9.                               3 for on-change, 4 for always)
  10.          -r 5 : for instance, relookup the hostname every 5 pings
  11.          -s   : automatically exit on a successful ping
  12.          -v   : print version and exit
  13.          -d   : include date and time on each line
  14.  
  15. HTTP Options:
  16.          -h   : HTTP mode (use url without http:// for server-address)
  17.          -u   : include target URL on each line
  18.          -p   : use POST rather than GET (to avoid caching)
  19.  
  20. Debug Options:
  21.          -o   : use alternate timing function (less precise)
  22.          -f   : force tcping to send at least one byte
  23.  
  24.         If you don't pass server-port, it defaults to 80.

จ่ายเท่าที่ใช้งานกับ Cloud Virtual Machines

ช่วงนี้ผม deploy ตัวงานขึ้น Windows Azure Virtual Machines ไป 1 ระบบแล้ว และในช่วงวันหยุดนี้กำลังจะมีอีก 1 ระบบ และในอนาคตอีกหลายตัว

เหตุผลที่ตอนนี้ผมแนะนำ Cloud Virtual Machines เยอะขึ้นเรื่อยๆ เพราะค่าใช้จ่ายเริ่มต้นของระบบที่ไม่แพงมาก เมื่อเทียบกับหลายๆ อย่างที่ได้รับมา (ไม่ได้หมายความว่าจะใช้แต่ของ Windows Azure นะ Amazon EC2 ก็ใช้ได้ แล้วแต่ถนัดแล้วกัน)

คือการลงทุนตัว H/W อย่าง Server นั้นมีค่าใช้จ่ายเริ่มต้นที่แพง และสินค้าเทคโนโลยีมีแต่ราคาค่าเสื่อมที่ลดลง เพราะฉะนั้น เราซื้อ H/W ราคาหนึ่งในวันนี้ ใน 18 เดือนต่อมาอาจมีราคาของระบบเพียง 20-60% ของราคาที่ซื้อมาเท่านั้น (แล้วแต่ H/W แต่ละประเภทด้วย) การตั้งต้นระบบที่ไม่แน่ว่าจะทำตลาดได้ดีหรือไม่ หรือมีภาระระบบที่โหลดหนักๆ เพียงไม่กี่ครั้งต่อปีนั้น ดูจะเป็นการลงทุนเผื่ออนาคตที่สูงมากเกินไป

ส่วนตัวแล้วนั้นตอนนี้ผมจึงย้ายระบบที่ Consult หลายๆ ตัวมาไว้บน Cloud เยอะขึ้น เพราะดูที่ค่าใช้จ่ายของลูกค้าที่ต้องจ่ายลงไปแล้วนั้นจะมีค่าใช้จ่ายเริ่มต้นที่ไม่สูงมากนัก

โดยตัวระบบที่ใช้นั้นคือตัว Windows Azure Virtual Machines ซึ่งรองรับ OS หลายตัว ซึ่งมีทั้ง Windows Server 2008 R2, Windows Server 2012, Suse, Ubuntu และ CentOS เป็นต้น โดย Windows Server เราไม่ต้องมาจ่ายเงินค่า Licensing เพิ่มเติม (เหมือนเราจ่ายลงไปเมื่อใช้งานอยู่แล้ว แต่ในจำนวนที่น้อยมากๆ คือจ่ายเฉพาะตอนที่ใช้งาน)

ตัว Windows Azure Virtual Machines เป็น Infrastructure as a Service (IaaS) ที่การคิดเงินของตัว VM นั้น 3 ส่วนหลักๆ คือ
– Compute Time คือจ่ายเฉพาะตอนนี้ VM มันทำงานอยู่เท่านั้น
– Storage Space คือจ่ายเฉพาะพื้นที่ที่ใช้งานจริง
– Data Transfer คือจ่ายเฉพาะที่ใช้ Data ออกจากระบบเท่านั้น

มาดูที่ราคา Compute Time ก่อน จากด้านล่าง

$0.013/hr – Extra small VM (1GHz CPU, 768MB RAM)
$0.08/hr – Small VM (1.6GHz CPU, 1.75GB RAM)
$0.16/hr – Medium VM (2 x 1.6GHz CPU, 3.5GB RAM)
$0.32/hr – Large VM (4 x 1.6GHz CPU, 7GB RAM)
$0.64/hr – Extra large VM (8 x 1.6GHz CPU, 14GB RAM)

ถ้าระบบเราเพิ่งเริ่มต้นก็ใช้ Extra small VM ไปก่อนในการทดสอบระบบ เมื่อ production ไปสักพัก และระบบเริ่มโหลดเยอะจนเริ่มช้า ก็ปรับไปใช้ Small VM และตัวสูงๆ กว่าได้ และเมื่อระบบไม่โหลดก็กลับมาอยู่ที่ Extra small VM ได้ โดยไม่ไม่จำเป็นต้องย้าย Storage ไปมาแต่อย่างใด แค่ restart VM เท่านั้น (ใช้เวลา 5-10 นาที) ก็สามารถย้ายระบบไปใช้ Compute ที่ต่ำหรือสูงกว่าได้ทันที โดยจ่ายเงินเป็นรายชั่วโมงที่ใช้

ในส่วนต่อมาคือ Storage Space ที่เป็น Geo Redundant Storage คือตัว Storage ไม่ได้อยู่ที่เดียว แต่อยู่หลายๆ ที่ โดยวิธีแบ่งไว้ตาม Region โดยมี Primary Region และ Secondary Region ที่ตั้งเป็นค่าเริ่มต้น อย่างที่ผมใช้ก็คือใช้ Primary Region ไว้ที่ Southeast Asia ที่ IDC อยู่ Singapore และระบบมีค่ามาตรฐานที่ทำการตั้งให้ Secondary Region เป็น East Asia ที่มี IDC อยู่ที่ Hong Kong (China) อีกที่ ช่วยป้องกัน link ของ IDC นั้นมีปัญหาจาก Primary Region ซึ่งตัวระบบจะสลับไปอีก IDC ได้ทันที พูดง่ายๆ เหมือนได้ใช้ Server ที่ใส่เว็บไว้สอง IDC โดยจ่ายเงินเท่ากับ IDC เดียว สำหรับราคา Storage Space คิดราคาไว้ 2 แบบคือ Locally Redundant Storage และ Geo Redundant Storage (แบบแรกคือไว้ที่ Region เดียว) โดยราคาเริ่มเต้นที่ 1TB แรกต่อเดือน อยู่ที่ $0.095/GB สำหรับ Geo Redundant และ $0.070/GB สำหรับ Locally Redundant

ต่อมาคือราคา Data Transfer โดย 5GB แรกฟรี ไม่คิดเงิน และราคา GB ต่อไป GB ละ $0.12 แต่ราคา Data Transfer ก็แบ่งตาม Zone ด้วย ตัวอย่างเช่น 10 TB แรก คิดต่อเดือน ที่ $0.12/GB ถ้าใช้ Data Transfer ส่งไปที่ North America และ Europe ส่วนราคา $0.19/GB จะเป็นที่ Zone ของ Asia Pacific, Latin America, Middle East / Africa ถ้าเราทำระบบที่รองรับหลายๆ Zone ก็มีราคาค่าใช้จ่ายที่แตกต่างกันไป

จากที่อธิบายคราวๆ จะเห็นว่าราคานั้นอยู่ที่เราใช้งานเยอะแค่ไหน และจ่ายเท่าที่ใช้งานเท่านั้น ซึ่งจากตัวอย่างที่บอกมานั้น เป็นแค่ Basic เริ่มต้นเท่านั้น ถ้าระบบที่อยาก Scale ออกไปแบบไม่ต้อง downtime ตอน scale up/down ก็จะมีการปรับส่วนของ Load Balancing และเพิ่ม VM เป็น 2-3 ตัวให้ตัวที่กำลัง scale up/down นั้นได้ scale up/down ระบบ และให้ตัว VM ที่ยังไม่ scale up/down นั้นรองรับงานต่อไปก่อนได้ ต้องมีการออกแบบระบบเพิ่มเติมหลายส่วนบน Cloud ซึ่งสามารถทำได้ โดยเราไม่ต้องลงทุนเรื่อง H/W ราคาแพงพวกนี้