【GCP】如何建立與使用一個具有 IAM 權限控管的 Cloud Run Service

  1. Step 1: 建立 Docker image 並上傳到 GCP Artifact Registry
  2. Step 2: 部署 Cloud Run 並設定 Security
  3. Step 3: 確認 IAM permission
  4. Step 4: 取得 ID Token
  5. Step 5: 將 token 帶入 Request Headers

本文說明如何建立一個有鎖 IAM 權限的 GCP Cloud Run Service/Job 並使用 Python 送 Request

Step 1: 建立 Docker image 並上傳到 GCP Artifact Registry

1. 先使用 gcloud 指令進行身份驗證

    登入並授權 gcr.io,才能順利將 image 下載到本機(如果是直接使用 GCP Cloud Shell 就可以不用這一步)

      2. 建立 Docker Image 並推送到 GCP Artifact Registry

        • --platform linux/amd64: 如果是在非 linux 的作業系統(如:MacOS, Windows)中進行 image build 就需要另外指定 image 系統,不然會無法在 Cloud Run 上順利運行

        Step 2: 部署 Cloud Run 並設定 Security

        前往 GCP Artifact Registry 找到剛剛推上去的 Image,並將 image 部署到 Cloud Run(點擊如下圖的 Deploy to Cloud Run)

        部署後可以在該 Cloud Run Service 的 Security 頁面看到預設是 Require authentication (Manage authorized users with Cloud IAM),代表只有 IAM 許可的人可以呼叫這個 Service

        Step 3: 確認 IAM permission

        閱讀更多»

        如何使用 Python 套件管理工具「uv」取代 pip 來加速 Docker Image 的建立

        1. 前言
        2. 什麼是 uv?
        3. uv 的使用方法
          1. 本機
          2. Dockerfile
        4. 實測檔案
          1. Dockerfile Using pip
          2. Dockerfile Using uv
          3. requirements.txt
        5. Linux Ubuntu 上進行 docker build
          1. 使用 pip = 87.6 秒
          2. 使用 uv = 33.3 秒
        6. GCP Cloud Shell 上進行 docker build
          1. 使用 pip = 20.1 秒
          2. 使用 uv = 11.7 秒
        7. 總結

        前言

        在 Build Docker Image 的時候,通常最花時間的都是安裝套件,為了突破這個效能瓶頸,這次決定嘗試使用 uv 來取代 pip 進行 Python 套件的安裝。

        什麼是 uv?

        uv 是一個以 Rust 撰寫的 Python 套件管理工具,號稱比 pip 還要快 10-100 倍,國外也有相關實測,像是 Streamlit 在 2024 年 7 月就有發 blog 表示他們用 uv 取代 pip 後速度提升了 55%(如圖 1)。

        (2025/05更新)
        近期發現開始有開源專案的官網文件也已經預設是使用 uv 來安裝,例如 Prefect(如圖 2)。

        之前我也有在本機實測過,確實有非常顯著地提升了效能,而這次我打算將 uv 運用在 Docker 上,讓 Docker image 的建立時間能大幅縮減。

        圖 1:Streamlit 用 uv 取代 pip 後速度提升了 55%
        圖 2:開源專案 Prefect 的官網也已經預設是使用 uv 來安裝

        uv 的使用方法

        閱讀更多»

        優化 R Docker image 的建立與部署:套件安裝速度提升與節省空間技巧

        1. 前言
        2. 建立 Docker image 時遇到的瓶頸
        3. Step 1:優化安裝套件的速度
          1. 改用 Precompiled 版本的套件 -> 安裝速度提升 8.6 倍
        4. Step 2:優化 Docker image size
          1. 用 r-ver 取代 tidyverse -> 節省 image size 約 2.8 倍
          2. 使用 Multi-stage Builds:兩階段相同 image -> 沒有太大改變
          3. 使用 Multi-stage builds:第二階段改 ubuntu -> 成功縮減 2 倍 image size
        5. 總結
        6. 後記

        前言

        近期遇到有部分 R Script 執行時佔用太多 VM 記憶體,所以打算把 R 打包成一個 Docker image,讓他可以在 GCP Cloud Run 上面跑,解放 VM 的資源。

        首先我建立了一個基於 tidyverse 的 Dockerfile,安裝常用的兩個套件,並讓這個 image 可以由外部提供一個 JOB_NAME 參數,來動態指定要執行的檔案。
        (選擇 tidyverse 的原因是使用 r-base 時會遇到無法安裝 bigrquery 的問題)

        FROM rocker/tidyverse:4.4.1
        
        RUN R -e "install.packages(c('dplyr', 'bigrquery'), repos='<http://cran.rstudio.com/>')"
        
        COPY r_jobs /r_jobs
        
        CMD ["sh", "-c", "Rscript /r_jobs/$JOB_NAME"]
        
        

        建立 Docker image 時遇到的瓶頸

        雖然這個 image 是可以正常執行,但 docker build 後發現兩個大問題:

        • Docker image 太胖!
          • image 竟然有 2.5 GB 這麼大,這將會造成部署與存放上的問題。
        • R 套件安裝太慢!
          • 光是安裝兩個套件的步驟,就要花 5 分鐘,安裝 12 個套件需要 20 分鐘(如下圖 1,203 秒),時間成本太高。

        基於這兩個問題我開始研究 Docker image 的優化方法。

        閱讀更多»