17May, 2021
Language blog :
Thai
Share blog : 
17 May, 2021
Thai

Deploy FastAPI ไปยัง Heroku ด้วย GitHub Actions

By

8 mins read
Deploy FastAPI ไปยัง Heroku ด้วย GitHub Actions

สวัสดีครับ วันนี้ผมจะพามาลองทำการ deploy code ไปยัง Heroku ด้วยการใช้ GitHub Actions โดยสิ่งที่จะทำวันนี้ คือ การ deploy application ขึ้นไปยัง Heroku ซึ่งผมจะใช้ FastAPI เป็นตัวแอปพลิเคชัน เนื่องจากใช้งานได้ง่ายและสะดวกรวดเร็ว (สำหรับตัว GitHub สามารถดูได้ที่นี่ครับ)

สิ่งที่ต้องเตรียมก่อน Deploy 

  1. Python และ FastAPI เป็นภาษาที่จะใช้ในการเขียนแอปฯ ซึ่งที่เลือกภาษา Python เพราะจะนำมาใช้คู่กับ FastAPI นั่นเองครับ
  2. Docker เป็นเครื่องมือยอดฮิตที่ใช้เหมือนเป็นตัวจำลองสภาพแวดล้อมของเซิร์ฟเวอร์ หรือเรียกว่า คล้าย virtual machine แต่จะแตกต่างกันหลัก ๆ ในเรื่องของ Docker จะจำลองแค่สภาพแวดล้อมให้สามารถทำการรันแอปฯ ขึ้นมา แต่ virtual machine จะทำการจำลองทั้ง OS ขึ้นมาเลย ทำให้กินทรัพยากรเครื่องเยอะ ยิ่งถ้าต้องการหลายแอปฯ ก็จะยิ่งกินทรัพยากรเยอะ
  3. Virtualenv เป็นเครื่องมือที่จะทำการแยก library ที่จะใช้งานกับแอปฯ นั้น ๆ ยกตัวอย่างเช่น เราทำแอปฯ A ใช้ Python version 2.0 และ ทำแอปฯ B ใช้ Python 3.7 ถ้าปกติอาจจะต้องทำการสลับ Python version หรือไม่ก็ลบและติดตั้งเวอร์ชันที่ต้องการ แต่หากมาใช้ Virtualenv ก็จะทำกลายเป็นว่าในการทำแต่ละแอปฯ เราก็จะทำการสร้าง 1 Virtualenv ของแอปฯ นั้นมา ซึ่งทำให้เวลาเราจะใช้ library ของแอปฯ A เราก็ไปใช้  Virtualenv ของแอปฯ A ทำให้ library จะไม่ใช้ปะปนกัน
  4. GitHub เป็นที่ในการจัดเก็บตัว Source Code หรือตัวจัดการโค้ดทำ version control ใช้งานได้ฟรี เป็นเครื่องมือหลัก ๆ ที่นักพัฒนาควรจะใช้ให้เป็น เพราะในโลกการทำงานมักจะใช้ในการจัดเก็บ Source Code ที่ไม่ใช้ในเครื่องเราแน่ ๆ และจะใช้เป็นตัว deploy ไปยัง heroku อีกด้วย
  5. Heroku เป็น platform as a service ที่จะเปิดให้นักพัฒนา ทั้งหน้าเก่าและหน้าใหม่ ได้ใช้งานเพื่อวัตถุประสงค์ต่าง ๆ เช่น ทดสอบงาน หรือเก็บเป็นผลงานเพื่อนำไปนำเสนองาน โดยที่ผู้ใช้ไม่ต้องเสียค่าใช้จ่ายในการเช่าเซิร์ฟเวอร์ และยังไม่ต้องไปปวดหัวกับการเตรียมเซิร์ฟเวอร์อีกด้วยครับ

ขั้นตอนการ Deploy FastAPI ไปยัง Heroku

1. เริ่มโดย install Virtualenv

$ pip install virtualenv <name virtualenv>


2. สร้าง Virtualenv ของโพรเจกต์ โดยสามารถตั้งได้ตามต้องการครับ

 $ virtualenv <name virtualenv>


3. activate Virtualenv

 $ source <name virtualenv>/bin/activate


4. ติดตั้ง FastAPI Framework

$ pip install fastapi


5. ติดตั้ง Uvicorn สำหรับการเป็น ASGI server

$ pip install uvicorn


6.  สร้างไฟล์ main.py เพื่อทำการทดสอบ API ของเรา

from typing import Optional
from fastapi import FastAPI
app = FASTAPI()@app.get("/")
def read_root():   return {"Hello": "World"}


7. ทดลองรันเพื่อทดสอบการทำงานของแอปฯ สามารถรันขึ้นโดยไม่มีปัญหา

$ uvicorn main:app --reload


8. หากแสดงผลแบบนี้ ก็แปลว่าทำงานได้ถูกต้องตามที่เขียน code ลงไป โดยหากลองทำการยิง API ดู ก็จะพบว่าแสดงผลออกมาเป็น “Hello”: “World” นั้นเอง

9. สร้าง workflow ใน GitHub Actions ขึ้นมาจะพบว่ามี Source code ตัวอย่างที่สามารถนำไปใช้งานเพิ่มหรือปรับปรุงให้เหมาะสมกับงานที่ตัวเองจะทำได้  จากนั้นลองใช้ Source code ที่เขาให้มาแล้วลองรันดูกันเลยครับ

ผลลัพธ์จากการรัน workflow จะเห็นว่ามีเครื่องหมายกาถูกทั้งหมดเลย หมายถึงสามารถรันได้ผ่านตามโค้ดที่เขาให้มาเลยครับ

10. ขั้นตอนถัดมา จะทำการติดตั้ง Heroku CLI เพื่อที่จะนำไป generate Heroku API key มาใช้ใน secret variable และใช้ในการทดลอง deploy ด้วย command เพื่อจะให้มั่นใจว่าพอไปใช้ใน GitHub Actions แล้วจะสามารถทำงานได้ถูกต้อง

 # สำหรับ Mac

$ brew tap heroku/brew && brew install heroku


สำหรับระบบปฏิบัติการอื่น ๆ
(Window, Linux) โหลดหรือดูข้อมูลได้ที่นี่ครับ


11. จากนั้น login Heroku โดยใส่ Username and Password ตามที่ได้สมัครไว้ได้เลยครับ

 $ heroku login


12. generate token เพื่อนำไปใส่ใน secret : HEROKU_API_KEY

 $ heroku authorizations:create

 


13. Secret ขึ้นมา 2 ตัวเพื่อจะนำไปใช้ใน GitHub Actions  ที่จะเขียน

    1. HEROKU_API_KEY เป็นตัว token ที่ generate มาจากขั้นตอนที่ 12
    2. HEROKU_APP_NAME ชื่อของโพรเจกต์ หรือ แอปฯ

14.  จากนั้นสร้างไฟล์ Dockerfile เพื่อทำการ build เป็น Image ไปใช้งานบน Heroku

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7 
COPY ./ /app 
WORKDIR /app


15. สร้างไฟล์ Procfile ให้อยู่ในแอปฯ ซึ่งจะเป็น configuration ของ Heroku อันนี้ห้ามขาดถ้าไม่มีจะรันเว็บไม่ขึ้นครับ

web: uvicorn main:app --host=0.0.0.0 --port=${PORT:-5000}


16. มาทดลองรันคำสั่ง Build and Deploy บน เครื่องของเรากันก่อนว่าจะทำงานได้หรือไม่ โดยจะทำการรัน เพื่อ build image และ push ขึ้นไปยัง Heroku กันครับ

## build image$ heroku container:push web --app <app name>## push image to heroku$ heroku container:release web --app <app name>


17. หากสำเร็จ url ของเว็บจะได้แบบนี้


18. เมื่อได้แบบนี้มาจะทำการเปลี่ยนโค้ดใน GitHub Actions โดยจากตัวอย่างโค้ดนะครับ ซึ่งก็คือ ตัว GitHub Actions จะทำการ login ไปยัง Heroku หลังจากนั้นจะ build image แล้วก็ push ขึ้นไปครับ

เพียงเท่านี้ก็จะทำ code deploy เมื่อ push code ไปยัง GitHub ได้แล้วครับ

สรุปจาก blog นี้ได้เรียนรู้อะไรไปบ้าง

1. วิธีการ Deploy FastAPI ไปยัง Heroku ด้วย GitHub Actions

2. วิธี  deploy Heroku manual

3. เริ่ม FastAPI แบบไวๆ

4. การใช้งาน Virtualenv  

ก็หวังว่าจะเป็นประโยชน์ให้กับเพื่อน ๆ ไม่มากก็น้อยนะครับ คราวหน้าจะเป็น blog เกี่ยวกับอะไรก็มารอติดตามกันนะครับ ขอบคุณครับ

Written by
Senna Labs
Senna Labs

Subscribe to follow product news, latest in technology, solutions, and updates

- More than 120,000 people/day visit to read our blogs

Other articles for you

13
July, 2024
JS class syntax
13 July, 2024
JS class syntax
เชื่อว่าหลายๆคนที่เขียน javascript กันมา คงต้องเคยสงสัยกันบ้าง ว่า class ที่อยู่ใน js เนี่ย มันคืออะไร แล้วมันมีหน้าที่ต่างกับการประกาศ function อย่างไร? เรามารู้จักกับ class ให้มากขึ้นกันดีกว่า class เปรียบเสมือนกับ blueprint หรือแบบพิมพ์เขียว ที่สามารถนำไปสร้างเป็นสิ่งของ( object ) ตาม blueprint หรือแบบพิมพ์เขียว( class ) นั้นๆได้ โดยภายใน class

By

4 mins read
Thai
13
July, 2024
15 สิ่งที่ทุกธุรกิจต้องรู้เกี่ยวกับ 5G
13 July, 2024
15 สิ่งที่ทุกธุรกิจต้องรู้เกี่ยวกับ 5G
ผู้ให้บริการเครือข่ายในสหรัฐฯ ได้เปิดตัว 5G ในหลายรูปแบบ และเช่นเดียวกับผู้ให้บริการเครือข่ายในยุโรปหลายราย แต่… 5G มันคืออะไร และทำไมเราต้องให้ความสนใจ บทความนี้ได้รวบรวม 15 สิ่งที่ทุกธุรกิจต้องรู้เกี่ยวกับ 5G เพราะเราปฏิเสธไม่ได้เลยว่ามันกำลังจะถูกใช้งานอย่างกว้างขวางขึ้น 1. 5G หรือ Fifth-Generation คือยุคใหม่ของเทคโนโลยีเครือข่ายไร้สายที่จะมาแทนที่ระบบ 4G ที่เราใช้อยู่ในปัจจุบัน ซึ่งมันไม่ได้ถูกจำกัดแค่มือถือเท่านั้น แต่รวมถึงอุปกรณ์ทุกชนิดที่เชื่อมต่ออินเตอร์เน็ตได้ 2. 5G คือการพัฒนา 3 ส่วนที่สำคัญที่จะนำมาสู่การเชื่อมต่ออุปกรณ์ไร้สายต่างๆ ขยายช่องสัญญาณขนาดใหญ่ขึ้นเพื่อเพิ่มความเร็วในการเชื่อมต่อ การตอบสนองที่รวดเร็วขึ้นในระยะเวลาที่น้อยลง ความสามารถในการเชื่อมต่ออุปกรณ์มากกว่า 1 ในเวลาเดียวกัน 3. สัญญาณ 5G นั้นแตกต่างจากระบบ

By

4 mins read
Thai
13
July, 2024
จัดการ Array ด้วย Javascript (Clone Deep)
13 July, 2024
จัดการ Array ด้วย Javascript (Clone Deep)
ในปัจจุบันนี้ ปฏิเสธไม่ได้เลยว่าภาษาที่ถูกใช้ในการเขียนเว็บต่าง ๆ นั้น คงหนีไม่พ้นภาษา Javascript ซึ่งเป็นภาษาที่ถูกนำไปพัฒนาเป็น framework หรือ library ต่าง ๆ มากมาย ผู้พัฒนาหลายคนก็มีรูปแบบการเขียนภาษา Javascript ที่แตกต่างกัน เราเลยมีแนวทางการเขียนที่หลากหลาย มาแบ่งปันเพื่อน ๆ เกี่ยวกับการจัดการ Array ด้วยภาษา Javascript กัน เรามาดูตัวอย่างกันเลยดีกว่า โดยปกติแล้วการ copy ค่าจาก value type ธรรมดา สามารถเขียนได้ดังนี้

By

4 mins read
Thai

Let’s build digital products that are
simply awesome !

We will get back to you within 24 hours!Go to contact us
Please tell us your ideas.
- Senna Labsmake it happy
Contact ball
Contact us bg 2
Contact us bg 4
Contact us bg 1
Ball leftBall rightBall leftBall right
Sennalabs gray logo28/11 Soi Ruamrudee, Lumphini, Pathumwan, Bangkok 10330+66 62 389 4599hello@sennalabs.com© 2022 Senna Labs Co., Ltd.All rights reserved.