- Step 1: 建立 Docker image 並上傳到 GCP Artifact Registry
- Step 2: 部署 Cloud Run 並設定 Security
- Step 3: 確認 IAM permission
- Step 4: 取得 ID Token
- 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 就可以不用這一步)
gcloud auth configure-docker gcr.io
2. 建立 Docker Image 並推送到 GCP Artifact Registry
docker build --platform linux/amd64 -t gcr.io/my-gcp-project/service-name .
docker push gcr.io/my-gcp-project/service-name
--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
# 1. 先登入帳號
gcloud auth login
# 2. 取得可以執行 Cloud Run 的 Token
gcloud auth print-identity-token
Step 5: 將 token 帶入 Request Headers
只要在 Headers 中加入那長長一串的 ID Token,就可以來呼叫 Cloud Run Service 了
{
"Authorization": "Bearer <id_token>",
}
若你的 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