[Golang] Go Cloud Functions and Go module
Hello Go! จากที่ผ่านมาเราได้ลองทำการ Deploy web ขึ้น firebase ไป Click here ทำให้มานึกขึ้นได้ว่า เออ หน้าเว็บบางอย่างเราก็อาจจะอยากยิง API เรียกข้อมูลก็ได้นี้หว่า แต่เราก็มาคิดว่ามันมีวิธีที่ง่ายกว่านี้ไหมที่จะต้องมานั่งสร้าง route API นู่นนั่นนี่ แบบที่เคยทำ Click here แล้วเอา deploy สักทีนึง มันต้องมีวิธีที่ง่ายกว่านั้นสิ แล้วเราก็เจอจนได้ นั้นก็คือการใช้ Cloud Function ของ Firebase นั้นเอง
Let’s Get Start
ต้องลง SDK กันก่อน ไปที่นี้เลย Google Cloud พอดีผม Golang บน window ก็จะพาทำแบบ window นะ
ก็กด Download คลิกๆๆๆๆ Nextๆๆๆๆๆ finish ไปเลย
จะเห็นว่ารูปที่ 3 ผมเลือกให้ Start Google Cloud SDK Shell ด้วย เสร็จแล้วมันจะเปิดขึ้นมาพาทำการ log in ต่างๆ ขอ permission access ของ google เสร็จแล้วก็เลือก Project ที่เราสร้างไว้ใน firebase ซะ
นั้นละ เท่านี้เราก็เชื่อมต่อกับ firebase เรียบร้อยละ พร้อมไปสูขั้นตอนการเขียนโค้ดเพื่อนำไป deploy
Go module
แต่ก่อนที่เราจะเริ่มไปเขียนโค้ดเราต้องมาทำความเข้าใจเรื่อง Go module ซะก่อน โดยจะพูดเป็นสรุปง่ายๆ เป็น Feature ใน go version 1.11 ที่สามารถทำให้เราเขียน golang แล้ว build หรือ run code ได้ โดยไม่ต้องวางไว้ใน Workspace ($GOPATH/src ← ภายในนี้คือ workspace)
แล้วมันทำยังไงละ ง่ายๆ ครับ
- สร้าง folder นอก workspace ขึ้นมา
- สร้างไฟล์ go ขึ้นมา เขียนโค้ดลงไป
- เปิด command line ใน directory นั้น และทำคำสั่ง go mod init <ชื่อไฟล์>
จะได้ไฟล์ go.mod มา ในกรณีที่เราใช้ package อื่นนอกpackage มาตรฐานด้วย เราจะได้ไฟล์ go.sum มาด้วย
แล้วไอเจ้า go.mod และ go.sum มันมีประโยชน์ยังไงละ ทำไมถึงต้องเอามาอธิบายก่อน deploy ขึ้น Cloud function ของ firebase
- go.mod ตัวนี้จะทำหน้าที่ในการ go get พวก external dependencies (พูดง่ายๆคือ package อื่นๆ ที่ไม่ใช้ package พื้นฐานที่ go มีมาให้ตอนแรก) เพราะว่าเราเขียน go ด้านนอก Workspace ไงละ และมันจะ get external dependencies ไปด้วยตอนเรา deploy ขึ้น Cloud function ของ firebase (ถ้าในกรณีที่ไม่ได้ใช้ package อื่นๆ ก็ยังคง deploy ได้เหมือนเดิมนะ)
- go.sum ส่วนเจ้าตัวนี้เนี่ยมันจะประกอบไปด้วย version ของ package และ checksum ของ dependencies ทั้งหมด และเอาไว้ให้ Module authenticate การ download module นั้นๆ มาด้วย อ่านเพิ่มเติมได้ที่ → Click here
เสริม สามารถใช้คำสั่ง go mod tidy เพื่อ เอา unused package ออกไป
Deploy to Cloud function
กลับมาสู่เรื่องของการ deploy เราจะต้องเขียน Function ที่มี parameter สองตัว ซึ่งคือ w http.ResponseWriter และ r *http.Request
package test
import (
"encoding/json"
"net/http"
)// Response is an object for response api
type Response struct {
Code int64
Message string
}func GetHelloWorld(w http.ResponseWriter, r *http.Request) { response := Response{ Code: 200, Message: "Hello World!...", } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(response)}
รันคำสั่งให้เรียบร้อย
go mod init <ชื่อไฟล์>
go mod tidy
และเมื่อจะ deploy ให้รันคำสั่ง
gcloud functions deploy <ชื่อโฟล์เดอร์> --runtime go111 --entry-point <ชื่อฟังก์ชั่น> --trigger-http
จะเห็นว่าเราได้ลิ้งค์เรียกฟังก์ชั่นนั้นมาแล้ว
เมื่อเราเรียกก็จะได้ผลลัพท์ตามที่เรากำหนดไว้
จบแล้ว ง่ายไหมครับ ไม่มีอะไรจะพูดแล้ว ครั้งหน้า จะมาเขียนอะไรดีนะ สวัสดี