
สำหรับนักพัฒนาไม่ว่าจะเป็น Front-end หรือ Back-end หลังจากพัฒนาบนเครื่องเราเสร็จแล้ว ถ้าอยากนำระบบขึ้น Online จริงให้คนอื่นได้เข้าถึงโดยผ่านโดเมนจริง และมี SSL ให้ใช้งานด้วย ผมขอแนะนำ Google cloud run ครับ
Google cloud run คืออะไร?
Cloud run คือ Serverless platform ที่จะนำ Docker image มา deploy ให้เราบน Knative ของ google ซึ่งเราไม่จำเป็นต้องรู้เรื่องพวก Knative เลย เราเพียงทำหน้าที่พัฒนาระบบก็พอ แล้วตอน deploy ให้ Cloud run จัดการ เราก็จะสามารถเข้าถึงแอพพิลเคขั่นของเราแบบ online ได้เลยทันที
ประโยชน์ของ Cloud run
เนื่องจาก Cloud run ใช้งานอยู่บน Knative ทำให้เราจะได้ความสามารถของระบบ K8S มาด้วย สิ่งที่เราจะเป็นประโยชน์กับเราเริ่มต้นคือ
- ได้โดเมนจริงแบบมี SSL ใช้
- ขยายเซิฟเวอร์ตามการใช้งานจริง (Auto horizontal scaling)
- รองรับทุกภาษาที่สามารถเขียนใน Docker image ได้
- Docker image ใช้งานได้แบบไหน เอาขึ้น Cloud run ก็ใช้งานได้แบบนั้นเลย
- เริ่มต้นฟรี!!! ไว้ทดสอบงานเล็กๆ ได้เลย (Price)
- Auto revisions หากขึ้นระบบใหม่แล้วพัง สามารถย้อนกลับได้เลย
แค่นี้ก็ cool แล้ว
ข้อจำกัด Cloud run
- นักพัฒนาต้องใช้งาน docker เบื้องต้นได้ เอาแค่รู้ว่าเขียน docker image ให้ได้ แล้วอัพขึ้น docker registry ได้พอ
- แอพพลิเคชั่นต้องพัฒนาเป็น stateless ก็คือห้ามมีไฟล์พวกรูป หรือข้อมูลสำคัญเขียนลงใน container เพราะถ้า deploy ใหม่ก็ไฟล์หายหมด
- Port เริ่มต้นจะถูกกำหนดด้วย 8080 (สามารถเปลี่ยนได้) ดังนั้นหากเราพัฒนาระบบเราต้องใช้งานผ่าน port 8080 โดย Cloud run จะทำการ Redirect จาก 443 ของโดเมนมายัง 8080 ให้ในระบบของเรา
ทดลองใช้ Cloud run กัน
เราจะมาลองนำเว็บที่พัฒนาด้วย Reactjs โดยใช้ Nginx มาไว้บน Cloud run กัน และบทความนี้ผมจะถือว่า ทุกคนมีความรู้พื้นฐานของ gcloud และ Docker กันมาแล้วนะครับ
Enable API ใน Cloud console
เริ่มต้นเราต้องเปิด api ใน cloud console ก่อน
- ไปที่ API Library
- ค้นหา Cloud Run API และ Google Container Registry API แล้วทำการเปิดการใช้งานซะ
Create default.conf
สร้างไฟล์ default.conf
ของ nginx เราจะให้มันใช้งานที่ port 8080 โดยไว้ใน nginx/default.conf
ของ root project
server {
listen 8080 default_server;
listen [::]:8080 default_server;
root /usr/share/nginx/html;
index index.html;
server_name _;
gzip on;
gzip_vary on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
gzip_disable "MSIE [1-6]\.";
location / {
try_files $uri $uri/ @rewrites;
}
location @rewrites {
rewrite ^(.+)$ /index.html last;
}
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
# Some basic cache-control for static files to be sent to the browser
expires max;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
}
Build a Docker image
สร้าง Dockerfile
ไว้ที่ root project
# build environment
FROM node:12-alpine as react-build
WORKDIR /app
COPY . ./
RUN yarn
RUN yarn build
# server environment
FROM nginx:1.13-alpine
RUN apk add --update tzdata && \
cp /usr/share/zoneinfo/Asia/Bangkok /etc/localtime && \
apk del tzdata
COPY --from=react-build /app/build /usr/share/nginx/html
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
WORKDIR /usr/share/nginx/html
EXPOSE 8080
ทำการ Build docker image ด้วยคำสั่งด้านล่าง
$ docker build -t asia.gcr.io/[YOUR_PROJECT_ID]/[IMAGE]:[TAG] .
$ docker push asia.gcr.io/[YOUR_PROJECT_ID]/[IMAGE]:[TAG]
[YOUR_PROJECT_ID]
เป็น google project id ของเราเอง ใครไม่รู้ก็ลองใช้คำสั่งgcloud projects list
ดูเอา[IMAGE]
ชื่ออิมเมจที่ต้องการ[TAG]
แท็กของอิมเมจ
หากใครไม่สามารถ push image ไปยัง google cloud registry ได้ให้เราทำการ authen ก่อนโดยใช้คำสั่ง
$ gcloud auth configure-docker
Deploy to Cloud Run
จากนั้นทำการ deploy cloud run ด้วยคำสั่ง
$ gcloud run deploy [SERVICE_NAME] --image asia.gcr.io/[YOUR_PROJECT_ID]/[IMAGE]:[TAG] \
--platform managed \
--region=asia-southeast1 \
--allow-unauthenticated
[SEVICE_NAME]
ชื่อ service ของระบบเรา--image
กำหนดอิมเมจที่ต้องการ pull ลงมา--tag
กำหนด tag ที่ต้องการ pull ลงมา--platform
เลือก platform ของ cloud run ที่เราจะใช้งาน--region
กำหนด region ในการ deploy ของผมจะเลือกเป็น asia-southeast1 นั้นก็คือสิงคโปร์นั้นเอง--allow-unauthenticated
ให้สามารถเข้า url มาได้เลย
เพียงเท่านี้เมื่อเราไปดูใน cloud console ก็จะเจอกับ service ของเราพร้อมด้วย url แบบมี ssl มาให้ใช้งานทันที
Deploying a new revision
หากเรามีการแก้ไขโค็ดแล้วต้องการ deploy ขึ้น cloud run ใหม่ก็ให้ทำขั้นตอนดังนี้
$ docker build -t asia.gcr.io/[YOUR_PROJECT_ID]/[IMAGE]:[TAG] .
$ docker push asia.gcr.io/[YOUR_PROJECT_ID]/[IMAGE]:[TAG]
$ gcloud run deploy [SERVICE_NAME] --image asia.gcr.io/[YOUR_PROJECT_ID]/[IMAGE]:[TAG] \
--platform managed \
--region=asia-southeast1 \
--allow-unauthenticated
เราสามารถอัพเดทโค็ด แล้วใช้ tag เดิมได้นะ เช่น image:lasted
แล้วพอ deploy ขึ้น cloud run ใหม่มันจะ pull ล่าสุดมาเอง
บทสรุป
อันนี้เป็นเพียงตัวอย่างการใช้งานเริ่มต้นสำหรับ cloud run เท่านั้น ซึ่งด้วยตัวระบบแล้วมันสามารถนำไปใช้งาน Production ได้เลย เพราะว่ามันสามารถกำหนด spec cpu หรือ ram ให้กับ container ได้ จากนั้นก็กำหนดการขยาย max หรือ min จำนวน container ได้อีกทำให้รองรับโหลดสูงๆ ได้ แถมคิดราคาตามการใช้งานจริงด้วย
อีกหนึ่ง case ที่เหมาะสมคือหากเรามี api ตัวไหนโหลดสูงๆ แบบแค่บ้างช่วงเวลาก็อาจโยนมาให้ cloud run ทำงานแทนได้
หากใครเป็นสาย AWS ให้นึกว่า Cloud run จะเปรียบเสมือนกับ AWS ECS
Thanks:
https://cloud.google.com/container-registry/docs/advanced-authentication#gcloud-helper
https://cloud.google.com/container-registry/docs/pushing-and-pulling
https://cloud.google.com/community/tutorials/deploy-react-nginx-cloud-run
https://cloud.google.com/run/docs/deploying#command-line
ขอบคุณที่สละเวลาแบ่งปันความรู้ครับ กำลังหาอยู่พอดีเลย
ยินดีครับ