Deploy Go application ขึ้น Google Cloud’s App Engine
ทดลองสร้าง Go REST API ง่ายๆสักตัว แล้ว Deploy ขึ้น GCP กันครับ
รู้จัก Google Cloud App Engine
App Engine เป็นเครื่องมือช่วยเหล่านักพัฒนา สามารถ Deploy Application ที่ถูกเขียนขึ้น ให้ไปอยู่บนระบบ Google Cloud ที่รองรับ Scalability และ Reliable โดยที่นักพัฒนาไม่จำเป็นมีความรู้ด้าน Infrastructure มาก ช่วยให้นักพัฒนาสามารถส่งมอบงานได้รวดเร็วขึ้น และไม่ต้องกังวลเรื่องการดูแลรักษา โดยที่ App Engine เองรองรับภาษามากมาย เช่น Node.js, Java, Python, PHP, Go, Ruby และ .NET
Serverless คงเป็นคำที่จำกัดความได้ดี สำหรับ Google App Engine ช่วยให้ นักพัฒนา ได้โฟกัสส่วนของการเขียนโค๊ดอย่างเดียว ส่วนการสร้าง Infrastructure นั้น ก็ให้ Code เป็นตัวกำหนดเช่นกัน ซึ่งจะกล่าวในขั้นตอนช่วง Deployment
ทาง Google Cloud Platform ไม่ได้มีแค่ Google App Engine เท่านั้น ยังมี Product & Service อีกมาก ให้เราเลือกใช้งาน ซึ่งผู้อ่านสามารถดูเพิ่มเติมที่ลิงค์นี้ https://cloud.google.com/docs/
ลงมือสร้างโปรเจคใหม่บน Google Cloud Platform
ไปที่ https://console.cloud.google.com/ และ เข้าสู่ระบบด้วย Google Account
นักพัฒนาหลายท่านคงทราบดีว่าทาง GCP ให้เครดิตกับนักพัฒนา หรือ ผู้ใช้ระบบ $300 เหรียญในการใช้งานระบบ สำหรับ 1 Account ของเรา
จากนั้นทำการสร้างโปรเจคใหม่
จากนั้น รอประมาณ 2–3 นาทีระบบจะทำการสร้างโปรเจคให้
เมื่อ GCP ทำการสร้างโปรเจคของเราเสร็จเรียบร้อย เราสามารถเข้ามาดู Dashboard ของโปรเจคได้ ซึ่งจะเห็นได้ว่า มันเป็นเพียงโปรเจคว่างเปล่า ไม่มีอะไร
เริ่มต้นสร้าง App Engine ด้วยภาษา Go
เลือกภาษา Go หลังจากนั้นระบบจะแสดง Promp ขึ้นมาให้เราระบุ Region ที่เราต้องการ ซึ่งเงื่อนไขในการเลือกนั้นขึ้นอยู่กับกลุ่มผู้ใช้ของเราว่าอยู่โซนไหน ในที่นี้ผมเลือก asia-south1
เนื่องจากผมทำการทดสอบอยู่ที่ประเทศไทย
Preparing your App Engine services…We are initializing the backend services for your app. It usually takes about a minute to complete.
หลังจากนั้นรอประมาณ 2–5 นาที GCP จะทำการสร้าง VM Instance ให้เราขึ้นมา คู่กับโปรเจคของเรา ซึ่งเราสามารถแก้ไขค่าของ VM Instance ของเราได้ภายหลัง
ติดตั้ง google-cloud-sdk
ในขั้นตอนนี้ท่านผู้อ่านสามารถดูวิธีการตั้งติดได้ ที่นี่
ติดตั้ง gcloud component สำหรับภาษา Go
gcloud components install app-engine-go
เขียนโค๊ด Go ง่ายๆ สักตัว
สร้างโปรเจคใหม่
- ไปที่
$GOPATH
ของเครื่องผู้อ่าน - สร้าง Project ใหม่ ภายใต้
/src/<your project>
ทำการสร้างไฟล์เหล่านี้
main.go
package mainimport (
"encoding/json"
"fmt"
"net/http" "google.golang.org/appengine"
)type hobby struct {
Id int `json:"id"`
Item string `json:"item`
}func main() {
http.HandleFunc("/", handle)
http.HandleFunc("/hello", hello)
appengine.Main()
}func handle(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, My Google App Engine with Golang")
}func hello(w http.ResponseWriter, r *http.Request) {
myHobby := hobby{
Id: 1,
Item: "Watch movie",
}w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
if err := json.NewEncoder(w).Encode(myHobby); err != nil {
panic(err)
}
}
app.yaml
runtime: go
api_version: go1handlers:
- url: /.*
script: _go_app
app.yaml ทำหน้าที่เป็น configuration file ของโปรเจค ที่เกี่ยวข้องกับ Infrastructure as code / Static file / Runtime Application Setting / Handler ตลอดจนไปถึง Scaling config ถ้าผู้อ่านคุ้นเคยกับ k8s ก็จะง่ายเลย สำหรับส่วนนี้
หากผู้อ่านอยากเข้าใจโครงสร้าง configuration file ในโปรเจคให้มากขึ้น สามารถตามอ่านได้ ที่ https://cloud.google.com/appengine/docs/standard/go/configuration-files
ผู้อ่านสามารถ Clone Project ทั้งหมด ผ่านทาง command
go get -u -d github.com/iamgoangle/go-google-app-engine
ทดสอบรัน Go Application ของเราบน Local Server
ทำการทดสอบรัน Go app ของเราผ่านทาง dev_appserver.py
ซึ่งเป็น package ที่มากับ google-cloud-sdk ที่เราได้ดาวน์โหลดมา ตามขั้นตอนก่อนหน้า
./dev_appserver.py $GOPATH/src/github.com/iamgoangle/go-google-app-engine
Local Server ทำการ Start Go Application ของเรา
ทันทีที่เรารันคำสั่งสำเร็จ local server จะ provide ให้เรา 3 อย่าง ดังภาพ
ทำการทดสอบเชื่อมต่อไปยัง web server ของเรา
หากการทดสอบขึ้นแบบนี้ ยินดีด้วยครับ เราได้ API ง่ายๆ ด้วยภาษา Go แล้ว และพร้อม Deploy ขึ้น Google App Engine แล้ว
ขั้นตอนการ Deploy โปรเจคขึ้น GCP
Login เข้าสู่ GCP
gcloud auth login
คำสั่งนี้จะทำการแสดง Dialog เพื่อขอสิทธิในการเข้าถึง Profile ของ Google Account ของเรา ระบบจะขอให้เราทำการ Login และ Grant Permission ตามลำดับ
กำหนดโปรเจค ID สำหรับการ Deploy
gcloud config set project <project id>
คำสั่งนี้ คือ การเลือก project ที่เราสร้างไว้ใน GCP
คำถาม แล้วเราจะหา project id ได้จากไหน?
gcloud app deploy
เมื่อ gcloud ตรวจสอบ project id / app.yaml ถูกต้อง ระบบจะแสดงผลลัพธ์การ deploy ให้เราทราบ และแสดง target url ซึ่งเป็น public url ของโปรเจค
Runtime Log ของโปรเจค
หากเราต้องการดู runtime log เราสามารถใช้คำสั่งนี้
gcloud app logs tail -s default
Congratulation! เราสามารถเข้า Golang Application ของเราได้แล้ว
gcloud app browse
ระบบ Dashboard ใน Google App Engine
Dashboard ช่วยให้เราสามารถดู ภาพรวมของระบบเราได้ เช่น จำนวน User ที่ Visited ในช่วงเวลาที่เราระบุ / Current Load ในแต่ละ URL / Billing / Bandwidth Usage เป็นต้น
บทความนี้เป็นเพียงตัวอย่างง่ายๆ ในการ Deploy Go application ซึ่งในโลกของ Cloud Engine ยังมี Product & Service มากมายที่เกี่ยวกับเว็ป ให้เราใช้ เช่น Real-time database, Authentication, OIDC, Logging, ACL และอื่นๆ อีกมากมาย
เอกสารที่อยู่ในลิงค์นี้ จะช่วยให้เราเข้าถึง ความสามารถ App Engine กับภาษา Go ได้มากขึ้นครับ https://cloud.google.com/appengine/docs/standard/go/how-to
App Engine เป็นเครื่องมือที่ช่วยให้เหล่านักพัฒนาสามารถ Deploy แอพพลิเคชันที่สร้างขึ้น ให้ไปอยู่บน Cloud แทนที่จะทำแบบ On-premise ด้วยตัวเอง ช่วยให้เราโฟกัสเรื่องการเขียนโค๊ดไปเลย ไม่ต้องห่วงเรื่อง Infratructure ต่างๆ
ซึ่งการ Deployment นั้น เราสามารถใช้ผลิตภัณฑ์อื่นของ Google Cloud Platform ได้ เช่น Google Compute Engine ในการสร้าง VM Instance ขึ้นมา หรือ จะใช้การสร้าง Dockerfile แล้วใช้ Kubernetes ก็ยังได้ครับ
สุดท้ายก็อย่าลืม!!! เรากำลังใช้ Credit $300 ในระยะเวลา 1 ปี ถ้าเกินโควต้า ก็อย่าลืม Delete Project นะครับผม เดียวค่าใช้จ่ายในบิลจะบาน :)