Cloud
Cloud Run เนี่ย มันคือบริการของ Google Cloud Platform (GCP) ที่ทำให้เราสามารถรัน containerized application แบบ serverless ได้ง่ายๆ เลย สมัยผมทำร้านเน็ตฯ เนี่ย การดูแลเซิร์ฟเวอร์เองเป็นเรื่องปวดหัวมาก ต้องคอยอัพเดทแพทช์ ดูแลความปลอดภัย แถมถ้าคนไม่เข้าเว็บก็เสียเงินเปล่า Cloud Run เลยเข้ามาแก้ปัญหานี้แหละ
สำคัญยังไงน่ะเหรอ? ลองคิดดูนะ เราไม่ต้องกังวลเรื่องเซิร์ฟเวอร์เลย! Cloud Run จัดการให้หมด ทั้งเรื่อง scale, load balancing แถมจ่ายเงินเฉพาะตอนที่มีคนใช้งานจริงๆ ด้วยนะ ประหยัดงบไปได้เยอะเลย เหมาะสำหรับ microservices, API หรือแม้แต่เว็บแอปง่ายๆ ที่ต้องการความรวดเร็วในการ deploy
Container เนี่ย เปรียบเหมือนกล่องที่เก็บทุกอย่างที่แอปพลิเคชันเราต้องการ ทั้งโค้ด ไลบรารี และ dependencies ต่างๆ ทำให้แอปฯ ของเราทำงานได้เหมือนกันทุกที่ ไม่ว่าจะบนเครื่องเรา เครื่องเพื่อน หรือบน Cloud Run เอง สมัยก่อนตอนทำร้านเน็ตฯ ผมเคยเจอปัญหาโค้ดที่รันบนเครื่องผมได้ แต่ไปรันบนเซิร์ฟเวอร์ไม่ได้ Container เลยเข้ามาแก้ปัญหานี้แหละ
Docker เป็นเครื่องมือที่นิยมใช้ในการสร้างและจัดการ Container ลองศึกษาดูนะ จะช่วยให้ชีวิตง่ายขึ้นเยอะเลย
Serverless ไม่ได้แปลว่าไม่มีเซิร์ฟเวอร์นะ! แค่เราไม่ต้องจัดการเองต่างหาก Cloud provider อย่าง GCP จะดูแลให้หมด เราแค่โฟกัสกับการเขียนโค้ดอย่างเดียว สมัยก่อนต้องมานั่งปรับแต่งเซิร์ฟเวอร์เอง Serverless เลยเป็นอะไรที่ "สวรรค์" มากๆ
ข้อดีของ Serverless คือความยืดหยุ่นในการ scale และจ่ายเงินเฉพาะที่ใช้จริงเท่านั้น
การเริ่มต้นใช้งาน Cloud Run ไม่ยากอย่างที่คิด แค่มี Docker image แล้วก็ deploy ขึ้นไปได้เลย
อันดับแรก เราต้องสร้าง Docker image ก่อน ถ้ายังไม่เคยลองใช้ Docker แนะนำให้ลองทำตาม tutorial ง่ายๆ ดูก่อนนะ SiamCafe Blog มีบทความเกี่ยวกับ Docker อยู่บ้าง ลองเข้าไปอ่านดูได้
สมมติว่าเรามีไฟล์ Dockerfile หน้าตาประมาณนี้:
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD ["npm", "start"]
จากนั้นเราก็ build image ได้ด้วยคำสั่ง:
docker build -t gcr.io/[PROJECT_ID]/my-app:latest .
อย่าลืมเปลี่ยน [PROJECT_ID] เป็น Project ID ของ GCP เราด้วยนะ
หลังจากที่เรา build image เสร็จแล้ว เราก็ push image ขึ้น Google Container Registry (GCR) ก่อน:
docker push gcr.io/[PROJECT_ID]/my-app:latest
จากนั้นไปที่ Cloud Run ใน GCP console แล้วคลิก "Create Service" เลือก Container image ที่เราเพิ่ง push ขึ้นไป ตั้งชื่อ service แล้วก็เลือก region ที่ต้องการได้เลย
ที่สำคัญ อย่าลืมตั้งค่าให้ Cloud Run อนุญาตให้เข้าถึงได้จาก public internet นะ
สุดท้าย กด Create Service แล้วรอ Cloud Run จัดการให้ แค่นี้ก็เรียบร้อย!
Cloud Run ไม่ได้เป็นทางเลือกเดียวในการรัน application บน GCP นะ ยังมีตัวเลือกอื่นๆ อีก เช่น App Engine, Compute Engine หรือ Kubernetes Engine แต่ละตัวก็มีข้อดีข้อเสียต่างกัน
| บริการ | ข้อดี | ข้อเสีย | เหมาะสำหรับ |
|---|---|---|---|
| Cloud Run | Serverless, scale อัตโนมัติ, จ่ายเงินตามการใช้งานจริง | จำกัด runtime, container-centric | Microservices, API, เว็บแอปขนาดเล็ก |
| App Engine | ใช้งานง่าย, managed platform, รองรับหลายภาษา | จำกัด runtime, vendor lock-in | เว็บแอป, mobile backend |
| Compute Engine | ควบคุมได้เต็มที่, custom configuration | ต้องดูแลเซิร์ฟเวอร์เอง, ค่าใช้จ่ายสูง | แอปพลิเคชันที่ต้องการ custom configuration สูง |
| Kubernetes Engine | orchestration ที่ทรงพลัง, scale ได้อย่างยืดหยุ่น | ซับซ้อน, ต้องมีความรู้ Kubernetes | แอปพลิเคชันขนาดใหญ่ที่ต้องการ scale complex |
สมัยก่อนตอนทำร้านเน็ตฯ ผมใช้ Compute Engine เป็นหลัก เพราะต้องควบคุมทุกอย่างเอง แต่ถ้าให้เลือกใหม่ตอนนี้ Cloud Run นี่แหละตอบโจทย์ที่สุด SiamCafe Blog ก็รันอยู่บน Cloud นะ (แต่เป็น VM สมัยเก่า 😅)
เอาล่ะน้องๆ มาถึงส่วนที่สำคัญที่สุดแล้ว นั่นคือ "ทำยังไงให้ Cloud Run มันเวิร์คจริงในโลกธุรกิจของเรา" สมัยผมทำร้านเน็ตฯ น่ะ เรื่อง performance นี่สำคัญสุดๆ ใครโหลดช้า ใครเล่นเกมแล้วแลค มีหวังโดนด่าหูชา
Cloud Run ก็เหมือนกัน ถ้าตั้งค่าไม่ดี มีหวังเปลืองเงินแถม user หนีหมด วันนี้พี่เลยจะมาแชร์เทคนิคที่กลั่นมาจากประสบการณ์จริง 28 ปี ที่คลุกคลีกับ IT มานะ
จำไว้เลยว่า Container Image เปรียบเสมือนรถแข่ง ถ้าใส่ของเยอะ อืดอาด ก็วิ่งช้า สมัยก่อนผม optimize image นี่แทบจะบ้าตาย แต่ผลลัพธ์มันคุ้มค่ามากจริงๆ
หลักการง่ายๆ คือ ใช้ base image ที่เล็กที่สุดเท่าที่จะทำได้ และลบไฟล์ที่ไม่จำเป็นออกให้หมด ตอน build image ลองใช้ multi-stage build ดูนะ มันช่วยลดขนาด image ได้เยอะเลย
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Cloud Run มันดีตรงที่ปรับ resource ได้ตามใจชอบ แต่ถ้าปรับไม่ดี ก็เหมือนเอารถสปอร์ตไปวิ่งในโคลน คือเสียของเปล่าๆ
ลอง monitor CPU และ Memory usage ของ container ดู แล้วค่อยๆ ปรับ resource ให้เหมาะสม ถ้า container ใช้ CPU ไม่ถึง 50% ก็ลด CPU ลงหน่อย ถ้า memory เหลือน้อย ก็เพิ่ม memory เข้าไป
เรื่อง caching นี่สำคัญมากๆ โดยเฉพาะพวก static assets อย่างรูปภาพ หรือไฟล์ CSS/JS ลองใช้ Cloud CDN หรือ Cloud Storage มาช่วย cache พวกนี้ดูนะ รับรองว่า response time เร็วขึ้นเยอะ
สมัยก่อนผมใช้ Squid Cache ที่ร้านเน็ตฯ มันช่วยลด load ของ server ได้มหาศาล Cloud CDN ก็ทำหน้าที่คล้ายๆ กันแหละ แค่ scale ได้เยอะกว่า
อย่าละเลยเรื่อง Logging และ Monitoring เด็ดขาด! Cloud Run มันเป็น serverless ก็จริง แต่เราก็ต้องคอยดูว่ามันทำงานได้ดีหรือเปล่า
ใช้ Cloud Logging และ Cloud Monitoring ช่วย monitor error rate, latency, และ resource usage ถ้าเจออะไรผิดปกติ จะได้รีบแก้ไขได้ทันท่วงที
อีกเรื่องที่สำคัญคือการตั้ง alert ถ้า error rate สูงเกินไป หรือ latency เกินค่าที่กำหนด จะได้รู้ตัวก่อนที่ลูกค้าจะโวยวาย
Cloud Run เหมาะกับงานที่ scale ได้ง่ายๆ เช่น REST API, Web Applications, หรือ Background Jobs ที่ไม่ต้องการรันตลอดเวลา ถ้างานของคุณมีลักษณะแบบนี้ Cloud Run คือคำตอบ
Cloud Functions เหมาะกับงานที่สั้นๆ ง่ายๆ เช่น trigger function จาก event ส่วน Cloud Run เหมาะกับงานที่ซับซ้อนกว่า ต้องการ control environment มากกว่า และรันได้นานกว่า
Cloud Run คิดเงินตาม resource ที่ใช้จริง ถ้า application ของคุณไม่ได้ใช้งาน resource เยอะ ก็ไม่แพง แต่ถ้า application ของคุณใช้ resource เยอะ อาจจะต้องพิจารณา option อื่นๆ เช่น Compute Engine
Cloud Run สามารถใช้ได้กับ Container Registry หลายแบบ แต่ Cloud Container Registry (GCR) ของ Google เองก็เป็นตัวเลือกที่ดี เพราะมัน integrated กับ Cloud Run ได้อย่างราบรื่น
Cloud Run เป็นเครื่องมือที่ทรงพลังมากๆ ในการ deploy containerized applications แต่การใช้งานให้ได้ผลลัพธ์ที่ดีที่สุด ต้องอาศัยความเข้าใจในหลักการทำงาน และประสบการณ์ในการปรับแต่ง
หวังว่าเทคนิคที่พี่แชร์ไปวันนี้ จะเป็นประโยชน์กับน้องๆ ในการใช้งาน Cloud Run นะครับ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลย พี่จะพยายามตอบให้ดีที่สุด
อย่าลืมไปลองเล่น SiamCafe Blog กันด้วยนะ มีบทความดีๆ อีกเยอะเลย และถ้าใครสนใจเรื่องการลงทุน ลองดู iCafeForex นะจ๊ะ