Google Cloud Run เป็นบริการ Serverless Container Platform ของ Google Cloud เหมาะสำหรับ Web Application, REST API, Microservices และ backend ที่ต้องการ Auto Scaling โดยไม่ต้องดูแล Virtual Machine หรือ Kubernetes Cluster ด้วยตนเอง

Workshop นี้จะสร้าง REST API ขนาดเล็กด้วย Node.js/Express จากนั้นสร้าง Container Image, เก็บ Image ใน Artifact Registry และ Deploy ไปยัง Cloud Run

#Architecture

Developer
   |
   v
REST API Source Code
   |
   v
Dockerfile
   |
   v
Cloud Build
   |
   v
Artifact Registry
   |
   v
Cloud Run Service
   |
   +---- HTTPS Endpoint
   +---- Auto Scaling
   +---- IAM
   +---- Logging / Monitoring

#สิ่งที่จะได้เรียนรู้

  • แนวคิด Serverless Container และ Cloud Run
  • การสร้าง REST API สำหรับ Container
  • การสร้าง Dockerfile
  • การใช้งาน Google Cloud CLI
  • การเปิดใช้งาน Cloud Run, Cloud Build และ Artifact Registry API
  • การสร้าง Artifact Registry
  • การ Build และ Push Container Image ด้วย Cloud Build
  • การ Deploy Container ไปยัง Cloud Run
  • Environment Variables
  • Public/Private API และ IAM
  • Revision และการอัปเดต Application
  • แนวทางต่อยอด CI/CD

#1. เตรียมเครื่องมือ

ต้องมี Google Cloud Project ที่เปิด Billing และติดตั้ง Google Cloud CLI

ตรวจสอบ:

gcloud --version

Login:

gcloud auth login

ดู Project:

gcloud projects list

กำหนด Project:

gcloud config set project PROJECT_ID

ตรวจสอบค่า:

gcloud config list

#2. กำหนดตัวแปรสำหรับ Workshop

ตัวอย่างนี้เลือก Singapore (asia-southeast1) เป็น region

export PROJECT_ID="YOUR_PROJECT_ID"
export REGION="asia-southeast1"
export REPOSITORY="cloud-run-demo"
export SERVICE="hello-api"

gcloud config set project $PROJECT_ID

บน Windows PowerShell สามารถใช้:

$env:PROJECT_ID="YOUR_PROJECT_ID"
$env:REGION="asia-southeast1"
$env:REPOSITORY="cloud-run-demo"
$env:SERVICE="hello-api"

#3. เปิดใช้งาน Google Cloud APIs

gcloud services enable \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com

#4. สร้าง REST API

สร้างโฟลเดอร์:

mkdir cloud-run-api
cd cloud-run-api

สร้าง package.json

{
  "name": "cloud-run-api",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "express": "^5.0.0"
  }
}

ติดตั้ง dependency:

npm install

สร้าง server.js

import express from "express";

const app = express();

const port = process.env.PORT || 8080;
const appName = process.env.APP_NAME || "Cloud Run API";

app.use(express.json());

app.get("/", (req, res) => {
  res.json({
    message: "Hello Google Cloud Run",
    application: appName
  });
});

app.get("/api/health", (req, res) => {
  res.json({
    status: "UP",
    service: appName
  });
});

app.get("/api/products", (req, res) => {
  res.json([
    { id: 1, name: "Notebook", price: 25000 },
    { id: 2, name: "Keyboard", price: 2500 },
    { id: 3, name: "Mouse", price: 1200 }
  ]);
});

app.listen(port, "0.0.0.0", () => {
  console.log(`${appName} listening on port ${port}`);
});

Cloud Run กำหนดตัวแปร PORT ให้ ingress container ดังนั้น application ควรอ่านค่าจาก process.env.PORT และ listen บน interface ที่รับ request จากภายนอก container ได้

#5. ทดสอบ REST API ในเครื่อง

npm start

ทดสอบ:

curl http://localhost:8080/
curl http://localhost:8080/api/health
curl http://localhost:8080/api/products

#6. สร้าง Dockerfile

สร้างไฟล์ Dockerfile

FROM node:22-alpine

WORKDIR /app

COPY package*.json ./

RUN npm ci --omit=dev

COPY . .

ENV NODE_ENV=production

EXPOSE 8080

CMD ["npm", "start"]

สร้าง .dockerignore

node_modules
npm-debug.log
.git
.gitignore
README.md

ทดสอบ Container ในเครื่อง:

docker build -t cloud-run-api .
docker run --rm -p 8080:8080 cloud-run-api

จากนั้น:

curl http://localhost:8080/api/health

#7. สร้าง Artifact Registry

Artifact Registry ใช้เก็บ Container Image

gcloud artifacts repositories create $REPOSITORY \
  --repository-format=docker \
  --location=$REGION \
  --description="Container images for Cloud Run workshop"

ตรวจสอบ:

gcloud artifacts repositories list

Image URI ที่เราจะใช้มีรูปแบบ:

REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE

ตัวอย่าง:

asia-southeast1-docker.pkg.dev/my-project/cloud-run-demo/hello-api

#8. Build และ Push Image ด้วย Cloud Build

gcloud builds submit \
  --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/$SERVICE:v1

Cloud Build จะ build จาก Dockerfile และจัดเก็บ image ใน Artifact Registry

ตรวจสอบ image:

gcloud artifacts docker images list \
  $REGION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY

#9. Deploy ไปยัง Cloud Run

gcloud run deploy $SERVICE \
  --image $REGION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/$SERVICE:v1 \
  --region $REGION \
  --platform managed \
  --allow-unauthenticated

เมื่อสำเร็จจะได้ HTTPS Service URL

ดู URL:

gcloud run services describe $SERVICE \
  --region $REGION \
  --format="value(status.url)"

ทดสอบ:

SERVICE_URL=$(gcloud run services describe $SERVICE \
  --region $REGION \
  --format="value(status.url)")

curl $SERVICE_URL
curl $SERVICE_URL/api/health
curl $SERVICE_URL/api/products

#10. Environment Variables

เพิ่มตัวแปร:

gcloud run services update $SERVICE \
  --region $REGION \
  --set-env-vars APP_NAME="Production Cloud Run API"

ทดสอบอีกครั้ง:

curl $SERVICE_URL

สำหรับ password, API key หรือ credential ไม่ควรเก็บเป็น plain environment variable ใน workflow จริง ควรใช้ Secret Manager และกำหนด IAM ตามหลัก least privilege

#11. Auto Scaling

กำหนดจำนวน instance สูงสุด:

gcloud run services update $SERVICE \
  --region $REGION \
  --max-instances 10

หากต้องการลด cold-start สำหรับ workload ที่ต้องตอบสนองเร็ว สามารถพิจารณา minimum instances:

gcloud run services update $SERVICE \
  --region $REGION \
  --min-instances 1

การตั้ง minimum instances อาจมีผลต่อค่าใช้จ่าย จึงควรเลือกตาม SLA และ traffic pattern

#12. Private Cloud Run Service

Production API หลายกรณีไม่ควรเปิด anonymous access

ตัวอย่าง deploy แบบ private:

gcloud run deploy $SERVICE \
  --image $REGION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/$SERVICE:v1 \
  --region $REGION \
  --no-allow-unauthenticated

การเรียก private service ต้องใช้ identity ที่ได้รับสิทธิ์ Cloud Run Invoker และส่ง identity token ที่เหมาะสม

ตัวอย่างสำหรับผู้ใช้ที่มีสิทธิ์:

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  $SERVICE_URL/api/health

#13. Deploy Version ใหม่

แก้ไข source code แล้ว build v2

gcloud builds submit \
  --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/$SERVICE:v2

Deploy:

gcloud run deploy $SERVICE \
  --image $REGION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/$SERVICE:v2 \
  --region $REGION

Cloud Run สร้าง Revision ใหม่เมื่อมี deployment/configuration ที่เปลี่ยนแปลง ทำให้สามารถจัดการ revision และ traffic ได้โดยไม่ต้องจัดการ server เอง

ดู revisions:

gcloud run revisions list \
  --service $SERVICE \
  --region $REGION

#14. Deploy จาก Source โดยตรง

Cloud Run รองรับการ deploy source โดยไม่ต้อง build/push image เองทุกขั้นตอน

gcloud run deploy hello-api-source \
  --source . \
  --region $REGION \
  --allow-unauthenticated

ถ้ามี Dockerfile Cloud Run สามารถใช้ Dockerfile ในขั้นตอน build; หากไม่มี สามารถใช้ buildpacks ตาม workflow ที่รองรับ

#15. CI/CD Architecture

สามารถต่อยอด GitHub Actions ได้ดังนี้

Developer
   |
   v
GitHub Repository
   |
   v
GitHub Actions
   |
   +--> Authenticate to Google Cloud
   |
   +--> Build Container
   |
   +--> Push Artifact Registry
   |
   +--> Deploy Cloud Run
   |
   v
Cloud Run Revision

สำหรับ production ควรใช้ Workload Identity Federation แทนการเก็บ service-account key แบบ long-lived ใน GitHub Secrets

#16. Observability

Cloud Run เชื่อมต่อกับบริการ observability ของ Google Cloud ได้ เช่น logging และ monitoring

ตัวอย่างดู log:

gcloud run services logs read $SERVICE \
  --region $REGION

Application ควรเขียน log ไปยัง stdout/stderr เพื่อให้ platform รวบรวม log ได้ง่าย

#17. Cleanup

ลบ Cloud Run Service:

gcloud run services delete $SERVICE \
  --region $REGION

ลบ Artifact Registry Repository:

gcloud artifacts repositories delete $REPOSITORY \
  --location=$REGION

ตรวจสอบ resource และ billing หลัง Workshop เสมอ โดยเฉพาะ resources ที่ไม่ได้ scale-to-zero หรือ storage artifacts ที่ยังคงอยู่

#สรุป

Workflow หลักของ Workshop คือ:

REST API
   ↓
Dockerfile
   ↓
Cloud Build
   ↓
Artifact Registry
   ↓
Cloud Run
   ↓
HTTPS REST API

Cloud Run ช่วยลดภาระด้าน infrastructure เหมาะกับ REST API และ Microservices ที่ต้องการ deployment แบบ container พร้อม HTTPS, revision management และ automatic scaling โดยไม่ต้องบริหาร VM หรือ Kubernetes cluster โดยตรง

#แนวทาง Workshop ต่อไป

หัวข้อที่เหมาะสำหรับต่อยอด:

  1. Cloud Run + Cloud SQL
  2. Cloud Run + Secret Manager
  3. Cloud Run + GitHub Actions
  4. Cloud Run + Workload Identity Federation
  5. Cloud Run + API Gateway
  6. Cloud Run + Custom Domain
  7. Cloud Run + Terraform
  8. Cloud Run Jobs สำหรับ Batch Processing
  9. Cloud Run สำหรับ AI/LLM API
  10. Canary/Traffic Splitting ระหว่าง Revisions

#เอกสารอ้างอิง