- Architecture
- สิ่งที่จะได้เรียนรู้
- 1. เตรียมเครื่องมือ
- 2. กำหนดตัวแปรสำหรับ Workshop
- 3. เปิดใช้งาน Google Cloud APIs
- 4. สร้าง REST API
- 5. ทดสอบ REST API ในเครื่อง
- 6. สร้าง Dockerfile
- 7. สร้าง Artifact Registry
- 8. Build และ Push Image ด้วย Cloud Build
- 9. Deploy ไปยัง Cloud Run
- 10. Environment Variables
- 11. Auto Scaling
- 12. Private Cloud Run Service
- 13. Deploy Version ใหม่
- 14. Deploy จาก Source โดยตรง
- 15. CI/CD Architecture
- 16. Observability
- 17. Cleanup
- สรุป
- แนวทาง Workshop ต่อไป
- เอกสารอ้างอิง
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 ต่อไป
หัวข้อที่เหมาะสำหรับต่อยอด:
- Cloud Run + Cloud SQL
- Cloud Run + Secret Manager
- Cloud Run + GitHub Actions
- Cloud Run + Workload Identity Federation
- Cloud Run + API Gateway
- Cloud Run + Custom Domain
- Cloud Run + Terraform
- Cloud Run Jobs สำหรับ Batch Processing
- Cloud Run สำหรับ AI/LLM API
- Canary/Traffic Splitting ระหว่าง Revisions
#เอกสารอ้างอิง
- Google Cloud Run Documentation: https://cloud.google.com/run/docs
- Deploy container images: https://cloud.google.com/run/docs/deploying
- Artifact Registry + Cloud Run: https://cloud.google.com/artifact-registry/docs/integrate-cloud-run
- Cloud Run container contract: https://cloud.google.com/run/docs/container-contract