如果您未指定服務帳戶,Cloud Build 可能會自動選取服務帳戶,代您執行建構作業。這個服務帳戶可能具備不必要的廣泛權限,例如存取專案中的 Cloud Source Repositories 和任何 Cloud Storage 值區。
為改善專案的安全性,並降低錯誤設定或惡意使用者可能造成的影響,建議您遵循最小權限原則。採用這項原則後,您可以為每個服務帳戶指派權限和角色,範圍限定為該帳戶執行的工作。舉例來說,您可以使用一個服務帳戶建構並將映像檔推送至 Artifact Registry,如Google Cloud Blog所示。
事前準備
-
Enable the Cloud Build and IAM APIs.
如果您打算使用這個帳戶建立及管理憑證 (例如建立短期憑證),請啟用 IAM 服務帳戶憑證 API。
如果您尚未建立服務帳戶,請先完成這項操作。
授予 IAM 權限
如要讓建構作業存取需要連線的服務,您必須授予部分角色和權限:
開啟 Cloud Build 設定頁面:
開啟 Cloud Build 「Settings」(設定) 頁面
畫面上會顯示「Service account permissions」(服務帳戶權限) 分頁:
從下拉式清單中,選取要變更角色的服務帳戶。
將要新增的角色設為「啟用」。
如果您需要的建構管道角色未列於此處,可以在 IAM 設定頁面中授予其他角色。
如要進一步瞭解建構作業通常需要哪些角色,請參閱「設定 Cloud Build 資源的存取權」和Cloud Build IAM 角色和權限的完整清單。
設定建構記錄檔
指定專屬服務帳戶用於建構時,您必須將建構記錄儲存在 Cloud Logging 或使用者建立的 Cloud Storage 值區中。您無法將記錄檔儲存在預設記錄檔值區。
如要在 Cloud Storage 值區中儲存記錄,請按照「將建構記錄儲存在使用者建立的值區中」中的操作說明進行。請確認您未在記錄值區設定保留政策,否則可能會導致 Cloud Build 無法將建構記錄寫入值區。
如要在 Cloud Logging 中儲存建構記錄,請將記錄寫入器 (
roles/logging.logWriter
) 角色授予服務帳戶。如要進一步瞭解建構記錄的儲存位置,請參閱「選擇建構記錄的儲存位置」。
使用設定檔執行建構作業
如要使用設定檔手動執行建構作業,請按照下列步驟操作:
在專案根目錄中,建立名為
cloudbuild.yaml
或cloudbuild.json
的 Cloud Build 建構設定檔。新增
serviceAccount
欄位和偏好的記錄設定。如果您要在 Cloud Logging 中儲存建構記錄,請新增
logging
欄位,並將欄位值設為CLOUD_LOGGING_ONLY
。如果您將建構記錄儲存在使用者建立的 Cloud Storage 值區中:
- 新增
logging
欄位,並將其值設為GCS_ONLY
。 - 新增
logsBucket
欄位,並將其值設為 Cloud Storage 值區位置。
- 新增
以下範例會將 Cloud Build 設為使用使用者指定的服務帳戶執行建構作業,並將建構記錄設為儲存在使用者建立的 Cloud Storage 值區中:
YAML
steps: - name: 'bash' args: ['echo', 'Hello world!'] logsBucket: 'LOGS_BUCKET_LOCATION' serviceAccount: 'projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT' options: logging: GCS_ONLY
JSON
{ "steps": [ { "name": "bash", "args": [ "echo", "Hello world!" ] } ], "logsBucket": "LOGS_BUCKET_LOCATION", "serviceAccount": "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT", "options": { "logging": "GCS_ONLY" } }
將建構設定檔中的預留位置值替換為以下內容:
LOGS_BUCKET_LOCATION
是用來儲存建構記錄的 Cloud Storage 值區。例如:gs://mylogsbucket
。PROJECT_ID
是您執行建構作業的 Google Cloud 專案 ID。SERVICE_ACCOUNT
是您要為建構作業指定的服務帳戶電子郵件地址或專屬 ID。例如,服務帳戶電子郵件地址如下所示:service-account-name@project-id.iam.gserviceaccount.com
。
使用建構設定檔展開建構作業:
gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
請將上述指令中的預留位置值替換為以下值:
CONFIG_FILE_PATH
是建構設定檔的路徑。SOURCE_DIRECTORY
是原始碼的路徑或網址。
如果您未在
gcloud builds submit
指令中指定 CONFIG_FILE_PATH 和 SOURCE_DIRECTORY,Cloud Build 會假設建構設定檔和原始碼位於目前的工作目錄中。
使用觸發條件執行建構作業
如要使用自有的服務帳戶,透過 Cloud Build 觸發條件執行建構作業,請設定偏好的記錄選項,並在建立觸發條件時選取偏好的服務帳戶。
在建構設定檔中:
如果您將建構記錄儲存在 Cloud Logging 中,請新增
logging
欄位,並將欄位值設為CLOUD_LOGGING_ONLY
。如果您將建構記錄儲存在使用者建立的 Cloud Storage 值區中:
- 新增
logging
欄位,並將其值設為GCS_ONLY
。 - 新增
logsBucket
欄位,並將其值設為 Cloud Storage 值區位置。
- 新增
以下範例會將建構記錄儲存在使用者建立的 Cloud Storage bucket 中:
YAML
steps: - name: 'bash' args: ['echo', 'Hello world!'] logsBucket: 'LOGS_BUCKET_LOCATION' options: logging: GCS_ONLY
JSON
{ "steps": [ { "name": "bash", "args": [ "echo", "Hello world!" ] } ], "logsBucket": "LOGS_BUCKET_LOCATION", "options": { "logging": "GCS_ONLY" } }
請將
LOGS_BUCKET_LOCATION
替換為儲存建構記錄的 Cloud Storage 值區。例如:gs://mylogsbucket
。指定要用於建構觸發條件的服務帳戶:
主控台
如要透過 Google Cloud 控制台的「觸發事件」頁面執行建構作業,使用者指定的服務帳戶必須與建構觸發事件位於相同專案。如要搭配跨專案服務帳戶使用觸發條件,請使用
gcloud
工具建立建構觸發條件。在「Service account」(服務帳戶) 欄位中指定服務帳戶。如果您未指定服務帳戶,Cloud Build 會使用預設服務帳戶。
按一下「建立」即可儲存自動建構觸發條件。
gcloud
建立建構觸發條件時,請使用
--service-account
標記指定服務帳戶。在以下範例中,gcloud
指令會建立建構觸發事件,從 Git 存放區提取程式碼:gcloud builds triggers create github \ --name=TRIGGER_NAME \ --repo-name=REPO_NAME \ --repo-owner=REPO_OWNER \ --branch-pattern=BRANCH_PATTERN --build-config=BUILD_CONFIG_FILE --service-account=SERVICE_ACCOUNT --project=BUILD_PROJECT
將建構設定檔中的預留位置值替換為以下內容:
TRIGGER_NAME
是建構觸發事件的名稱。REPO_NAME
是存放區的名稱。REPO_OWNER
是存放區擁有者的使用者名稱。BRANCH_PATTERN
是存放區中用於叫用建構作業的分支名稱。TAG_PATTERN
是存放區中用於叫用建構作業的標記名稱。BUILD_CONFIG_FILE
是建構設定檔的路徑。SERVICE_ACCOUNT
是服務帳戶,格式為/projects/PROJECT_ID/serviceAccounts/ACCOUNT_ID_OR_EMAIL
。BUILD_PROJECT
是您要開始建構的專案。
跨專案設定
如果使用者指定的服務帳戶位於與您要開始建構的專案不同的專案中,請授予必要的存取權:
在含有使用者指定服務帳戶的專案中,請確認系統不會強制執行
iam.disableCrossProjectServiceAccountUsage
機構政策限制。這項限制會在預設情況下強制執行。如要停用這項機構政策限制,請執行下列指令,其中 SERVICE_ACCOUNT_PROJECT_ID 是包含使用者指定服務帳戶的專案:gcloud resource-manager org-policies disable-enforce \ iam.disableCrossProjectServiceAccountUsage \ --project=SERVICE_ACCOUNT_PROJECT_ID
在含有使用者指定服務帳戶的專案中,為執行建構作業的專案 Cloud Build 服務代理人授予
roles/iam.serviceAccountTokenCreator
角色:gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member="serviceAccount:BUILD_SERVICE_AGENT" \ --role="roles/iam.serviceAccountTokenCreator"
將指令中的預留位置值替換為下列值:
SERVICE_ACCOUNT_PROJECT_ID
:包含使用者指定服務帳戶的專案專案 ID。BUILD_SERVICE_AGENT
:服務專員的電子郵件 ID,格式為service-BUILD_PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com
,其中BUILD_PROJECT_NUMBER
是您執行建構作業的專案編號。您可以從專案設定頁面取得專案編號。
限制:
Google Cloud 專案必須屬於 Google Cloud 機構。
您必須使用
gcloud builds submit
或gcloud builds triggers create
在指令列中啟動建構作業。如要在 Google Cloud 控制台中使用「觸發事件」頁面,使用者指定的服務帳戶和建構觸發事件必須位於同一個專案中。
後續步驟
- 進一步瞭解 Cloud Build 身分與存取權管理角色和權限。
- 瞭解服務帳戶異動對執行建構作業的影響。