ภาษา Go ตอน 9 วิธี Deploy Go Lang ไปยัง Heroku Cloud แบบ Step by Step

Chaiyarin Niamsuwan
odds.team
Published in
6 min readJan 23, 2019
How To Deploy Go Lang To Heroku

หลังจากที่ เราเขียน 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 ได้เลย

กด Sign Up เพื่อสมัครสมาชิก

เมื่อกดเข้ามาแล้วก็กรอกข้อมูลให้ครบถ้วนครับและกด Create Free Account

กรอกข้อมูลให้ครบถ้วน

เมื่อกด Create Free Account เสร็จแล้ว Heroku จะให้เรายืนยัน Email ที่เราสมัครไป

ยืนยัน Email ที่เรากรอกสมัครไปเมื่อกี้

กดยืนยันทาง Email แล้ว Heroku จะให้เราตั้งรหัสผ่านเพื่อใช้ Login ในระบบ Heroku โดยการกรอก Password ต้องมีตัวอักษร ตัวเลข และ อักขระพิเศษ ถึงจะกรอกผ่าน

ตั้งรหัสผ่านที่เราต้องการ Login ใน Heroku

เมื่อตั้งรหัสผ่านที่แข็งแกร่งเสร็จแล้วก็จะเข้าสู่หน้าจอ Welcome กด Click Here To Proceed เพื่อเข้าสู่หน้าจอ Dashboad ใช้งาน Heroku ได้เลย

เมื่อตั้งรหัสผ่านเสร็จแล้วก็จะเข้าสู่หน้าจอ Welcome to Heroku

เข้าสู่หน้าจอ Dashboard ของ 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 แบบนี้

เมื่อ Run คำสั่ง Godep จะ Auto Generate ไฟล์ 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

เมื่อเตรียมทุกอย่างพร้อมแล้วเราจะมีไฟล์หลักด้วยกัน 3 ไฟล์ คือ 1.main.go 2.Procfile 3.Godeps.json

นั้นก็หมายความว่าเราพร้อมจะ Deploy Go Project เราเข้าสู่ Server Heroku แล้ว เย้ๆๆ

วิธี Deploy Go ไปยัง Heroku มีด้วยกันหลักๆ 2 วิธี

  1. Deploy ผ่าน Command Line ของ Heroku
  2. Push Code เข้า Github แล้ว Heroku จะดึง Code เรามี Deploy (เอาไว้ตอนหน้า)

วิธีที่ 1 Deploy ด้วย Command Line ของ Heroku

Step 1) เริ่มจาก ติดตั้ง Heroku Command Line ก่อน โดยเลือก OS ของเพื่อนๆที่จะติดตั้งได้จาก Link นี้

เมื่อเข้ามาแล้วจะได้หน้าตาแบบนี้ Download ตาม OS ของเพื่อนๆได้เลยครับ

Step 2) หลังจากติดตั้งเสร็จแล้ว เปิด Terminal ขึ้นมาแล้วใช้คำสั่ง

heroku login
ใช้คำสั่ง heroku login ผ่าน command line

เมื่อสั่ง heroku login แล้ว มันจะเปิด Web Browser ขึ้นมาให้เรา Login ผ่าน Browser เราก็กรอก Username Password ที่เราเพึ่งสมัครไป หรือ ถ้าใครเข้าค้างไว้มันก็จะขึ้นให้ Login

เมื่อใช้คำสั่ง heroku login และ กด key อะไรก็ตาม มันจะเปิด Browser มาให้ Login
เมื่อกด Login แล้ว มันจะให้เรากลับไปดูที่ Terminal ของเรา
และก็จะเห็นว่า ตอนนี้เราพร้อมใช้งาน และ Deploy Heroku ผ่าน Heroku CLI เรียบร้อยแล้ว

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 4 — Step 6 จะได้หน้าตาประมาณนี้

Step 7) ใช้คำสั่ง heroku create เพื่อสร้าง Server ขึ้นมาใน Heroku พร้อมกับ Git Remote Repository ของ Heroku ในตัวด้วยคำสั่งเดียว

heroku create
เมื่อใช้คำสั่ง heroku create เสร็จแล้วจะได้ผลลัพธ์หน้าตาประมาณนี้

Step 8 ) Deploy Code เราเข้า Server Heroku ด้วยคำสั่ง

git push heroku master

จังหวะนี้ Heroku จะนำ Source เราไปบน Server และไปอ่านไฟล์ Godeps.json เลือก Go Version และติดตั้ง Package ต่างๆที่เรา Import เข้ามาใช้งานใน Project หลังจาก Deploy เสร็จแล้วเราจะได้หน้าตาประมาณนี้

ถ้าได้แบบนี้แสดงว่า Project ของเพื่อนได้ Deploy เข้าสู่ Server ของ Heroku เรียบร้อยพร้อมเข้าจากที่ไหนก็ได้แล้ว

Step 9 ) ทดสอบว่า Project ที่เรา Deploy ไป ใช้งานได้จริงๆ ด้วยคำสั่ง

heroku open

มันก็จะเปิด Browser ให้เราหน้าตาแบบนี้

ถ้าได้แบบนี้ก็จบเกมส์ทุกอย่าง Deploy สำเร็จแล้วครับบบ

ตอนนี้ URL ที่เราสามารถเข้าถึงผ่านข้างนอกก็คือ

https://glacial-spire-25951.herokuapp.com/

ต่อมาเรามาลองไปตรง Path Restful Api ที่เราทำไว้กัน ชื่อ Path คือ

https://glacial-spire-25951.herokuapp.com/getAddress

เมื่อเข้าแล้วก็จะได้หน้าตาแบบนี้

สามารถ Response ออกมาเป็นรูปแบบ JSON ที่เราตั้งไว้เรียบร้อย

บทความนี้ก็เป็นการแนะนำและสอนการ Deploy Go Project ของเรา เข้าสู่ Cloud ของ Heroku โดยสมบูรณ์ ในตอนหน้าจะมาแนะนำอีก 1 วิธีที่ Deploy เข้าสู่ Heroku โดยไม่ใช้ Command Line กันนะครับ แล้วพบกันใหม่ :D

*** Souce Code ในบทความนี้อยู่ที่ Git ผ่าน Link ด้านล่างนะครับผม ***

--

--