Deploy Go application ขึ้น Google Cloud’s App Engine

ทดลองสร้าง Go REST API ง่ายๆสักตัว แล้ว Deploy ขึ้น GCP กันครับ

Gopher on the Cloud

รู้จัก Google Cloud App Engine

https://cloud.google.com/appengine/

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

ทาง GCP มี Documentation ที่ช่วยให้นักพัฒนาสามารถเริ่มต้นโปรเจคได้ไวขึ้น และมีตัวอย่างให้ลองทำตาม

ทาง 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 ของเรา

จากนั้นทำการสร้างโปรเจคใหม่

เมนู Manage resources จะพาไปยังหน้าสร้าง Project ใหม่
กำหนด Project Name และ Project ID

จากนั้น รอประมาณ 2–3 นาทีระบบจะทำการสร้างโปรเจคให้

Dashboard ของโปรเจคเรา

เมื่อ GCP ทำการสร้างโปรเจคของเราเสร็จเรียบร้อย เราสามารถเข้ามาดู Dashboard ของโปรเจคได้ ซึ่งจะเห็นได้ว่า มันเป็นเพียงโปรเจคว่างเปล่า ไม่มีอะไร

เริ่มต้นสร้าง App Engine ด้วยภาษา Go

เลือกเมนู App Engine > Dashboard
เป้าหมายของเรา คือ ภาษา Go

เลือกภาษา Go หลังจากนั้นระบบจะแสดง Promp ขึ้นมาให้เราระบุ Region ที่เราต้องการ ซึ่งเงื่อนไขในการเลือกนั้นขึ้นอยู่กับกลุ่มผู้ใช้ของเราว่าอยู่โซนไหน ในที่นี้ผมเลือก asia-south1 เนื่องจากผมทำการทดสอบอยู่ที่ประเทศไทย

เลือก 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 ง่ายๆ สักตัว

สร้างโปรเจคใหม่

  1. ไปที่ $GOPATH ของเครื่องผู้อ่าน
  2. สร้าง 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: go1
handlers:
- 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 อย่าง ดังภาพ

API Server :51362 / Admin Server: 8000 และ App :8080

ทำการทดสอบเชื่อมต่อไปยัง web server ของเรา

ผลทดสอบด้วย curl

หากการทดสอบขึ้นแบบนี้ ยินดีด้วยครับ เราได้ API ง่ายๆ ด้วยภาษา Go แล้ว และพร้อม Deploy ขึ้น Google App Engine แล้ว

ขั้นตอนการ Deploy โปรเจคขึ้น GCP

Login เข้าสู่ GCP

gcloud auth login

คำสั่งนี้จะทำการแสดง Dialog เพื่อขอสิทธิในการเข้าถึง Profile ของ Google Account ของเรา ระบบจะขอให้เราทำการ Login และ Grant Permission ตามลำดับ

Auth เสร็จสิ้น ระบบจะ Redirect เราพร้อมแสดงข้อความแบบนี้

กำหนดโปรเจค ID สำหรับการ Deploy

gcloud config set project <project id>

คำสั่งนี้ คือ การเลือก project ที่เราสร้างไว้ใน GCP

คำถาม แล้วเราจะหา project id ได้จากไหน?

ที่เมนู IAM & admin > Manage Resource
gcloud app deploy
Pre Deployment Result

เมื่อ gcloud ตรวจสอบ project id / app.yaml ถูกต้อง ระบบจะแสดงผลลัพธ์การ deploy ให้เราทราบ และแสดง target url ซึ่งเป็น public url ของโปรเจค

กำลัง Deploying รอประมาณ 2–3 นาที

Runtime Log ของโปรเจค

หากเราต้องการดู runtime log เราสามารถใช้คำสั่งนี้

gcloud app logs tail -s default

Congratulation! เราสามารถเข้า Golang Application ของเราได้แล้ว

gcloud app browse
my-project-url/
my-project-url/hello

ระบบ Dashboard ใน Google App Engine

Dashboard ช่วยให้เราสามารถดู ภาพรวมของระบบเราได้ เช่น จำนวน User ที่ Visited ในช่วงเวลาที่เราระบุ / Current Load ในแต่ละ URL / Billing / Bandwidth Usage เป็นต้น

ภาพรวมของ Application

บทความนี้เป็นเพียงตัวอย่างง่ายๆ ในการ 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 นะครับผม เดียวค่าใช้จ่ายในบิลจะบาน :)

--

--

Teerapong Singthong 👨🏻‍💻
Teerapong Singthong 👨🏻‍💻

Written by Teerapong Singthong 👨🏻‍💻

Engineering Manager, ex-Solution Engineering Lead at LINE | Tech | Team Building | System Design | Architecture | SWE | Large Scaling System

Responses (1)