利用Google Cloud Run 實現自動部屬
Tech ·
Cloud Run 的特點
-
無伺服器架構:
- 無需手動管理伺服器,Google 負責所有基礎設施的運行、維護與擴展。
-
容器化應用支援:
- Cloud Run 依賴 Docker 容器,開發者只需確保應用能在容器內正常運行,即可將其部署到平台。
-
自動擴展:
- 隨著請求量增減,Cloud Run 會自動調整應用程式的實例數量,確保應用能夠即時回應高流量需求,同時在低流量時節省資源。
-
按需計費:
- 用戶只需支付實際使用的運行時間,無需為閒置的資源付費。 Cloud Run 會根據接收到的請求來計算使用量。
-
多語言支援:
- Cloud Run 並不限制開發語言,只要應用程式能打包成 Docker 容器並符合 HTTP/HTTPS API 的請求協定,即可部署。
-
整合 Google Cloud 服務:
- Cloud Run 可以輕鬆與其他 Google Cloud 服務(如 Cloud Pub/Sub、Cloud SQL、Cloud Storage)整合,實現更強大的後端功能。
實作步驟
本篇實作步驟以django作為範例
1.撰寫Dockerfile
# 使用官方的 Python 基本映像
FROM python:3.12
# 設定工作目錄
WORKDIR /app
# Install necessary dependencies
RUN apt-get update && apt-get install -y \
cmake \
build-essential \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y \
libgl1 \
libglib2.0-0
# 複製 requirements.txt 並安裝 Python 套件
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 複製 Django 應用程式
COPY . .
# 設定環境變數
ENV PORT 8000
ENV PYTHONUNBUFFERED TRUE
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
2.登入 google cloud 控制台 新建專案
3.到 API程式庫 啟用 Cloud Run Admin API 及 Cloud Build API
4. 選取專案 切換至cloud run 功能 新建一個服務

5.進入服務設定介面
5.1 選擇 從存放區持續部署 (原始碼或函式)
5.2 按下透過 CLOUD BUILD 設定按鈕出現右側選單
5.3 按下管理以連結的存放區 選擇想要部屬的repositry
5.4 存放區下拉選單選擇該repositry 之後按下一步
5.5 選擇分支 及建構類型為Dockerfile 按下儲存
5.6 設定容器的通訊埠
這邊對應的是dockerfile 啟動 django的port
5.7 資源選擇記憶體 32 GiB 及 CPU 8
5.8設定os的env變數
範例專案中有使用到 SPOTIFY_CLIENT_ID 及SPOTIFY_CLIENT_SECRET
settings.py
SPOTIFY_CLIENT_ID = os.getenv('SPOTIFY_CLIENT_ID')
SPOTIFY_CLIENT_SECRET = os.getenv('SPOTIFY_CLIENT_SECRET')
5.9 執行個體數量上限輸入62
5.10 按下建立按鈕
6.開始部屬
7.部屬完成
django網頁
Cloud Run 與 Compute Engine 比較
- 架構與管理層級
- Cloud Run:屬於無伺服器 (Serverless) 架構,完全托管。不需要手動配置或管理底層的基礎設施。開發者只需將應用程式包裝成容器,Cloud Run 會自動處理資源分配和調度,並根據流量需求進行自動縮放。
- Compute Engine:是 IaaS (Infrastructure as a Service) 服務,提供虛擬機器(VM),需要用戶手動管理基礎設施。這包括配置 CPU、內存、磁碟等資源,並需要自行處理擴展、更新、安全補丁等維護工作。
- 自動化與擴展
- Cloud Run:完全自動擴展,基於請求量動態增加或減少容器實例數。無需配置相關的擴展規則,並且無流量時自動縮容到 0,因此特別適合應對不規則或突發性流量。
- Compute Engine:需要手動配置自動擴展規則(如使用「自動擴展」功能)。雖然 Compute Engine 支援自動擴展,但仍需明確設置擴展策略,例如根據 CPU 使用率或請求數來觸發擴展。
- 靈活性
- Cloud Run:適合運行以容器為基礎的應用程式,並且對於需要 HTTP/HTTPS 請求觸發的應用(如 API、微服務)非常便捷。不過,它對於系統層面的自定義能力有限,並且只能運行基於 stateless(無狀態)的應用。
- Compute Engine:提供完全的虛擬機存取權限,因此可以運行任何自定義軟體或系統服務,並支援更複雜的部署,例如 stateful(有狀態)的應用、資料庫等。
- 成本計算
- Cloud Run:按需計費,根據實際請求處理的運行時間(CPU 和內存使用量)計費,並且應用程式在沒有流量時不會產生費用。因此對於變動流量應用非常經濟。
- Compute Engine:按 VM 實例的使用時間計費,無論是否有流量,VM 都會持續運行,因此會一直產生費用。可以通過配置「預留虛擬機」或使用「停機」模式來節省成本。
- 啟動時間
- Cloud Run:容器啟動時間非常短,並且可以根據流量自動啟動新的容器實例,適合需要快速響應的應用。
- Compute Engine:啟動一個新的 VM 可能需要幾分鐘,特別是當系統負載較重時,啟動速度會有所延遲。
- 使用場景
- Cloud Run:適合簡單的微服務架構、無伺服器 API 後端、事件驅動的應用程式,以及需要自動縮放和按需計費的應用。典型使用場景包括處理 HTTP 請求、文件處理、資料轉換等任務。
- Compute Engine:適合需要完整控制虛擬機環境的應用,如運行自定義軟體、處理大型數據集、搭建資料庫伺服器、複雜的企業應用程式或 stateful 的應用程式。
- 整合性
- Cloud Run:可以輕鬆與 Google Cloud 的其他無伺服器產品(如 Cloud Functions、Pub/Sub、Firestore 等)進行整合,構建事件驅動的應用系統。
- Compute Engine:支援與 Google Cloud 全部服務的整合,但由於其靈活性,通常用來構建需要更多控制和資源的應用,如大型資料分析、機器學習等。
結論:
Google Cloud Run 更適合快速開發、部署,並需要隨著流量動態調整資源的應用,尤其是無伺服器架構的微服務和事件驅動應用。然而,由於是無伺服器架構,Cloud Run 會有 冷啟動 的情況:當容器沒有運行且接收到新請求時,系統會啟動新的容器,這可能導致延遲。冷啟動通常只發生在流量較低或無流量時,而對於穩定的高流量應用,冷啟動影響較小。
Google Compute Engine 則適合需要完整掌控虛擬機環境的大型應用或複雜系統,特別是那些需要持續運行、有狀態、以及自定義配置的應用程式。由於虛擬機長期運行,沒有冷啟動的問題,但維護成本和手動擴展管理會相對較高。