建立使用者代管的服務帳戶的 VM

本文說明如何建立虛擬機器 (VM) 執行個體,並設定為使用使用者自行管理的服務帳戶。服務帳戶是一種特殊的帳戶,通常由應用程式或運算工作負載使用,用於發出已授權的 API 呼叫。

如果工作負載 (例如自訂應用程式) 需要存取 Google Cloud 資源或執行動作,且不需使用者參與,就必須使用服務帳戶。如要進一步瞭解何時應使用服務帳戶,請參閱「使用服務帳戶的最佳做法」。

如果應用程式需要呼叫 Google Cloud API,Google 建議您將使用者管理的服務帳戶附加至執行應用程式或工作負載的 VM。接著,您會授予服務帳戶 IAM 角色,讓服務帳戶 (以及在 VM 上執行的應用程式) 存取Google Cloud 資源。

事前準備

  • 如果尚未設定驗證,請先完成設定。驗證機制會確認您的身分,以便授予 Google Cloud 服務和 API 的存取權。如要從本機開發環境執行程式碼或範例,您可以選取下列其中一個選項,向 Compute Engine 進行驗證:

    請根據您打算如何使用本頁範例,選取對應的分頁標籤:

    控制台

    使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,不需要設定驗證機制。

    gcloud

    1. 安裝 Google Cloud CLI。 安裝完成後, 請執行下列指令,初始化 Google Cloud CLI:

      gcloud init

      如果採用外部識別資訊提供者 (IdP),必須先 使用聯合身分登入 gcloud CLI。

  • 設定預設區域和可用區。
  • Terraform

    如要在本機開發環境中使用本頁的 Terraform 範例,請安裝並初始化 gcloud CLI,然後使用使用者憑證設定應用程式預設憑證。

    1. 安裝 Google Cloud CLI。

    2. 若您採用的是外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

    3. 如果您使用的是本機殼層,請為使用者帳戶建立本機驗證憑證:

      gcloud auth application-default login

      如果您使用的是 Cloud Shell,則不必執行這項操作。

      如果系統傳回驗證錯誤,且您使用的是外部識別資訊提供者 (IdP),請確認您已 使用聯合身分登入 gcloud CLI。

    詳情請參閱「 為本機開發環境設定驗證機制」。

    REST

    如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

      安裝 Google Cloud CLI。

      如果採用外部識別資訊提供者 (IdP),必須先 使用聯合身分登入 gcloud CLI。

    詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」一節。

必要的角色

如要取得建立使用服務帳戶的 VM 所需權限,請要求管理員在專案中授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這些預先定義的角色具備建立使用服務帳戶的 VM 所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

如要建立使用服務帳戶的 VM,必須具備下列權限:

  • 建立服務帳戶:iam.serviceAccountCreator 角色中的所有權限
  • 如要將權限授予服務帳戶: resourcemanager.projectIamAdmin 角色中的所有權限
  • 如要建立 VM,請按照下列步驟操作:
    • 專案的 compute.instances.create 權限
    • 如要使用自訂映像檔建立 VM,請在映像檔上compute.images.useReadOnly
    • 如要使用快照建立 VM,請在快照上compute.snapshots.useReadOnly
    • 如要使用執行個體範本建立 VM,請在執行個體範本上按一下「compute.instanceTemplates.useReadOnly」
    • 如要將舊版網路指派給 VM,請在專案中執行 compute.networks.use
    • 如要為 VM 指定靜態 IP 位址,請在專案中執行 compute.addresses.use
    • 如要在使用舊版網路時,為 VM 指派外部 IP 位址,請在專案上執行 compute.networks.useExternalIp
    • 如要為 VM 指定子網路,請在專案或所選子網路上執行 compute.subnetworks.use
    • 如要在使用虛擬私有雲網路時,為 VM 指派外部 IP 位址,請在專案或所選子網路上,指派 compute.subnetworks.useExternalIp 角色
    • 如要為專案中的 VM compute.instances.setMetadata 設定 VM 執行個體中繼資料,請按照下列步驟操作:
    • 如要設定 VM 的標記,請在 VM 上執行 compute.instances.setTags
    • 如要設定 VM 的標籤,請在 VM 上執行 compute.instances.setLabels
    • 如要設定 VM 使用的服務帳戶,請在 VM 上執行 compute.instances.setServiceAccount
    • 如要為 VM 建立新磁碟:compute.disks.create
    • 如要以唯讀或讀寫模式連接現有磁碟,請在磁碟上compute.disks.use
    • 如要以唯讀模式連接現有磁碟:在磁碟上compute.disks.useReadOnly

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

總覽

建議您按照下列方式,為 VM 設定服務帳戶:

  1. 建立新的使用者自行管理服務帳戶,而非使用 Compute Engine 預設服務帳戶,並僅針對該服務帳戶所需的資源和作業,將 IAM 角色授予該服務帳戶。
  2. 將服務帳戶附加至 VM。
  3. 在 VM 上設定雲端平台 (https://www.googleapis.com/auth/cloud-platform) 範圍。這樣一來,VM 的服務帳戶就能呼叫有權使用的 Google Cloud API。
    • 如果使用 Google Cloud 控制台指定服務帳戶,請將服務帳戶的存取權範圍設為「允許所有 Cloud API 的完整存取權」。
    • 如果使用 Google Cloud CLI 或 Compute Engine API 指定服務帳戶,則可透過 scopes 參數設定存取權範圍。

設定服務帳戶

建立服務帳戶並指派必要的 IAM 角色。視需要指派 IAM 角色,數量不限。您可以視需要修改服務帳戶的 IAM 角色。

Google 建議您限制服務帳戶的權限,並定期檢查服務帳戶權限,確保權限符合最新狀態。

請使用下列其中一種方法設定服務帳戶。

控制台

    確認您具備「建立服務帳戶」IAM 角色 (roles/iam.serviceAccountCreator) 和「專案 IAM 管理員」角色 (roles/resourcemanager.projectIamAdmin)。瞭解如何授予角色。
  1. 前往 Google Cloud 控制台的「Create service account」(建立服務帳戶) 頁面。

    前往「Create service account」(建立服務帳戶) 頁面
  2. 選取專案。
  3. 在「Service account name」(服務帳戶名稱) 欄位中輸入名稱。 Google Cloud 控制台會將這個名稱填入「Service account ID」(服務帳戶 ID) 欄位。

    在「Service account description」(服務帳戶說明) 欄位中輸入說明。例如:Service account for quickstart。

  4. 按一下「建立並繼續」。
  5. 將必要角色授予服務帳戶。

    如要授予角色,請在「Select a role」(選取角色) 清單中選取角色。

    如要授予其他角色,請按一下「Add another role」(新增其他角色),然後新增其他角色。

  6. 按一下 [繼續]。
  7. 在「Service account users role」(服務帳戶使用者角色) 欄位中,輸入主體的 ID,該主體會將服務帳戶附加至其他資源,例如 Compute Engine 執行個體。

    這通常是指 Google 帳戶的電子郵件地址。

  8. 按一下「Done」(完成),完成服務帳戶建立作業。

gcloud

    設定驗證方法:

    1. 確認您具備「建立服務帳戶」IAM 角色 (roles/iam.serviceAccountCreator) 和「專案 IAM 管理員」角色 (roles/resourcemanager.projectIamAdmin)。瞭解如何授予角色。
    2. 建立服務帳戶:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      將 SERVICE_ACCOUNT_NAME 替換為服務帳戶名稱。

    3. 如要授予專案和資源的存取權,請將角色授予服務帳戶:

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE

      更改下列內容:

      • SERVICE_ACCOUNT_NAME:服務帳戶名稱
      • PROJECT_ID:建立服務帳戶的專案 ID
      • ROLE:要授予的角色
    4. 如要將其他角色授予服務帳戶,請按照上一個步驟執行指令。
    5. 將必要角色授予會將服務帳戶附加至其他資源的主體。

      gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com --member="user:USER_EMAIL" --role=roles/iam.serviceAccountUser

      更改下列內容:

      • SERVICE_ACCOUNT_NAME:服務帳戶名稱
      • PROJECT_ID:建立服務帳戶的專案 ID
      • USER_EMAIL:Google 帳戶的電子郵件地址

Terraform

如要建立服務帳戶,您可以使用 google_service_account 資源。

resource "google_service_account" "default" {
  account_id   = "service-account-id"
  display_name = "Service Account"
}

請記得替換 account_id 和 display_name 屬性的預留位置值。

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

建立 VM 並附加服務帳戶

建立服務帳戶後,請建立 VM 並附加您在上一節建立的服務帳戶。並將 VM 的存取權範圍設為 cloud-platform。

在 VM 執行個體上設定的存取權範圍,會定義中繼資料伺服器中 OAuth2 存取權杖的最大範圍。您可以要求權杖,但範圍比預設值少。詳情請參閱「取得特定 OAuth2 存取權杖」。

如果您已有 VM,且想設定該 VM 使用其他服務帳戶,請參閱「變更附加的服務帳戶」。

請使用下列其中一種方法建立 VM 並附加服務帳戶。

控制台

  1. 前往 Google Cloud 控制台的「Create an instance」(建立執行個體) 頁面。

    前往「Create an instance」(建立執行個體)

  2. 如要附加服務帳戶,請按照下列步驟操作:

    1. 按一下導覽選單中的「Security」(安全性)。
    2. 在「Service account」(服務帳戶) 清單中,選取您建立的服務帳戶。
    3. 在「存取權範圍」部分,選取「允許所有 Cloud API 的完整存取權」。
  3. 選用:指定其他設定選項。詳情請參閱「建立執行個體時的設定選項」。

  4. 如要建立並啟動執行個體,請按一下「Create」(建立)。

gcloud

如要建立新的 VM 執行個體,並使用 Google Cloud CLI 設定為使用自訂服務帳戶,請使用 gcloud compute instances create 指令,並提供服務帳戶電子郵件和 VM 執行個體的 cloud-platform 存取權範圍。

gcloud compute instances create VM_NAME \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --scopes=https://www.googleapis.com/auth/cloud-platform

更改下列內容:

  • SERVICE_ACCOUNT_EMAIL:您建立的服務帳戶電子郵件地址。例如:my-sa-123@my-project-123.iam.gserviceaccount.com。如要查看電子郵件地址,請參閱「列出服務帳戶」。
  • VM_NAME:VM 執行個體的名稱。

例如:

gcloud compute instances create example-vm \
    --service-account 123-my-sa@my-project-123.iam.gserviceaccount.com \
    --scopes=https://www.googleapis.com/auth/cloud-platform

您也可以使用別名 --scopes=cloud-platform 指定範圍。只有 gcloud CLI 能辨識這些別名。API 和其他程式庫無法辨識這些別名,因此您必須指定完整的範圍 URI。

Terraform

如要設定新的 VM 以使用服務帳戶,您可以使用 google_compute_instance 資源。

resource "google_compute_instance" "default" {
  name         = "my-test-vm"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-13"
    }
  }

  // Local SSD disk
  scratch_disk {
    interface = "SCSI"
  }

  network_interface {
    network = "default"

    access_config {
      // Ephemeral public IP
    }
  }

  service_account {
    # Google recommends custom service accounts with `cloud-platform` scope with
    # specific permissions granted via IAM Roles.
    # This approach lets you avoid embedding secret keys or user credentials
    # in your instance, image, or app code
    email  = google_service_account.default.email
    scopes = ["cloud-platform"]
  }
}

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

REST

使用 instances.insert 方法建立 VM,並指定 VM 執行個體的服務帳戶電子郵件和存取權範圍。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
   "machineType":"zones/MACHINE_TYPE_ZONE/machineTypes/MACHINE_TYPE",
   "name":"VM_NAME",
   
   "disks":[
      {
         "initializeParams":{
            "sourceImage":"projects/IMAGE_PROJECT/global/images/IMAGE"
         },
         "boot":true
      }
   ],
   
   
   "networkInterfaces":[
      {
         "network":"global/networks/NETWORK_NAME"
      }
   ],
   
  "serviceAccounts": [
      {
      "email": "SERVICE_ACCOUNT_EMAIL",
      "scopes": ["https://www.googleapis.com/auth/cloud-platform"]
      }
   ],
   "shieldedInstanceConfig":{
      "enableSecureBoot":"ENABLE_SECURE_BOOT"
   }
}

更改下列內容:

  • PROJECT_ID:要建立 VM 的專案 ID
  • ZONE:建立 VM 的可用區
  • MACHINE_TYPE_ZONE:新 VM 要使用的機型所在可用區
  • MACHINE_TYPE:新 VM 的機器類型,可為預先定義或自訂
  • VM_NAME:新 VM 的名稱
  • IMAGE_PROJECT:包含映像檔的專案
    舉例來說,如果您指定 debian-12 做為映像檔系列,請指定 debian-cloud 做為映像檔專案。
  • IMAGE:指定下列其中一項:
    • IMAGE:公開映像檔的特定版本

      例如: "sourceImage": "projects/debian-cloud/global/images/debian-12-bookworm-v20241112"

    • IMAGE_FAMILY:映像檔系列

      指定映像檔系列後,系統會使用未淘汰的最新 OS 映像檔建立 VM。舉例來說,如果您指定 "sourceImage": "projects/debian-cloud/global/images/family/debian-12",Compute Engine 就會使用 Debian 12 映像檔系列中最新版本的 OS 映像檔建立 VM。

  • NETWORK_NAME:要用於 VM 的虛擬私有雲網路。您可以指定 default,使用預設網路。
  • SERVICE_ACCOUNT_EMAIL:您建立的服務帳戶電子郵件地址。例如:my-sa-123@my-project-123.iam.gserviceaccount.com。如要查看電子郵件地址,請參閱「取得服務帳戶電子郵件」。
  • ENABLE_SECURE_BOOT:選用:如果您選擇支援Shielded VM 功能的映像檔,Compute Engine 預設會啟用虛擬信任平台模組 (vTPM) 和完整性監控。Compute Engine 預設不會啟用安全啟動功能。

    如果將 enableSecureBoot 指定為 true,Compute Engine 會建立已啟用所有三項 Shielded VM 功能的 VM。Compute Engine 啟動 VM 後,您必須停止 VM,才能修改 Shielded VM 選項。

存取及使用其他 Google Cloud 服務

將 VM 設為使用服務帳戶後,應用程式就能使用服務帳戶進行驗證。最常見的方法是使用應用程式預設憑證和用戶端程式庫進行驗證。部分 Google Cloud 工具 (例如 gcloud CLI) 可自動使用服務帳戶,從 VM 存取 Google Cloud API。詳情請參閱「使用服務帳戶驗證工作負載」。

如果刪除服務帳戶,應用程式就無法再透過該服務帳戶存取Google Cloud 資源。如果刪除預設的 App Engine 和 Compute Engine 服務帳戶,VM 就無法再存取專案中的資源。如果不確定服務帳戶是否正在使用中,建議您先停用服務帳戶再刪除。如果仍需要已停用的服務帳戶,可以重新啟用。

範例:從 VM 存取 Cloud Storage 資源

將 VM 設為使用具備 storage.admin 角色的服務帳戶後,您可以使用 gcloud CLI 等工具,管理儲存在 Cloud Storage 的檔案。如要存取 Cloud Storage 資源,請完成下列步驟:

  1. 確認附加至 VM 的服務帳戶具備 roles/storage.admin 角色。

  2. 如果 VM 使用自訂 OS 映像檔,請安裝 gcloud CLI。根據預設, Google Cloud提供的大多數公開 OS 映像檔都已安裝 gcloud CLI。

  3. 連線至 VM。

  4. 在 VM 中使用 Google Cloud CLI 管理 Cloud Storage 資源。

後續步驟