เร็วๆนี้มีเรื่องฮือฮากัน ก็คือ AWS มี service ตัวใหม่ที่เค้าบอกว่า เกิดมาเพื่อฆ่า server เลย เพราะว่ามันทำงานอย่างที่เราต้องการได้ โดยที่เราไม่ต้องรัน server เองเลย แล้วการคิดเงิน ก็คิดตามปริมาณงานที่รันด้วย รันมากจ่ายมาก เลยจะเอามาอธิบายกันละเอียดหน่อย เพราะว่าผมเองก็ได้ใช้อยู่บ้างแล้วในตอนนี้
AWS Lambda เกิดมาฆ่า Server
ต้องบอกว่า AWS เค้ามีนโยบายที่แข็งแกร่งมานานแล้ว ว่าอยากให้คนที่ทำงาน infrastructure เลิกซื้อ server กันได้แล้ว โดยหลายครั้งเค้าจะออกสื่อสัมภาษณ์เสมอว่า สิ่งที่ AWS กังวลอย่างเดียว ก็คือคนยังซื้อ Server กันต่อไป แต่… เวลาเราใช้งาน AWS เราก็จะใช้งานเหมือนกับว่ามันเป็น server จำลอง แนว VMWare แต่อยู่บน internet อย่างนั้นแหล่ะ แต่ว่า Lambda เป็นสิ่งที่แตกต่างออกไป คือเราสามารถรันงานได้ โดยไม่ต้องสร้าง server จำลองขึ้นมาก่อนเลย แค่เราเขียนโค้ดให้มันตรงๆ แล้วเมื่อมี event ไปกระตุ้นมัน มันก็จะเริ่มทำงานตามโค้ดที่เราเขียนทันที เมื่อทำงานจบก็คือหยุดแค่นั้นเป็นอันจบการรัน 1 ครั้ง แค่นี้เองครับ ลืมเรื่อง shell , setup environment และอื่นๆไปได้เลย
Lambda สั่งงานด้วยภาษา Java, Node.js หรือ Python
ณ วันนี้ที่ผมเขียนบทความอยู่ เราสามารถเขียน Code ด้วยภาษาใดภาษาหนึ่ง จากสามภาษานี้คือ Java, Node.js หรือ Python เพื่อให้มันทำงานอย่างที่เราต้องการได้ โดยการทำงานที่ว่านี้ก็เป็นอะไรได้หลากหลายครับ ตัวอย่างเช่น ให้มันไปอ่านข้อมูลจาก database แล้วเอามาประมวลผล เพื่อหาคนที่ได้คะแนนสูงที่สุด แล้วตอบข้อมูลออกมาเป็น JSON ก็ได้
ตัวอย่างการใช้ AWS Lambda
ผมยกตัวอย่างจาก AWS เองแล้วกันนะครับ แบบเข้าใจไม่ยาก ตามรูปนี้
เป็นการใช้ AWS Lambda ทำงานร่วมกับ S3 (ปกติเอาไว้เก็บ object file) โดยตัวอย่างนี้ หากมีการเปลี่ยนแปลง object ใน S3 ก็ไปกระตุ้นการทำงานบางอย่างของ Lambda เช่น ผมกำหนดว่า ถ้ามีคนลบไฟล์ออกจาก Storage ให้ไปกระตุ้น Lambda ส่งอีเมลหาผม เพื่อแสดงรายละเอียดว่า คนที่ลบ ลบไฟล์อะไร ลบเมื่อไร ลบโดยใคร เป็นต้นครับ หรืออาจจะใช้ S3 เอาไว้เก็บ backup ไฟล์ เมื่อมีการ backup แล้วเอาไฟล์ขึ้นมาวางบน S3 สำเร็จ ก็ให้ Lambda ส่งอีเมลแจ้งว่า ไฟล์ backup ขึ้นมาบน S3 เรียบร้อยแล้ว เมื่อเวลาเท่าไร ขนาดไฟล์เท่าไร อะไรแบบนี้เป็นต้นครับ
AWS Lambda for server less
เราลองคิดต่อไปอีกขั้นว่า ถ้าเราจะทำหน้าเว็บ โดยที่ไม่ต้องมี server เลยล่ะ ทำได้มั้ย คำตอบคือ Lambda ทำให้ได้นะครับ โดยเราจะต้องแยกส่วน client ออกจาก server ก่อน คล้ายๆกับ mean stack อ่านต่อ mean stack คืออะไร เมื่อเราแยกส่วนแล้ว ให้เอาส่วนหน้าเว็บ (หากเป็น mean stack คือ AngularJS) ไปเก็บไว้ใน S3 ตั้งค่าให้เรียกได้จาก public แล้วเราก็จะได้ URL มา
เมื่อ client เปิดหน้าเว็บผ่านทาง URL S3 แล้ว ให้เราเขียนเพื่อไปเรียกการทำงาน Lambda โดยให้ Lambda อ่านข้อมูลจาก database เช่นจาก dynamoDB หรือว่าประมวลผลอะไรบางอย่างแล้วก็ตอบสนองกลับไปที่ client ได้เลย จะเห็นได้ว่าเราก็ไม่ต้องใช้ server อีกต่อไป (แต่ในชีวิตจริง ขั้นตอนมากกว่านี้นิดหน่อย เพราะต้องเรียกผ่าน AWS API Gateway ก่อนส่ง request ตรงไปที่ Lambda)
คิดเงิน ตามการใช้งานมากน้อย
มากน้อย ในที่นี้ไม่ได้แค่หมายถึงจำนวนครั้งที่รันอย่างเดียว แต่หมายถึง resource ที่ใช้ด้วย ซึ่ง resource ที่ใช้ จะมาจาก เวลาที่ใช้ในการประมวลผล กับ Memory ที่เรากำหนดให้ application ดูจะซับซ้อนนิดหน่อยแต่ว่ามีเหตุผลดีครับ กล่าวคือ ถ้างานที่เราทำ มันประมวลผลสั้นมากๆ เราอาจจะเรียกได้เป็น 10 ล้านครั้ง จ่าย x บาท แต่หากเราเขียน code ยาวมาก ประมวลผลเยอะ ต้องเอาข้อมูลจากหลายที ทำให้ใช้เวลานาน เราอาจจะรันได้แค่ 1 แสนครั้ง โดยยังจ่าย x บาทเท่ากัน
ใจดีจัดให้ ฟรี 1 ล้านครั้งแรกในแต่ละเดือน
ถ้าเรามีงานหน้าเว็บ ที่รันไม่บ่อย นานๆใช้ที รันอะไรสั้นๆ เราไม่ต้องเสียเวลาตั้ง server อีกต่อไป เอาขึ้นไปแปะใน AWS Lambda เลย หน้าเป็นงานหน้าเว็บก็จะต้องใช้งานคู่กับ API gateway ซึ่งก็ฟรี 1 ล้านครั้งเท่ากันด้วย ดังนั้นฟรีกันไปเลย ปีนึง (เพราะว่า AWS Free tier เค้าให้ใช้งานฟรี ปีนึง หลังจากนั้นเก็บเงินรัวๆ แม้ว่าไม่เกิน free tier ก็ตาม)
อย่าลืมค่าใช้จ่ายเรื่อง bandwidth ขาออกด้วย
โดยปกติแล้ว AWS เค้าจะคิดค่าใช้จ่าย data transfer out จาก AWS เป็นปกติอยู่แล้ว ก็ต้องระวังค่าใช้จ่ายแฝงจากจุดนี้ด้วย โดยส่วน Lambda เค้าจะคิดที่ rate เดียวกับ EC2 data trasfer out
เหมาะกับเอามาใช้งาน production มั้ย
ตอบยาก ขึ้นอยู่กับงานครับ ถ้าเป็นงานที่ทำไม่บ่อย แต่ทำเมื่อไรก็ต้องทำเหมือนเดิม แล้วการเปลี่ยนแปลงไม่เยอะมาก ก็บอกได้ว่าเหมาะครับ เช่น ถ้า API การคำนวนแปลงค่าเวลา time zone ต่างๆ ที่เราไม่ได้ใช้มันบ่อยหรอก แต่จะใช้เมื่อไรมันก็ทำงานเหมือนเดิมตลอดแบบนี้ ใช้เลย เหมาะมาก ฟรีแน่นอน
ถ้าเอามาทำงานกับ service ต่างๆของ AWS ล่ะก็ใช่เลย
เพราะว่ามันสามารถทำงานประสานกับ service ต่างๆของ AWS ได้ แม้ว่ายังไม่ทุกอย่าง แต่ก็เพิ่มขึ้นเรื่อยๆ ดังนั้น หากจะเขียนเพื่อให้มันควบคุมอะไรสักอย่างล่ะก็เหมาะเลย โดยที่เราไม่ต้องตั้ง server เพื่อไปสั่งมันเลย ก็เอามาสั่งรันผ่าน lambda ด้วยโค้ดที่เราเขียนได้เลย
I am sure this article has touched all the internet
users, its really really fastidious article on building up new website.