มาทำ golang ให้เป็น microservices บน aws กัน
วันนี้จะมาทำ microservicesบน aws โดยจะทำการใช้ docker image ขึ้น ECR(Elastic Container Registry) คือคลังเก็บ docker image จากภาพข้างต้นผมวางโครงสร้างประมาณว่าจะใช้ AWS Lambda มาดึง ECR ที่เรา build แล้วเอาขึ้นไป แล้วใช้ API Gateway ทำ microservices เพื่อดึง api ที่เราจัดเตรียมไว้บน lambda หรือนอกเหนือจาก lambda ไม่ว่าจะเป็น api ที่เอาตั้งเองบน server แล้วเอา url endpoint มาใส่ ข้อดีของการทำแบบนี้จะมีกี่ภาษาก็ได้จัดเรียงอยู่ในเส้นเดียวกัน มาดูความเดิมตอนที่แล้ว การสร้าง golang โดยใช้ gin framework มาทำ httprouter
มาเกริ่นความเดิมจากตอนที่แล้วกันก่อนจะเป็นการทำ api สำหรับ booking แต่เป็นการ fix ค่าโดยขั้นตอนนี้จะนำ viper มาทำการดึงค่า config ต่างๆที่เป็น .yaml
coppy code ไปก็สามารถ go mod tidy ได้เลยนะครับ แต่อาจจะต้องสร้าง file สร้างอะไรตามปกติก่อนนะครับ
โดยโครงสร้าง config จะเป็นประมาณนี้
และทำการ set ค่าต่างๆที่ต้องนำไปใช้งานใน file config.yaml
มาอธิบายในส่วน code ก่อนแรกเลยผมต้อง Init ตัว viper ก่อนโดยให้ viper รู้จัก path และ file และทำการและทำการสร้าง env ต่างๆที่ได้จากการอ่าน และ ทำการแปลงค่าที่ได้จาก env _ ให้กลายเป็น .
จากนั้นเอาไปใช่ในส่วนต่างๆที่แสดงบน code จาก นั้นลอง run ดูและยิง api จะได้เหมือนบทความที่ผ่านมา
หลังจากเรา run บน local เสร็จแล้วมาดู aws lambda กันดีกว่า
หน้า code ทั้งหมดจะได้ออกมาแบบนี้มาไล่อธิบายทีละส่วนกันครับ
ทำการ import ที่จะได้ใช้บน lambda มาก่อน
ทำการประกาศตัวแปรให้ ginLambda ให้สามารถเชื่อม lambda กับ api gateway ได้และทำ function lambdaHandler เพื่อนำไปเรียกใช้ ว่ามี event อะไรมา และ return event อะไรกลับไป
จะเห็นตรง main ว่าถ้า config ที่เราทำเป็น lambda มีค่าเท่า กับ true มันก็จะทำ lambda start และเรียก function ที่เราเตรียมไว้ข้างต้น ส่วน go func ก็มีการดักไว้ว่า service ยังทำงานอยู่นะ
หลังจากนั้นผมก็จะมาเพิ่ม file config-lambda.yaml ไว้และทำการ config ค่าต่างๆลงไปที่ค่าที่เปลี่ยนจะเป็นค่า app.lambda ที่จะมีค่าเป็น true
จากนั้นเราจะทำการทำการ deploy แหละแต่ก่อนอื่นเลยเรามาทำความรู้จัก docker กันก่อน
https://medium.com/p/aa84b3e112d8 ปูพื้นฐาน
https://medium.com/p/e87e0e8d84e0 ทำ Docker image โดย Nodejs
ใครพอรู้อยู่แล้วก็ผ่านได้เลยครับ
หลักการก็ทำdocker แบบ go ทั่วไป แต่จะมีการ coppy config-lambda.yaml ไปเป็น config.yaml เพราะ …
viper ที่เรา setconfig ชื่อต้องเป็น config เฉยๆ
หลังจากนั้นเราทำการเชื่อม local เรากับ aws ให้เรียบร้อยและเช็คให้ดีว่า roles ใน iam ของเราสามารถ deploy ขึ้น ECR ได้
เข้ามาบน aws console และมา menu ECR และกด create
โดยผมจะสร้างไว้ชื่อ booking เลือกเป็น private แล้วกดสร้าง
จะได้หน้าตาออกมาแบบในภาพ
จากนั้นทำการ authen บน local เราให้ถูกต้อง https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html ลง aws cli ให้เรียบร้อย
https://docs.aws.amazon.com/lambda/latest/dg/go-image.html
อยู่ที่ STEP 6
aws ecr get-login-password — region us-east-1 | docker login — username AWS — password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
เปลี่ยนค่าต่างๆให้ถูกต้อง โดย ผมจะใส่
- region ap-southeast-1
- และชี้คลังเก็บให้ถูกต้อง
โดยคลังเก็บเอาจากที่ create ได้เลย
จากนั้นก็ขึ้นสถานะ login เรียบร้อย
จากนั้นสร้าง Makefile เพื่อให้ง่ายต่อการ run ไม่ต้องจำ โดยจะทำการ go mod vender เพื่อเช็คว่าทุกอย่างถูกต้องเมื่อผ่านก็ทำการ build และ push ไปที่ ECR ตาม path ที่เรา create ไว้
จากนั้นก็เรียบร้อยครับ push ไปอยู่ ecr บน aws เราเรียบร้อยแล้ว
ต่อมาก็มาตรง lambda แล้วกด create
หลังจากกดสร้างแล้วไปที่ container image แล้วทำการตั้งชื่อและเลือก image ที่เราสร้างไว้
อันเป็นเสร็จแล้วแหละแต่ภายนอกยังเข้าถึงไม่ได้ตัวที่จะให้ภายนอกเข้าถึงได้คือ ตัว api gateway ที่เราจะเอามาทำ mircroservice นี่แหละ
จากนั้นมาเมนู api gateway แล้วทำการสร้าง
เลือกหัวข้อ REST API
ผมเลือกเป็น edge optimized เพราะมันเลือกเส้นทางที่ดีที่สุดให้เราสำหรับที่ internet เข้าถึงไม่ต้องยึดติดกับ region
จากนั้น create resource proxy และทำการ enable api gateway cors
จากนั้น setup ค่าต่างให้ any และให้ any ชี้ไป Lambda ที่ชื่อว่า booking ส่วน time out default ของ api gateway อยู่ที่ 29 วิ คือเกินกว่านั้นไม่ควรมาทำเป็น api อยู่แล้วครับให้ไปใช้วิธีอื่น ส่วนที่กำหนดเป็น any เพราะ ใน Lambda เรารับค่าทั้ง get และ post ตามใน code
เราสามารถกดตรง test เพื่อทดสอบ api เราโดยจะเห็นว่าผมใส่ method get และ path booking และทดสอบยิงจะได้ response ออกมาปกติ
จากนั้นทำการ deploy ให้เรียบร้อย และเราจะได้ url มาและเรายัง set ค่าได้อีกหลายอย่างใน api gateway
จากนั้นผมจะสร้าง api gateway มาเพื่อ test api public จาก webfree
https://apipheny.io/free-api/ โดยผมไปเอา apiมาทดสอบจาก web นี้ และทำการสร้าง path ตามภาพและทำการ สร้าง method ที่เป็น get จากนั้นผมจะเปลี่ยนจาก lambda มา http และใส่ endpoint url
หลังจากนั้นก็ทำการ test จะได้ response ดังภาพ
อย่าลืม deploy api ทุกครั้งที่มีการเปลี่ยนแปลงต่างๆ
เป็นอันเสร็จสิ้นในการทำ api gateway เพื่อมา test ต่อด้านล่าง
ซึ่งก็ทำการยิง postman เส้นต่างๆเรียบร้อย
และเรายังสามารถมาดู log ผ่าน cloud watch ได้อีกอะไรมันจะดีขนาดนี้ครับ
ก็จบไปแล้วนะครับในการเอา golang ขึ้น lambda จริงๆมันมีอีกหลายวิธีครับ และเราก็เห็นประโยชน์ของ api gateway แล้วว่ามันสามารถนำมาเป็นท่อต่อต่างๆไม่สนภาษาใดๆเลยเหมาะกับนำมาทำ microservices มากๆ ซึ่งข้อดีของ golang เราก็เห็นแล้วเหมาะกับทำเล็กๆไปใหญ่ๆ เราสามารถซอย module ต่างๆออกได้ยิ่งกว่านี้ รอบหน้าผมจะมาแยก module และทำ gitlab private เพื่อดึง module ต่างๆมาใช้ใน golang เพราะ concept golang package อยู่ folder เดียวกันก็มองไม่เห็นกันนะครับ ซึ่งมันเป็นข้อดีของ golang แหละครับแยก Module ย่อยๆเพื่อที่จะได้ดูแลและส่งต่อง่ายๆครับ
บทความต่างๆที่ผมเคยเขียนแล้วคิดว่าน่าจะเกี่ยวข้อง
- firebase functions vs lambda
- nodejs on aws lambda
- พื้นฐาน docker และ ทำ docker image
- พื้นฐาน golang
- บทความ golang ก่อนจะมาถึงบทความนี้
( CR. ธำรงค์ ไชยวงค์ )