Cloud Build (第 1 代) 的自訂服務帳戶
建構及部署 Cloud Run 函式時,Cloud Run 函式會運用 Cloud Build。根據預設,Cloud Run 函式會在執行建構作業時,使用預設的 Cloud Build 服務帳戶做為主體。自 2024 年 7 月起,Cloud Build 已變更新專案中服務帳戶的預設使用方式。如要瞭解這項異動的詳細資訊,請參閱「Cloud Build 服務帳戶異動」。這項異動會導致新專案首次部署函式時,可能使用權限不足的預設 Cloud Build 服務帳戶建構函式。如果這項異動對您造成影響,請採取下列任一做法:
參閱 Cloud Build 指南,瞭解預設服務帳戶異動,並選擇不採用這些異動。
將 Cloud Build 帳戶角色 (
roles/cloudbuild.builds.builder) 新增至預設的 Compute Engine 服務帳戶。為函式部署作業建立自訂 Cloud Build 服務帳戶。
本文說明如何傳遞使用者建立的服務帳戶,供 Cloud Build 在部署函式時使用。
您可以使用 Google Cloud CLI、Google Cloud 控制台或 Cloud Run 函式 API,部署具有自訂服務帳戶的函式。
如果您遇到以下列出的幾個情況,就可能需要提供其他服務帳戶,供 Cloud Build 建構函式時使用:
您希望進一步控管要新增至 VPC-SC perimeter 的服務帳戶。
您希望 Cloud Build 使用與預設服務帳戶不同的權限執行作業,而不必個別撤銷每項權限。
您想為函式設定精細的 Cloud Build 權限,而不是共用依據其他用途最佳化的 Cloud Build 服務帳戶。
貴組織已停用預設服務帳戶。
啟用 API
這項功能需要啟用 IAM API。
使用 Google Cloud CLI 啟用部署 Cloud Run 函式所需的 API,或使用 Google Cloud 控制台:
gcloud services enable iam.googleapis.com
設定服務帳戶
本文說明如何建立新的服務帳戶,並授予必要權限。如要使用現有服務帳戶,您需要預劃使用的服務帳戶電子郵件地址。詳情請參閱「設定使用者指定的服務帳戶」。
您可以按照下列方式查看現有服務帳戶,或使用Google Cloud 控制台:
gcloud iam service-accounts list
建立服務帳戶
使用 Google Cloud CLI 建立服務帳戶,或使用 Google Cloud 控制台:
gcloud iam service-accounts create SA_EMAIL
將 SA_EMAIL 替換為服務帳戶的電子郵件地址。
授予權限
您使用的服務帳戶必須具備下列角色:
roles/logging.logWriter:將建構記錄儲存在 Cloud Logging 時需要這個角色。roles/artifactregistry.writer:將建構的映像檔儲存至 Artifact Registry 時需要這個角色。如要使用預設行為,服務帳戶必須有權存取名為「gcf-artifacts」和「cloud-run-source-deploy」的存放區。您可以在存放區的 IAM 政策中設定存放區的存取權,也可以透過dockerRepository欄位提供自己的構件存放區。roles/storage.objectViewer:從 Cloud Storage bucket 擷取函式原始碼,以及在 Container Registry 中儲存建構映像檔時,需要這個角色。根據預設行為,服務帳戶必須有權存取名為「gcf-sources-*」的 bucket。如要達成此目標,請在角色授權中新增 IAM 條件,例如:(resource.type == "storage.googleapis.com/Object" && (resource.name.startsWith("gcf-sources-")))roles/storage.objectAdmin:容器登錄 (現已淘汰) 必須使用此設定。需要存取名為*.artifacts.PROJECT_ID.appspot.com的 buckets,才能存取容器登錄。
使用 Google Cloud CLI 授予下列角色,或使用Google Cloud 控制台。
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
--role=roles/logging.logWriter
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
--role=roles/artifactregistry.writer
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
--role=roles/storage.objectViewer
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
--role=roles/storage.objectAdmin
更改下列內容:
- PROJECT_ID:您的 Google Cloud 專案 ID。
- SA_EMAIL:服務帳戶的電子郵件地址。
VPC Service Controls 注意事項
如果您有 VPC Service Controls perimeter,可同時保護專案和 Cloud Run Functions API,且您使用 Compute Engine 預設服務帳戶做為 Cloud Run Functions 的 Cloud Build 服務帳戶角色,則必須建立下列輸入規則:
- 允許 Compute Engine 預設服務帳戶對 Cloud Storage 和 Cloud Logging API 的所有方法進行輸入。
- 允許服務帳戶
service-[PROJECT_NUMBER]@gcf-admin-robot.iam.gserviceaccount.com對 Cloud Storage 和 Cloud Logging API 的所有方法進行輸入。
使用自訂服務帳戶部署函式
您可以使用 Google Cloud CLI 部署函式,並為 Cloud Build 使用自訂服務帳戶:
--build-service-account旗標會指定 IAM 服務帳戶,其憑證將用於建構步驟。如未提供自訂服務帳戶,函式會使用專案的 Cloud Build 預設服務帳戶。- 您可以選擇使用私人集區,請用
--build-worker-pool旗標指定。
gcloud functions deploy FUNCTION_NAME \
--no-gen2 \
--region=REGION \
--project=PROJECT_ID \
--runtime=RUNTIME \
--entry-point=CODE_ENTRYPOINT \
--build-service-account=projects/PROJECT_ID/serviceAccounts/SA_EMAIL \
--memory=256Mi \
--trigger-http \
--source=.
更改下列內容:
- FUNCTION_NAME:部署函式時使用的名稱。
- REGION:要部署函式的 Google Cloud 區域名稱 (例如
us-west1)。 - PROJECT_ID:您的 Google Cloud 專案 ID。
- RUNTIME:用來執行函式支援執行階段版本的執行階段 ID,例如
nodejs18。 - CODE_ENTRYPOINT:原始碼中函式的進入點。這是函式執行時會執行的程式碼。
- SA_EMAIL:服務帳戶的電子郵件地址。