ภาษา Go ตอน 9 วิธี Deploy Go Lang ไปยัง Heroku Cloud แบบ Step by Step
หลังจากที่ เราเขียน RestFul Api ด้วยภาษา Go ไปในตอนที่แล้ว ถ้าเพื่อนๆคนไหนยังไม่อ่านสามารถเข้าไปอ่านได้ที่ Link ข้างล่างนี้นะครับ
เมื่อเราทำ RestFul Api ได้แล้ว แต่เราเล่นเองคนเดียว บนเครื่องของตัวเอง จะไปสนุกอะไรจริงไหมครับ ถ้าเราสามารถนำ RestFul Api ที่เราเขียน ไปให้คนอื่นส่ง Request และ Response ออกไปให้คนอื่นใช้บ้าง 24 ชั่วโมง มันก็น่าจะสนุกดี
รู้จักกับ Heroku คืออะไร ?
Heroku คือ Cloud Platform เจ้านึง ที่ให้เรา สามารถนำ Source Code ภาษาต่างๆ ที่เราเขียนนำไปวางไว้ที่ Server Heroku และ ให้คนนอกสามารถใช้งานโปรแกรมเราแบบ Online ได้ โดยที่เราไม่ต้องไปปวดหัวกับเรื่อง Infrastructure ต่างๆ ให้วุ่นวาย
วิธีการสมัครสมาชิก Heroku
เข้าไปสมัครที่ Link ด้านล่างนี้
เมื่อเข้ามาแล้วจะเจอหน้าจอแบบนี้กด Sign up ได้เลย
เมื่อกดเข้ามาแล้วก็กรอกข้อมูลให้ครบถ้วนครับและกด Create Free Account
เมื่อกด Create Free Account เสร็จแล้ว Heroku จะให้เรายืนยัน Email ที่เราสมัครไป
กดยืนยันทาง Email แล้ว Heroku จะให้เราตั้งรหัสผ่านเพื่อใช้ Login ในระบบ Heroku โดยการกรอก Password ต้องมีตัวอักษร ตัวเลข และ อักขระพิเศษ ถึงจะกรอกผ่าน
เมื่อตั้งรหัสผ่านที่แข็งแกร่งเสร็จแล้วก็จะเข้าสู่หน้าจอ Welcome กด Click Here To Proceed เพื่อเข้าสู่หน้าจอ Dashboad ใช้งาน Heroku ได้เลย
เข้าสู่หน้าจอ Dashboard ของ Heroku โดยสมบูรณ์
เตรียม Source Code ให้พร้อมก่อน Deploy
ก่อนที่เราจะ Deploy โปรแกรมที่เขียนด้วยภาษา Go ขึ้น Cloud ของ Heroku นั้น เราต้องรู้จักอะไรเพิ่มเติมอีกสัก 3 เรื่องดังนี้
1) Get Port Environment จากเครื่อง Server ที่เราเอา Code ไปลง
คืองี้ ในตอนที่ 8 ที่เราเขียน Restful Api กัน ใน Source Code ของพวกเรานั้นได้ตั้งค่า Port ฟิกเอาไว้ที่ :8080 แต่พอเราเอา Code ภาษา Go ของเราไป Run บน Heroku นั้น Port ของเราจะไม่ใช่ :8080 แล้วแต่เป็น Port ที่ Heroku เปิดเอาไว้ให้ใช้ ดังนั้นเรามาปรับ Source Code จากเดิมในตอน 8 กันหน่อย
1.1) เพิ่ม Method getPort() โดยมี Source Code ดังนี้
[Method getPort]func getPort() string {
var port = os.Getenv("PORT") // ----> (A)
if port == "" {
port = "8080"
fmt.Println("No Port In Heroku" + port)
}
return ":" + port // ----> (B)
}
อธิบาย Source Code
A. คือคำสั่งสำหรับการ getPort ของ Enviroment ที่ Source Code ภาษา Go ของเราไปวางอยู่
B. เราจะ Return ค่า Port ออกไปกับโคลอน “:” เพื่อนำไปใช้ต่อ ที่ Type เป็น String ปกติ
1.2) เมื่อนำ Method getPort มารวมกับ main.go ของเราในตอนที่ 8 ก็จะได้หน้าตาออกมาประมาณนี้
[Filename: main.go] ไฟล์จากตอน 8package mainimport (
"encoding/json"
"fmt"
"net/http"
)type addressBook struct {
Firstname string
Lastname string
Code int
Phone string
}func getAddressBookAll(w http.ResponseWriter, r *http.Request) {
addBook := addressBook{
Firstname: "Chaiyarin",
Lastname: "Niamsuwan",
Code: 1993,
Phone: "0870940955",
}
json.NewEncoder(w).Encode(addBook)
}func homePage(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Welcome to the HomePage!")
}func getPort() string {
var port = os.Getenv("PORT")
if port == "" {
port = "8080"
fmt.Println("No Port In Heroku" + port)
}
return ":" + port
}func handleRequest() {
http.HandleFunc("/", homePage)
http.HandleFunc("/getAddress", getAddressBookAll)
http.ListenAndServe(getPort(), nil) // ----> เพิ่ม getPort ตรงนี้ด้วย
}
func main() {
handleRequest()
}
และลบ Port :8080 ใน method handleRequest แล้วแทนที่ด้วย getPort() เป็นอันเสร็จพิธีสำหรับการเตรียม Source Code
2) รู้จักกับ GoDep
GoDep คือ ตัวคอยช่วยเราจัดการ Package ที่เรา Import มาใช้งานใน Project ภาษา Go ของเรา โดยมันจะมีหน้าที่หลักๆ คล้ายๆกับ ตัวสร้าง package.json ของ Node Package Manager แต่มันจะสร้างไฟล์ Godeps.json มาแทน เพื่อที่จะคอยบอกคนอื่นว่าเราติดตั้ง Package อะไรใน Project เราบ้าง
*** Note: เวลาเราจะ Install Package ของ package.json เราจะใช้ npm install ในภาษา Go ก็ไม่ต่างกัน เราจะใช้ godep go install ./ มันก็จะไปไล่หา package ในไฟล์ Godeps.json และติดตั้งให้เรา รวมถึงระบุ Version Go ที่เราใช้ลงไปใน Godeps.json อีกด้วย ***
2.1 ติดตั้ง(Install) GoDep
[ใช้คำสั่งติดตั้งด้วย go get]go get github.com/tools/godep
เมื่อติดตั้งเสร็จแล้วให้เรา cd เข้ามาที่ Directory ที่เราสร้าง Project go-api เอาไว้ในตอนที่ 8 ณ ของผมคือ Path นี้
cd /Users/chaiyarin/go/src/github.com/chaiyarin/go-api
เมื่อเข้ามาใน Directory แล้วใช้คำสั่ง godep save
[Auto Generate ไฟล์ Godeps.json]godeb save
เมื่อสั่งแล้วจะได้ 1 Directory ชื่อ Godeps กับ 1 ไฟล์ชื่อ Godeps.json แบบนี้
*** Note ถ้าเราไม่มีไฟล์ Godeps.json ตัว Cloud ของ Heroku จะไม่รู้ว่าเราใช้ Go Version อะไร และ จะไม่รู้ว่าเรา Import Package อะไรมาใช้งานใน Project เราบ้าง ดังนั้นไฟล์นี้จึงสำคัญมาก ***
3) รู้จักกับ Procfile
Procfile คือ ไฟล์ Text ธรรมดาไฟล์นึงที่เอาไว้บ่งบอกว่าเราจะใช้คำสั่งอะไรในการ Start Project ภาษา Go ของเรา
โดย Procfile นั้นจะวางอยู่ root นอกสุดของ Project ของเรา พูดง่ายๆว่า วางอยู่ตาม Path นี้
[Path สำหรับการวาง Procfile]/Users/chaiyarin/go/src/github.com/chaiyarin/go-api/Procfile
งั้นเรามาเริ่มสร้าง Procfile กันเลยดีกว่าครับผม โดยเริ่มจาก cd เข้ามาใน Path
cd /Users/chaiyarin/go/src/github.com/chaiyarin/go-api
และใช้คำสั่ง vim หรือ nano หรืออะไรก็ได้ในการสร้างไฟล์ Procfile ได้ โดยภายในไฟล์ Procfile จะประกอบไปด้วย ข้อมูลประมาณนี้
[Filename: Procfile]web: go-api
มีแค่บรรทัดเดียวเท่านี้เลย อธิบายก็คือ มันคือการบอกให้ Cloud Heroku รู้ว่า เราต้องการ Run Project เราในประเภทแบบไหน ณ ที่นี้คือ run แบบ web ตัว Heroku ก็จะได้รู้และไป สร้าง Routing เชี่อมต่อ HTTP อะไรพวกนี้ เพื่อให้เว็บเราเข้าถึงจากที่ไหนก็ได้ผ่าน Heroku
เพราะฉะนั้นเมื่อได้รู้เรื่องราวของทั้ง 3 เรื่องดังกล่าวแล้ว เราก็จะมีไฟล์ใน Project เรา หลักๆ 3 ไฟล์ด้วยกันคือ 1.main.go 2.Procfile 3.Godeps.json
นั้นก็หมายความว่าเราพร้อมจะ Deploy Go Project เราเข้าสู่ Server Heroku แล้ว เย้ๆๆ
วิธี Deploy Go ไปยัง Heroku มีด้วยกันหลักๆ 2 วิธี
- Deploy ผ่าน Command Line ของ Heroku
- Push Code เข้า Github แล้ว Heroku จะดึง Code เรามี Deploy (เอาไว้ตอนหน้า)
วิธีที่ 1 Deploy ด้วย Command Line ของ Heroku
Step 1) เริ่มจาก ติดตั้ง Heroku Command Line ก่อน โดยเลือก OS ของเพื่อนๆที่จะติดตั้งได้จาก Link นี้
Step 2) หลังจากติดตั้งเสร็จแล้ว เปิด Terminal ขึ้นมาแล้วใช้คำสั่ง
heroku login
เมื่อสั่ง heroku login แล้ว มันจะเปิด Web Browser ขึ้นมาให้เรา Login ผ่าน Browser เราก็กรอก Username Password ที่เราเพึ่งสมัครไป หรือ ถ้าใครเข้าค้างไว้มันก็จะขึ้นให้ Login
Step 3 ) ให้ cd มาที่ Path Project go-api ของเรา
cd /Users/chaiyarin/go/src/github.com/chaiyarin/go-api
Step 4) Initial Git ด้วยคำสั่ง git init
git init
Step 5) ใช้คำสั่ง git add เพื่อ add file เข้า git รอ commit
git add --all
Step 6) ใช้คำสั่ง git commit -m “deploy to heroku”
git commit -m "deploy to heroku"
Step 7) ใช้คำสั่ง heroku create เพื่อสร้าง Server ขึ้นมาใน Heroku พร้อมกับ Git Remote Repository ของ Heroku ในตัวด้วยคำสั่งเดียว
heroku create
Step 8 ) Deploy Code เราเข้า Server Heroku ด้วยคำสั่ง
git push heroku master
จังหวะนี้ Heroku จะนำ Source เราไปบน Server และไปอ่านไฟล์ Godeps.json เลือก Go Version และติดตั้ง Package ต่างๆที่เรา Import เข้ามาใช้งานใน Project หลังจาก Deploy เสร็จแล้วเราจะได้หน้าตาประมาณนี้
Step 9 ) ทดสอบว่า Project ที่เรา Deploy ไป ใช้งานได้จริงๆ ด้วยคำสั่ง
heroku open
มันก็จะเปิด Browser ให้เราหน้าตาแบบนี้
ตอนนี้ URL ที่เราสามารถเข้าถึงผ่านข้างนอกก็คือ
https://glacial-spire-25951.herokuapp.com/
ต่อมาเรามาลองไปตรง Path Restful Api ที่เราทำไว้กัน ชื่อ Path คือ
https://glacial-spire-25951.herokuapp.com/getAddress
เมื่อเข้าแล้วก็จะได้หน้าตาแบบนี้
บทความนี้ก็เป็นการแนะนำและสอนการ Deploy Go Project ของเรา เข้าสู่ Cloud ของ Heroku โดยสมบูรณ์ ในตอนหน้าจะมาแนะนำอีก 1 วิธีที่ Deploy เข้าสู่ Heroku โดยไม่ใช้ Command Line กันนะครับ แล้วพบกันใหม่ :D
*** Souce Code ในบทความนี้อยู่ที่ Git ผ่าน Link ด้านล่างนะครับผม ***