18 สิงหาคม 2560

set up flask + python3 on ec2

เนื่องจาก GAE จะใช้ฟรีต้องใช้ appengine standard ซึ่งรองรับแค่ python2.7

โดยโปรเจคนี้ต้องการใช้ firebase ซึ่งมี pyrebase เป็นตัว warpper API ในการ รับส่งข้อมูล
และ pyrebase พัฒนาบน python3 ด้วยเหตุนี้ จึงจำเป็นต้องไป python3

GAE flex รองรับ python3 แต่ ด้วยราคาที่ลองใช้ดูแล้วตก $85 (3,000THB) ต่อเดือน เปรียบเทียบแล้ว ย้ายกลับมาใช้ EC2 freetier ดีกว่า

โดยเราสามารถ ย้าย code ที่เขียนอยู่บน GAE มาได้เลย โดยปรับนิดหน่อย

มี app.yaml ที่ไม่ต้องใช้ นอกนั้น copy มาได้หมดเลย


สิ่งที่เตรียมเพิ่มสำหรับการใช้งาน flask on EC2

sudo yum install mod24_wsgi-python35

เมื่อพร้อมแล้ว ไปสร้าง directory ไว้ที่

mkdir /var/www/flaskapp

สร้าง virtual environment เตรียมไว้ โดยลง package สำหรับ application

virtualenv -p python3 py3
source py3/bin/activate
pip install -r requirements.txt 
* requiements.txt คือ ไฟล์ที่บอกว่า application ต้องลง package อะไรเพิ่มบ้าง หากไม่มีก็ไม่ต้องใช้

นำ source code มาวางไว้ใต้ path นี้ แล้ว สร้างไฟล์ใหม่เพิ่มอีก 1 ไฟล์ เพื่อเรียกใช้ wsgi

vi /var/www/flaskapp/deploy.wsgi

##############################################
import sys,os,site

# Add virtualenv site packages
site.addsitedir(os.path.join(os.path.dirname(__file__),     'py3/local/lib/python3.5/site-packages'))
site.addsitedir(os.path.join(os.path.dirname(__file__),     'py3/local/lib64/python3.5/site-packages'))

# Path of execution
sys.path.append('/var/www/flaskapp')

activate_env = os.path.expanduser(os.path.join(os.path.dirname(__file__), 'py3/bin/activate_this.py'))
exec(compile(open(activate_env,"rb").read(),activate_env,'exec'), dict(__file__=activate_env))

from flaskapp import app as application

สร้างไฟล์สำหรับ port 80 ให้มาเรียกใช้ flask
vi /etc/httpd/conf.d/vhost.conf

##############################################
<VirtualHost *:80>
    ServerName flask.yuunai.com

    WSGIDaemonProcess flaskapp threads=5 user=ec2-user home=/var/www/flaskapp
    WSGIScriptAlias / /var/www/flaskapp/deploy.wsgi

    <Directory /var/www/flaskapp>
       WSGIProcessGroup flaskapp
       WSGIApplicationGroup %{GLOBAL}
       Order deny,allow
       Allow from all
    </Directory>
</VirtualHost>

ServerName ใส่อะไรก็ได้

จากนั้น restart service httpd
sudo service httpd restart

ลองเรียกใช้งานผ่านหน้าเวป (^_^)v