นำระบบของเราขึ้น online ด้วย Cloud run ฟรีจ๊ะ

2
นำระบบของเราขึ้น online ด้วย Cloud run ฟรีจ๊ะ

สำหรับนักพัฒนาไม่ว่าจะเป็น 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

2 COMMENTS

  1. ขอบคุณที่สละเวลาแบ่งปันความรู้ครับ กำลังหาอยู่พอดีเลย

LEAVE A REPLY

Please enter your comment!
Please enter your name here

12 − eight =