Skip to main content

รู้จักกับ Cloud Run

Step ต่อไป เราจะเริ่มนำ docker image ขึ้น cloud กันบ้าง จากแต่เดิมที่ทดสอบ build กันภายในเครื่องอย่างเดียว โดย Product ของ Google Cloud Platform (GCP) นั้นมี Product ตัวหนึ่งคือ Artifact Registry ที่สามารถเก็บ image ของ Docker ไว้บน Cloud ได้

ไอเดียของเราตอนนี้คือ

  • เราจะนำ docker image ขึ้น Cloud ไปไว้บน Artifact Registry
  • หลังจากนั้น เราจะทำการสร้างเครื่อง 1 เครื่องเป็น container ขึ้นมาผ่าน Cloud Run (Service ที่สามารถหยิบ Docker image บน cloud ไป deploy ได้ผ่าน Artifact Register)
  • ทำการ setting environment ทั้งหมดบน Cloud run และถ้าทุกอย่างไม่มีปัญหา เราจะได้ web application go ผ่าน Cloud run ออกมาได้

เราจะมาทำความรู้จักไปทีละตัว และทำไปทีละ step กัน

Artifact Registry คืออะไร ?

Ref: https://cloud.google.com/artifact-registry/docs/overview

Artifact Registry คือ managed service ของ GCP ที่อนุญาตให้เราสามารถเก็บ, จัดการตัว software artifact ของเราเอาไว้ได้

software artifact คือ คำที่หมายรวมถึงการรวมไฟล์ใดๆที่สร้างมาเป็นกลุ่มของไฟล์ที่สามารถนำมาทำเป็นผลลัพธ์ของตัว software ออกมาได้ ซึ่งโดยปกติจะหมายรวมถึง source code, binary file (file ที่ผ่านการ compiled code แล้ว), documentation, libraries, container รวมถึงไฟล์ configuration.

อย่างในเคสที่เรากำลังจะทำนี้คือ ผลลัพธ์ของ software ที่เกิดจาก Dockerfile ซึ่งเป็น image ที่เกิดขึ้นจากการ build docker image ขึ้นมา

ซึ่งจริงๆ ตัว Artifact Registry นั้น support file หลายประเภทมากตามภาพนี้

cloudrun-11

โดยจุดเด่นๆของตัว Artifact Registry นั้นจะมี

  1. Multi-format support ซึ่งตามภาพที่เห็นเลย support การเก็บไฟล์หลากหลายประเภทมากตั้งแต่ Docker Image, Maven and Gradle packages, npm package รวมถึง go package เป็นต้น (แต่ว่าเคสนี้ที่ขอแนะนำเป็น Docker เนื่องจากให้ในอนาคต ถ้าเรามีการเปลี่ยนตัว server ยังคงสามารถนำ Docker image ตัวนี้ไปใช้ต่อได้)

  2. ใช้งานร่วมกับ GCP ได้ เหมือนๆกับ Cloud SQL support การใช้งานร่วมกับ service อื่นๆของ GCP ได้ เช่น Google Kubernetes Engine (GKE), Cloud Build (for CI/CD pipelines), and IAM (Identity and Access Management) สำหรับการจัดการ Security และ access

  3. มี Security feature ให้พร้อม Artifact Registry ได้เตรียม security feature อย่าง VPC Service Controls และ support customer-managed encryption keys (CMEK)

  4. Versioning support การทำ version แยกแต่ละอันของ artifacts ได้ (ผ่าน tag) เพื่อใช้สำหรับจัดการผ่าน lifecycle policies เพื่อใช้สำหรับจัดการ version เก่าๆ หลังจากที่มีการใช้ deploy ไปแล้วได้

นี่คือจุดเด่นใหญ่ๆของ Artifact Registry ใช้สำหรับ software process เพื่อเป็นการใช้งานร่วมกันระหว่าง development และ deployment process โดยการเก็บ artifact นี้เป็นการเก็บเพื่อให้สามารถนำ artifact ไปใช้ deployment process ต่อได้

นำ docker image ขึ้น Artifact Registry

เริ่มต้น เราจะต้องทำการสร้าง Repository สำหรับการนำ docker image เข้าไปใน Artifact Registry (เป็นเหมือนการสร้าง folder สำหรับการเก็บ image เอาไว้) โดยการกด "+" จากหน้า Artifact Registry และสามารถตั้งชื่อและเลือกประเภทเป็น Docker มาได้เลย

cloudrun-13

cloudrun-14

หลังจากกด Create มาก็จะได้ Repository ขึ้นมาตามชื่อที่กำหนดไว้ ซึ่งเดี๋ยวชื่อนี้เราจะทำการกำหนดผ่าน path ของ image เพื่อเป็นเส้นทางให้ docker สามารถ push image ขึ้นมาได้

cloudrun-15

หลังจากนั้นให้เราจะทำการ install gcloud command เพื่อให้สามารถใช้งานคำสั่งเพื่อ push image จาก docker เข้า Artifact Registry ได้ (วิธีลง สามารถดูจากบทความที่ Reference นี้ได้ https://cloud.google.com/artifact-registry/docs/docker/pushing-and-pulling)

เมื่อทุกอย่างลงเรียบร้อย ต้องสามารถใช้คำสั่ง gcloud --version และได้ผลลัพธ์ประมาณนี้ออกมาได้

cloudrun-12

หลังจากนั้น ใช้คำสั่งนี้เพื่อเป็นการ save credentials เข้าไปใน docker

gcloud auth configure-docker asia-southeast1-docker.pkg.dev

เพื่อให้เกิดความง่าย เราจะทำการ build docker ด้วยชื่อใหม่ เพื่อให้สามารถใช้ชื่อ image ในการ push ขึ้น Artifact Register เข้าไปได้

# คำสั่ง
docker build -t asia-southeast1-docker.pkg.dev/<ชื่อ project>/<ชื่อ repository artifact>/<ชื่อ image> .

# ตัวอย่าง
docker build -t asia-southeast1-docker.pkg.dev/easy-commerce-workshop/go-deploy/go-test-deploy .

หลังจากนั้น ทำการ push image เข้าไป

# คำสั่ง
docker push asia-southeast1-docker.pkg.dev/<ชื่อ project>/<ชื่อ repository artifact>/<ชื่อ image>

# ตัวอย่าง
docker push asia-southeast1-docker.pkg.dev/easy-commerce-workshop/go-deploy/go-test-deploy

เมื่อยิงคำสั่ง docker push ไปจะเป็นการส่ง image จาก local เข้า Artifact Registry เข้าไป ถ้าผลลัพธ์ออกมาถูกต้อง จะขึ้นว่า push image success และได้ผลลัพธ์ image แสดงบน Artifact Register ออกมาได้

cloudrun-16

Cloud run คืออะไร ?

Ref: https://cloud.google.com/run/docs/overview/what-is-cloud-run

cloudrun-01

Cloud run คือ fully managed compute platform ของ GCP ที่อนุญาตให้เราสร้าง container แบบ "stateless" ออกมาได้ ซึ่งสามารถเรียกใช้งานผ่าน web request หรือ HTTP request ได้ ซึ่งเป็นการ built อยู่บนของ Kubenetes และ Knative ของ Google Cloud

คำว่า stateless container หมายถึง container application ที่ไม่มีการ save data ใดๆเอาไว้ภายใน container (เป็นแค่ container ที่ใช้สำหรับ runsoftware ออกมาเท่านั้น) โดยปกติแล้ว application อย่าง web service ควรจะเป็น stateless เพื่อให้เวลาที่หยิบ container นี้ไปทำ horizontal scale จะได้ไม่จำเป็นต้องกังวลเรื่องของ state ภายใน container ว่าตอนนี้ต้องเก็บข้อมูลอะไรไว้ก่อนถึงจะทำได้ รวมถึงสามารถกระจายตัว container แบบ horizontal scale ได้ทันทีด้วยเช่นกัน

จุดเด่นใหญ่ๆของ Cloud run คือ สามารถนำ image มา deploy งานได้ทันที และสามารถทำ scale แบบ horizontal scale ได้จากการปรับเพียงแค่ config ของ Cloud run แค่นั้นก็จะสามารถทำการ scale ทั้ง vertical scale และ horizontal scale ออกมาได้

จุดเด่นตัวอื่นๆก็จะคล้ายๆกับ Cloud SQL และ Artifact Registry

  • ใช้งานร่วมกับ Service อื่นๆของ GCP ได้
  • มี feature security ที่สามารถจัดการร่วมกับ Network ได้

deploy image บน Cloud run

Ref: https://cloud.google.com/run/docs/deploying

เราจะมาเร่ิม Deploy งานที่ Cloud run กันเริ่มต้น หลังจากที่มีการ push image ไปเรียบร้อย ให้เข้ามาสู่หน้าจอของ Cloud run แล้วกด "Create Service" > "Select" เพื่อเลือก image ที่ต้องการ deploy (ซึ่งก็คือ image ที่มีการ push เอาไว้ภายใน service ของ Artifact Registry)

cloudrun-02

cloudrun-03

หลังจากนั้นทำการ setup จำนวน instance ที่ต้องการทำ AutoScaling (แนะนำว่าสำหรับทดลอง ให้เลือกเป็น 1 instance ทั้งคู่ ส่วนถ้าจะ deploy งานจริงๆ ให้ Autoscaling ตามความเหมาะสมอีกที)

cloudrun-04

หลังจากนั้นให้เลือก "Allow unauthenticated invocations" เพื่อทำการเปิดเป็น Public API ออกมา

cloudrun-05

ทำการระบุ Port ที่ต้องการเชื่อมเข้าไปยังภายใน container (อย่างเคสนี้เราทำการเปิดที่ Port 8000 เอาไว้ ก็ทำการใส่เป็น Port 8000)

cloudrun-06

จากนั้นทำการใส่ ENV ของ Cloud SQL เข้าไป โดย

  • ส่วนของ DB_HOST ให้เปลี่ยนจาก Public IP (ที่เคยทดลองใส่ใน GORM บน local) เปลี่ยนเป็น /cloudsql/<cloud sql endpoint>
  • โดย <cloud sql endpoint> นั้นจะมีการระบุตอนที่มีการเลือก Cloud SQL ด้านล่าง (ตามภาพด้านล่างนี้) ให้นำ endpoint ตรงนั้นมาใส่ได้เลย (และทำการเลือก Cloud SQL connections เป็น Cloud SQL ตัวที่เราสร้างไว้) cloudrun-07

cloudrun-08

เมื่อทุกอย่าง setting เรียบร้อยให้ทำการกด สร้าง Service หากไม่มีปัญหาอะไร จะสามารถ run Service ออกมาได้

cloudrun-09

เมื่อทำการทดสอบยิง API Request ผ่าน endpoint ของ Cloud Run หากได้ผลลัพธ์มาเป็นแบบเดียวกับที่ local ออกมาได้ = ยินดีด้วย การ Deploy Go Application service ถือว่าเสร็จสิ้นเรียบร้อย

cloudrun-10

** เพิ่มเติม

  • ในส่วนของ Cloud run นั้นสามารถ setup ตัว CD สำหรับการ Deploy ได้จากการ Trigger ผ่าน git (เช่นจาก Github) สามารถ setup ได้จาก “Setup Continous deploy” (สามารถกดเข้าไป setup และทำตามขั้นตอนได้เลย แต่จะใช้เวลาในการ setting นานหน่อย)