【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

        在 Cloud Run 總覽頁勾選剛剛部署的 Service,會出現 Permissions 這個選項(注意:這邊不是點 Service 名稱進去,是勾選名稱旁的核取方塊就好)

        接著可以點擊「+ ADD PRINCIPAL」新增需要權限的帳戶/Gmail,給予 Cloud Run Invoker 這個 role,只要有這個權限就可以呼叫 Cloud Run Service(此步驟需要 Project Owner 權限的人來操作)

        Step 4: 取得 ID Token

        在地端開發時,要先使用 gcloud 指令登入有被開權限的帳號,才能取得 ID Token

        Step 5: 將 token 帶入 Request Headers

        只要在 Headers 中加入那長長一串的 ID Token,就可以來呼叫 Cloud Run Service 了

        若你的 Headers 中已經有 Authorization 的話,你可以改成使用 X-Serverless-Authorization 這個名稱 (ref: [GCP] Acquire and configure the ID token)

        例如以下的 Python 程式碼範例,Authorization 被其他外部 Token 佔用,所以 Cloud Run 的身份驗證就改用 X-Serverless-Authorization

        import requests
        
        headers = {
            "X-Serverless-Authorization": "Bearer <id_token>",
            "Authorization": "Bearer <external_token>",
        }
        
        # Endpoints must have slash after, # e.g. /health/
        url = "<https://my-cloud-run-service.asia-east1.run.app/health/>"
        response = requests.get(url, headers=headers)
        print(response.status_code)  # 200
        
        

        發表留言