如未指定服務帳戶,Cloud Build 可能會自動選取服務帳戶,代表您執行建構作業。這個服務帳戶可能具備不必要的廣泛權限,例如存取 Cloud Source Repositories 和專案中的任何 Cloud Storage bucket。
為提升專案的安全性,並降低設定錯誤或惡意使用者可能造成的影響,建議您遵循最低權限原則。採用這項原則後,您就能為每個服務帳戶指派權限和角色,範圍限定在該帳戶執行的工作。舉例來說,您可以如Google Cloud 這篇網誌所示,使用一個服務帳戶建構映像檔並推送至 Artifact Registry。
事前準備
- 
  
   
   
     
   
  
   
   
     
   
  
 
  
  
    
      Enable the Cloud Build and IAM APIs. Roles required to enable APIs To enable APIs, you need the Service Usage Admin IAM role ( roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
- 如果您打算使用這個帳戶建立及管理憑證 (例如建立短期憑證),請啟用 IAM Service Account Credentials API。 - Roles required to enable APIs - To enable APIs, you need the Service Usage Admin IAM role ( - roles/serviceusage.serviceUsageAdmin), which contains the- serviceusage.services.enablepermission. Learn how to grant roles.
- 如果還沒有服務帳戶,請建立服務帳戶。 
授予 IAM 權限
如要允許建構作業存取連線所需的服務,您必須授予部分角色和權限:
- 開啟 Cloud Build 設定頁面: - 開啟 Cloud Build 「Settings」(設定) 頁面 - 畫面上會顯示「Service account permissions」(服務帳戶權限) 分頁:   
- 從下拉式清單中,選取要變更角色的服務帳戶。 
- 將要新增角色的狀態設為「啟用」。 
- 如果建構管道所需的角色未列於此處,您可以在 IAM 設定頁面中授予其他角色。 
如要進一步瞭解建構作業通常需要的角色,請參閱「設定 Cloud Build 資源的存取權」和「Cloud Build IAM 角色和權限」的完整清單。
設定建構作業記錄檔
為建構作業指定自己的服務帳戶時,您必須將建構記錄儲存在 Cloud Logging 或使用者建立的 Cloud Storage bucket 中。您無法將記錄檔儲存在預設記錄檔 bucket 中。
- 如要將記錄檔儲存在 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 bucket 位置。
 
- 新增 
 - 以下範例會設定 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 bucket。例如:- 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 bucket 位置。
 
- 新增 
 - 以下範例會將建構記錄設定為儲存在使用者建立的 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工具建立建構觸發條件。
- 在「服務帳戶」欄位中,指定服務帳戶。如未指定服務帳戶,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機構政策限制的情況下,您才能使用使用者指定的服務帳戶,在與建立服務帳戶的專案不同的專案中執行建構作業。這項限制預設為強制執行。
- 下列指令會停用該限制的強制執行,並授予必要存取權。貴機構必須瞭解相關安全風險,再於機構政策中設定限制: - gcloud resource-manager org-policies disable-enforce \ iam.disableCrossProjectServiceAccountUsage \ --project=SERVICE_ACCOUNT_PROJECT_ID- 在這個指令中,SERVICE_ACCOUNT_PROJECT_ID 是包含使用者指定服務帳戶的專案 
- 在具有使用者指定服務帳戶的專案中,將 - roles/iam.serviceAccountTokenCreator角色授予您要執行建構的專案 Cloud Build 服務代理程式:- 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 IAM 角色和權限。
- 瞭解服務帳戶異動對建構作業的影響。