มาทำ 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 ต่อด้านล่าง

path testapi
path get booking
path post booking
path get booking by id

ซึ่งก็ทำการยิง postman เส้นต่างๆเรียบร้อย

และเรายังสามารถมาดู log ผ่าน cloud watch ได้อีกอะไรมันจะดีขนาดนี้ครับ

ก็จบไปแล้วนะครับในการเอา golang ขึ้น lambda จริงๆมันมีอีกหลายวิธีครับ และเราก็เห็นประโยชน์ของ api gateway แล้วว่ามันสามารถนำมาเป็นท่อต่อต่างๆไม่สนภาษาใดๆเลยเหมาะกับนำมาทำ microservices มากๆ ซึ่งข้อดีของ golang เราก็เห็นแล้วเหมาะกับทำเล็กๆไปใหญ่ๆ เราสามารถซอย module ต่างๆออกได้ยิ่งกว่านี้ รอบหน้าผมจะมาแยก module และทำ gitlab private เพื่อดึง module ต่างๆมาใช้ใน golang เพราะ concept golang package อยู่ folder เดียวกันก็มองไม่เห็นกันนะครับ ซึ่งมันเป็นข้อดีของ golang แหละครับแยก Module ย่อยๆเพื่อที่จะได้ดูแลและส่งต่อง่ายๆครับ

บทความต่างๆที่ผมเคยเขียนแล้วคิดว่าน่าจะเกี่ยวข้อง

( CR. ธำรงค์ ไชยวงค์ )

--

--

No responses yet