大量建立 VM


如要建立大量相同且彼此獨立的虛擬機器 (VM) 執行個體,請使用 Google Cloud CLI 或 Compute Engine API 批次建立 VM。您可以在區域中的所有可用區建立這些 VM,也可以將 VM 分散到特定可用區。

如要瞭解詳情和相關限制,請參閱「關於大量建立 VM」。如要建立附加 GPU 的執行個體,請改為參閱「大量建立 GPU VM」。

事前準備

  • 如要建立 VM 和任何相關資源,請確認您有足夠的配額必要權限
  • 如果尚未設定驗證,請先完成設定。 「驗證」是指驗證身分的程序,確認您有權存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列任一選項,向 Compute Engine 進行驗證:

    Select the tab for how you plan to use the samples on this page:

    gcloud

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

      gcloud init

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

    2. Set a default region and zone.

    REST

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

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

      gcloud init

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

    詳情請參閱 Google Cloud 驗證說明文件中的「Authenticate for using REST」。

必要的角色

如要取得大量建立 VM 所需的權限,請要求管理員為您授予專案的 Compute 執行個體管理員 (v1) (roles/compute.instanceAdmin.v1) 身分與存取權管理角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這個預先定義的角色具備大量建立 VM 所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要大量建立 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
  • 使用舊版網路時,如要將外部 IP 位址指派給 VM,請在專案中設定 compute.networks.useExternalIp
  • 如要為 VM 指定子網路,請在專案或所選子網路上授予 compute.subnetworks.use 權限。
  • 使用虛擬私有雲網路時,如要將外部 IP 位址指派給 VM,請在專案或所選子網路上取得 compute.subnetworks.useExternalIp 權限。
  • 如要為 VM 設定 VM 執行個體中繼資料,請在專案中執行下列指令: compute.instances.setMetadata
  • 如要為 VM 設定標記,請按照下列步驟操作: compute.instances.setTags 在 VM 上
  • 如要為 VM 設定標籤,請按照下列步驟操作: compute.instances.setLabels 在 VM 上
  • 如要設定 VM 使用的服務帳戶: compute.instances.setServiceAccount 在 VM 上
  • 為 VM 建立新磁碟: compute.disks.create 專案的
  • 如要以唯讀或讀寫模式附加現有磁碟: 磁碟的 compute.disks.use
  • 如要以唯讀模式連接現有磁碟: compute.disks.useReadOnly 磁碟的

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

在區域中大量建立 VM

如要在區域中大量建立 VM,請使用 gcloud CLI 或 Compute Engine API。

如果您指定機器類型或額外硬體 (例如 GPU 或本機 SSD) 的支援,Compute Engine 會將 VM 放置在區域內支援機器類型和額外硬體的區域中。

gcloud

如要在區域中大量建立 VM,請使用下列 gcloud compute instances bulk create 指令

gcloud compute instances bulk create \
    ( --name-pattern="NAME_PATTERN" | --predefined-names=[PREDEFINED_NAMES] ) \
    --region=REGION \
    --count=COUNT \
    [ --min-count=MIN_COUNT \ ]
    [--location-policy=LOCATION_POLICY \ ]
    [--target-distribution-shape=TARGET_DISTRIBUTION_SHAPE ]

更改下列內容:

  • NAME_PATTERN:VM 的名稱模式。使用一連串的雜湊 (#) 字元,讓 Compute Engine 替換成一連串數字。舉例來說,如果名稱模式為 vm-#,就會產生 vm-1vm-2 等 VM 名稱,最多可產生 --count 指定的 VM 數量,但該數量必須小於或等於名稱模式允許的 VM 數量。

    使用名稱模式時,Compute Engine 會檢查先前要求建立的現有 VM 名稱,盡量避免名稱衝突。

  • PREDEFINED_NAMES:要建立的 VM 預先定義名稱清單。如果使用這個旗標並指定 COUNTCOUNT 必須等於提供的名稱數量。

  • REGION:要在其中建立 VM 的區域。

  • COUNT:要建立的 VM 數量。這個值必須小於或等於 NAME_PATTERN 允許的 VM 數量。或者,如果使用 --predefined-names,則不必指定 COUNT,但如果指定,則必須等於提供的名稱數量。

  • MIN_COUNT:要建立的 VM 數量下限。下表說明如何根據您設定這個標記的方式,決定要求的行為:

    說明
    未設定 預設值為 COUNT。如果 Compute Engine 無法建立 COUNT 指定數量的 VM,要求就會失敗,且不會建立任何 VM。
    1 Compute Engine 會盡可能建立 VM,最多 COUNT 個。
    大於 1 且小於 COUNT Compute Engine 會建立至少 MIN_COUNT 個 VM,最多 COUNT 個 VM。如果無法建立 MIN_COUNT VM,要求就會失敗,且不會建立任何 VM。
  • LOCATION_POLICY:要在區域內納入或排除的可用區。使用鍵/值組合清單,其中區域為鍵,政策為值。這項政策的有效值為 allow (預設值) 和 deny。以下是這個標記的範例值:

    --location-policy=us-east1-b=allow,us-east1-c=deny
    
  • TARGET_DISTRIBUTION_SHAPE:VM 在指定可用區的分配情形。使用 --location-policy 標記指定區域。下表列出這個旗標的有效值:

    說明
    ANY_SINGLE_ZONE 強制將 VM 放置在單一可用區,並優先使用未使用的預留項目。這項功能可避免跨區域網路輸出,或縮短網路延遲時間。這是預設值。
    BALANCED 嘗試在區域內的所有可用區平均分配 VM。
    ANY 允許在區域中的多個可用區之間分配 VM。 選擇有可用資源的區域,並盡量減少未使用的區域預留項目。

REST

如要在某個區域中大量建立 VM,請使用下列instances.bulkInsert方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instances/bulkInsert

{
  ...
  "namePattern": "NAME_PATTERN",
  "perInstanceProperties": {
    "PREDEFINED_NAME_1": {},
    "PREDEFINED_NAME_2": {},
    ...
  },
  "count": COUNT,
  "minCount": MIN_COUNT,
  "locationPolicy": {
    "LOCATION_POLICY"
    },
    "targetShape": "TARGET_DISTRIBUTION_SHAPE"
  ...
}

更改下列內容:

  • PROJECT_ID:專案 ID。

  • REGION:要在其中建立 VM 的區域。

  • NAME_PATTERN:VM 的名稱模式。指定這個或 perInstanceProperties。使用一連串的雜湊 (#) 字元,讓 Compute Engine 替換成一連串的數字。舉例來說,使用 vm-# 做為名稱模式會產生 vm-1vm-2 等名稱的 VM,最多可達 --count 指定的 VM 數量,且該數量必須小於或等於名稱模式允許的 VM 數量。

    使用名稱模式時,Compute Engine 會檢查先前要求建立的現有 VM 名稱,盡量避免名稱衝突。

  • PREDEFINED_NAME_1PREDEFINED_NAME_2 等:要建立的 VM 預先定義名稱清單。指定這個或 namePattern。如果使用這個標記並指定 COUNTCOUNT 必須等於提供的名稱數量。

  • COUNT:要建立的 VM 數量。這個值必須小於或等於 NAME_PATTERN 允許的 VM 數量。或者,如果使用 perInstanceProperties,則不必指定 COUNT,但如果指定,則必須等於提供的名稱數量。

  • MIN_COUNT:要建立的 VM 數量下限。下表說明如何根據您設定這個標記的方式,決定要求的行為:

    說明
    未設定 預設值為 COUNT。如果 Compute Engine 無法建立 COUNT 指定數量的 VM,要求就會失敗,且不會建立任何 VM。
    1 Compute Engine 會盡可能建立 VM,最多 COUNT 個。
    大於 1 且小於 COUNT Compute Engine 會建立至少 MIN_COUNT 個 VM,最多 COUNT 個 VM。如果無法建立 MIN_COUNT VM,要求就會失敗,且不會建立任何 VM。
  • LOCATION_POLICY:要在區域內納入或排除的可用區。使用鍵/值組合清單,其中區域為鍵,政策為值。這項政策的有效值為 ALLOW (預設值) 和 DENY。以下是這個欄位的範例值:

    "locations": {
      "zones/us-central1-a": { "preference": "ALLOW" },
      "zones/us-central1-c": { "preference": "DENY"  },
      ...
    },
    
  • TARGET_DISTRIBUTION_SHAPE:VM 在指定可用區的分布情形。使用 locationPolicy 欄位指定區域。下表列出這個欄位的有效值:

    說明
    ANY_SINGLE_ZONE 強制將 VM 放置在單一可用區,並優先使用未使用的預留項目。這項功能可避免跨區域網路輸出,或縮短網路延遲時間。這是預設值。
    BALANCED 嘗試在區域內的所有可用區平均分配 VM。
    ANY 允許在區域中的多個可用區之間分配 VM。 選擇有可用資源的區域,並盡量減少未使用的區域預留項目。

在可用區中大量建立 VM

如要在可用區中大量建立 VM,請使用 gcloud CLI 或 Compute Engine API。

gcloud

如要在特定可用區中大量建立 VM,請使用下列 gcloud compute instances bulk create 指令

gcloud compute instances bulk create \
    ( --name-pattern="NAME_PATTERN" | --predefined-names=[PREDEFINED_NAMES] ) \
    --zone=ZONE \
    --count=COUNT \
    [ --min-count=MIN_COUNT ]

更改下列內容:

  • NAME_PATTERN:VM 的名稱模式。使用一連串的雜湊 (#) 字元,讓 Compute Engine 替換成一連串數字。舉例來說,如果名稱模式為 vm-#,就會產生 vm-1vm-2 等 VM 名稱,最多可產生 --count 指定的 VM 數量,但該數量必須小於或等於名稱模式允許的 VM 數量。

    使用名稱模式時,Compute Engine 會檢查先前要求建立的現有 VM 名稱,盡量避免名稱衝突。

  • PREDEFINED_NAMES:要建立的 VM 預先定義名稱清單。如果使用這個旗標並指定 COUNTCOUNT 必須等於提供的名稱數量。

  • ZONE:用於建立 VM 的可用區。

  • COUNT:要建立的 VM 數量。這個值必須小於或等於 NAME_PATTERN 允許的 VM 數量。或者,如果使用 --predefined-names,則不必指定 COUNT,但如果指定,則必須等於提供的名稱數量。

  • MIN_COUNT:要建立的 VM 數量下限。下表說明如何根據您設定這個標記的方式,決定要求的行為:

    說明
    未設定 預設值為 COUNT。如果 Compute Engine 無法建立 COUNT 指定數量的 VM,要求就會失敗,且不會建立任何 VM。
    1 Compute Engine 會盡可能建立 VM,最多 COUNT 個。
    大於 1 且小於 COUNT Compute Engine 會建立至少 MIN_COUNT 個 VM,最多 COUNT 個 VM。如果無法建立 MIN_COUNT VM,要求就會失敗,且不會建立任何 VM。

REST

如要在可用區中大量建立 VM,請使用下列instances.bulkInsert方法

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

{
  ...
  "namePattern": "NAME_PATTERN",
  "perInstanceProperties": {
    "PREDEFINED_NAME_1": {},
    "PREDEFINED_NAME_2": {},
    ...
  },
  "count": COUNT,
  "minCount": MIN_COUNT,
  ...
}

更改下列內容:

  • PROJECT_ID:專案 ID。

  • ZONE:用於建立 VM 的可用區。

  • NAME_PATTERN:VM 的名稱模式。指定這個或 perInstanceProperties。使用一連串的雜湊 (#) 字元,讓 Compute Engine 替換成一連串的數字。舉例來說,使用 vm-# 做為名稱模式會產生 vm-1vm-2 等名稱的 VM,最多可達 --count 指定的 VM 數量,且該數量必須小於或等於名稱模式允許的 VM 數量。

    使用名稱模式時,Compute Engine 會檢查先前要求建立的現有 VM 名稱,盡量避免名稱衝突。

  • PREDEFINED_NAME_1PREDEFINED_NAME_2 等:要建立的 VM 預先定義名稱清單。指定這個或 namePattern。如果使用這個標記並指定 COUNTCOUNT 必須等於提供的名稱數量。

  • COUNT:要建立的 VM 數量。這個值必須小於或等於 NAME_PATTERN 允許的 VM 數量。或者,如果使用 perInstanceProperties,則不必指定 COUNT,但如果指定,則必須等於提供的名稱數量。

  • MIN_COUNT:要建立的 VM 數量下限。下表說明如何根據您設定這個標記的方式,決定要求的行為:

    說明
    未設定 預設值為 COUNT。如果 Compute Engine 無法建立 COUNT 指定數量的 VM,要求就會失敗,且不會建立任何 VM。
    1 Compute Engine 會盡可能建立 VM,最多 COUNT 個。
    大於 1 且小於 COUNT Compute Engine 會建立至少 MIN_COUNT 個 VM,最多 COUNT 個 VM。如果無法建立 MIN_COUNT VM,要求就會失敗,且不會建立任何 VM。

大量建立具有自訂主機名稱的 VM

您可以使用 gcloud CLI 或 Compute Engine API,在區域或可用區中大量建立具有自訂主機名稱的 VM。

您必須針對自訂主機名稱手動設定 DNS 記錄。詳情請參閱「限制」一節。

如果您未指定主機名稱,Compute Engine 會將 VM 的主機名稱設為下列其中一項:

  • VM_NAME.c.PROJECT_ID.internal 啟用全域 DNS 時
  • VM_NAME.ZONE.c.PROJECT_ID.internal 啟用可用區 DNS 時

詳情請參閱內部 DNS 名稱

gcloud

如要在特定地區中,使用自訂主機名稱大量建立 VM,請使用下列 gcloud beta compute instances bulk create 指令

gcloud beta compute instances bulk create \
    ( --name-pattern="NAME_PATTERN" | --predefined-names=[PREDEFINED_NAMES] ) \
    --per-instance-hostnames=[VM_NAME=HOSTNAME,...] \
    --zone=REGION \
    --count=COUNT \
    [ --min-count=MIN_COUNT ]
    [--location-policy=LOCATION_POLICY \ ]
    [--target-distribution-shape=TARGET_DISTRIBUTION_SHAPE ]

更改下列內容:

  • NAME_PATTERN:VM 的名稱模式。使用一連串的雜湊 (#) 字元,讓 Compute Engine 替換成一連串數字。舉例來說,如果名稱模式為 vm-#,就會產生 vm-1vm-2 等 VM 名稱,最多可產生 --count 指定的 VM 數量,但該數量必須小於或等於名稱模式允許的 VM 數量。

    使用名稱模式時,Compute Engine 會檢查先前要求建立的現有 VM 名稱,盡量避免名稱衝突。

  • PREDEFINED_NAMES:要建立的 VM 預先定義名稱清單。如果使用這個旗標並指定 COUNTCOUNT 必須等於提供的名稱數量。

  • [VM_NAME=HOSTNAME, ...]: a VM 的預先定義名稱和完整網域主機名稱的鍵值組清單,您要為 VM 指派這些名稱。自訂主機名稱必須符合 RFC 1035 的有效主機名稱要求。

  • REGION:用於建立 VM 的可用區。

  • COUNT:要建立的 VM 數量。這個值必須小於或等於 NAME_PATTERN 允許的 VM 數量。或者,如果使用 --predefined-names,則不必指定 COUNT,但如果指定,則必須等於提供的名稱數量。

  • MIN_COUNT:要建立的 VM 數量下限。下表說明如何根據您設定這個標記的方式,決定要求的行為:

    說明
    未設定 預設值為 COUNT。如果 Compute Engine 無法建立 COUNT 指定數量的 VM,要求就會失敗,且不會建立任何 VM。
    1 Compute Engine 會盡可能建立 VM,最多 COUNT 個。
    大於 1 且小於 COUNT Compute Engine 會建立至少 MIN_COUNT 個 VM,最多 COUNT 個 VM。如果無法建立 MIN_COUNT VM,要求就會失敗,且不會建立任何 VM。
  • LOCATION_POLICY:要在區域內納入或排除的可用區。使用鍵/值組合清單,其中區域為鍵,政策為值。這項政策的有效值為 ALLOW (預設值) 和 DENY。以下是這個欄位的範例值:

    "locations": {
      "zones/us-central1-a": { "preference": "ALLOW" },
      "zones/us-central1-c": { "preference": "DENY"  },
      ...
    },
    
  • TARGET_DISTRIBUTION_SHAPE:VM 在指定可用區的分布情形。使用 locationPolicy 欄位指定區域。下表列出這個欄位的有效值:

    說明
    ANY_SINGLE_ZONE 強制將 VM 放置在單一可用區,並優先使用未使用的預留項目。這項功能可避免跨區域網路輸出,或縮短網路延遲時間。這是預設值。
    BALANCED 嘗試在區域內的所有可用區平均分配 VM。
    ANY 允許在區域中的多個可用區之間分配 VM。 選擇有可用資源的區域,並盡量減少未使用的區域預留項目。

REST

如要在特定區域中大量建立具有自訂主機名稱的 VM,請使用下列 instances.bulkInsert 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instances/bulkInsert

{
  ...
  "namePattern": "NAME_PATTERN",
  "perInstanceProperties": {
    "PREDEFINED_NAME_1": {"hostname": HOSTNAME_1},
    "PREDEFINED_NAME_2": {"hostname": HOSTNAME_2},
    ...
  },
  "count": COUNT,
  "minCount": MIN_COUNT,
  "locationPolicy": {
    "LOCATION_POLICY"
    },
    "targetShape": "TARGET_DISTRIBUTION_SHAPE"
  ...
}

更改下列內容:

  • PROJECT_ID:專案 ID。

  • REGION:要在其中建立 VM 的區域。

  • NAME_PATTERN:VM 的名稱模式。指定這個或 perInstanceProperties。使用一連串的雜湊 (#) 字元,讓 Compute Engine 替換成一連串的數字。舉例來說,使用 vm-# 做為名稱模式會產生 vm-1vm-2 等名稱的 VM,最多可達 --count 指定的 VM 數量,且該數量必須小於或等於名稱模式允許的 VM 數量。

    使用名稱模式時,Compute Engine 會檢查先前要求建立的現有 VM 名稱,盡量避免名稱衝突。

  • PREDEFINED_NAME_1PREDEFINED_NAME_2 等:要建立的 VM 預先定義名稱清單。指定這個或 namePattern。如果使用這個標記並指定 COUNTCOUNT 必須等於提供的名稱數量。

  • HOSTNAME_1HOSTNAME_2 等:要為 VM 指派的完整網域主機名稱。自訂主機名稱必須符合 RFC 1035 的有效主機名稱要求。

    舉例來說,如要建立兩個 VM vm-1vm-2,並分別使用 my-host1234.example.comtest.example.com 做為自訂主機名稱,請在 perInstanceProperties 中指定 hostname 屬性,如下所示:

    {
    ...
    "perInstanceProperties": {
    "vm-1": { "hostname": "my-host1234.example.com" },
    "vm-2": { "hostname": "test.example.com" },
    ...
    },
    
  • COUNT:要建立的 VM 數量。這個值必須小於或等於 NAME_PATTERN 允許的 VM 數量。或者,如果使用 perInstanceProperties,則不必指定 COUNT,但如果指定,則必須等於提供的名稱數量。

  • MIN_COUNT:要建立的 VM 數量下限。下表說明如何根據您設定這個標記的方式,決定要求的行為:

    說明
    未設定 預設值為 COUNT。如果 Compute Engine 無法建立 COUNT 指定數量的 VM,要求就會失敗,且不會建立任何 VM。
    1 Compute Engine 會盡可能建立 VM,最多 COUNT 個。
    大於 1 且小於 COUNT Compute Engine 會建立至少 MIN_COUNT 個 VM,最多 COUNT 個 VM。如果無法建立 MIN_COUNT VM,要求就會失敗,且不會建立任何 VM。
  • LOCATION_POLICY:要在區域內納入或排除的可用區。使用鍵/值組合清單,其中區域為鍵,政策為值。這項政策的有效值為 ALLOW (預設值) 和 DENY。以下是這個欄位的範例值:

    "locations": {
      "zones/us-central1-a": { "preference": "ALLOW" },
      "zones/us-central1-c": { "preference": "DENY"  },
      ...
    },
    
  • TARGET_DISTRIBUTION_SHAPE:VM 在指定可用區的分布情形。使用 locationPolicy 欄位指定區域。下表列出這個欄位的有效值:

    說明
    ANY_SINGLE_ZONE 強制將 VM 放置在單一可用區,並優先使用未使用的預留項目。這項功能可避免跨區域網路輸出,或縮短網路延遲時間。這是預設值。
    BALANCED 嘗試在區域內的所有可用區平均分配 VM。
    ANY 允許在區域中的多個可用區之間分配 VM。 選擇有可用資源的區域,並盡量減少未使用的區域預留項目。

查看大量建立 VM 要求狀態

建立突變要求時,Compute Engine 會傳回 operation 資源,您可以輪詢該資源來取得作業狀態。詳情請參閱「處理 API 回應」。

如要取得大量插入要求狀態,請將 HTTP GET 要求傳送operation 資源:

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations/OPERATION_ID

如要取得區域大量插入要求的狀態,請傳送下列要求:

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/operations/OPERATION_ID

更改下列內容:

  • PROJECT_ID:您要在其中建立 VM 的專案 ID
  • REGION:您要建立 VM 的區域
  • ZONE:您要建立 VM 的可用區
  • OPERATION_ID:大量插入作業 ID

回應中的 instancesBulkInsertOperationMetadata 物件包含作業的下列詳細資料:

  • status:狀態為下列其中一項:
    • CREATING:VM 正在建立中
    • ROLLING_BACK:要求失敗,正在復原
    • DONE:VM 建立或復原作業已順利完成
  • targetVmCount:要在指定可用區中建立的 VM 數量
  • createdVmCount:指定可用區中已建立的 VM 數量
  • failedToCreateVmCount:在指定可用區中無法建立的 VM 數量
  • deletedVmCount:因作業失敗而回溯時刪除的 VM 數量

回應中的 progress 欄位代表作業的完成百分比。

在 Compute Engine 成功建立至少最低數量的 VM,且不再建立 VM 或回溯要求之前,大量插入作業的狀態為 RUNNING

大量插入作業進行中時,您應該會看到類似下列內容的回應:

{
  "kind" : "compute#operation",
  "id": "4653028658507445766",
  "name": "operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "operationType": "bulkInsert",
  "targetLink":  "https://www.googleapis.com/compute/v1/projects/my-project"
  "targetId": 4653028658507445766,
  "status": "RUNNING",
  "progress": 2,
  "user": "example@google.com",
  "insertTime": "2023-04-23T09:57:13.474-07:00",
  "startTime": "2023-04-23T09:57:13.474-07:00",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/operations/operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "operationGroupId": "4653028658507445766",
  "metadata":
    "instances_bulk_insert_operation_metadata": {
      "per_location_status": {
         "zones/us-central1-a": {
           "status": "CREATING",
           "targetVmCount": 50,
           "createdVmCount": 1
         }
      }
    }
}

在本範例中,一個執行個體已成功建立,作業完成度為 2%。

當 Compute Engine 成功建立至少 minCount 指定的 VM 數量下限,或完成要求的回復作業時,作業會傳回 DONE 狀態。成功建立要求的 VM 數量後,您會收到類似下列內容的回應:

{
  "endTime": "2023-04-23T09:58:13.474-07:00",
  "id": "5053101474378293244",
  "insertTime": "2023-04-23T09:57:13.474-07:00",
  "instancesBulkInsertOperationMetadata": {
    "perLocationStatus": {
      "zones/us-central1-a": {
        "status": "DONE",
        "createdVmCount": 50,
        "targetVmCount": 50
      }
    }
  },
  "kind": "compute#operation",
  "name": "operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "operationGroupId": "4653028658507445766",
  "operationType": "bulkInsert",
  "progress": 100,
  "selfLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/operations/operation-1587661030638-5a3f823c143e3-e33bbfa3-bd72185c",
  "startTime": "2023-09-11T16:21:55.629-07:00",
  "status": "DONE",
  "targetId": "625521788110",
  "targetLink": "https://www.googleapis.com/compute/v1/projects/my-project",
  "user": "example@google.com",
  "zone": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a"
}

詳情請參閱 instancesBulkInsertOperationMetadata 物件的說明文件

檢查單一 VM 的狀態

如要檢查透過大量建立 VM 要求建立的單一 VM 狀態,請使用 gcloud CLI 或 Compute Engine API。

gcloud

  1. 從要求傳回的 Operation 中,取得 operationGroupId 屬性的值。

  2. 使用 operationGroupId 屬性做為 gcloud compute operations list 指令的篩選器,在專案的所有作業和可用區中,搜尋與區域或可用區要求相關聯的 VM:

    gcloud compute operations list \
       --filter=(operationGroupId=OPERATION_GROUP_ID)
    
  3. 如要取得 VM 的其餘屬性,請執行下列任一操作:

    • 在作業清單中,targetLink 代表 VM 的路徑。使用 gcloud compute instances describe 指令,並將這個路徑做為 VM 名稱,即可取得 VM 的屬性:

      gcloud compute instances describe VM_NAME
      
    • 使用 gcloud compute instances list 指令,並加入包含作業清單中 VM 名稱的篩選器:

      gcloud compute instances list VM_NAME \
         --filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      
    • 使用 gcloud compute instances list 指令,取得所有可用區和區域的 VM 屬性,並依執行個體專屬的標籤或名稱進行篩選:

      gcloud compute instances list \
         --filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      

REST

  1. 從要求傳回的 Operation 中,取得 operationGroupId 屬性的值。

  2. 使用 operationGroupId 屬性取得與區域或可用區要求相關聯的 VM 作業清單:

    • 如果您傳送的是區域要求,如要搜尋專案中所有作業和所有區域,請使用 globalOperations.aggregatedList 方法,並將 operationGroupId 屬性做為篩選器:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/aggregated/operations?filter=(operationGroupId=OPERATION_GROUP_ID)
      
    • 如果您傳送區域要求,請使用 zoneOperations.get 方法列出該區域的作業,並在要求主體中加入 operationGroupId 屬性:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/zones/ZONE/instances/bulkInsert
      
      {
      ...
      "operationGroupId":"OPERATION_GROUP_ID"
      ...
      }
      
  3. 如要取得 VM 的其餘屬性,請執行下列任一操作:

    • 在作業清單中,targetLink 代表 VM 的路徑。使用 instances.get 方法,並將這個路徑做為 VM 的名稱,即可取得 VM 的所有屬性:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/zones/ZONE/instances/VM_NAME
      
    • 使用 instances.get方法搭配篩選器,其中包含作業清單中的 VM 名稱:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/zones/ZONE/instances?filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      
    • 使用 instances.aggregatedList 方法,從所有區域取得 VM 的屬性,並依執行個體專屬的標籤或名稱進行篩選:

      GET https://compute.googleapis.com/compute/v1/projects/PROJECT_NAME/aggregated/instances?filter=(name=VM_NAME_1) OR (name=VM_NAME_2)
      

虛擬程式碼範例

下列虛擬程式碼範例說明如何自訂要求,以便大量建立 VM。

從一組區域中,在一個區域中大量建立 VM

下列虛擬程式碼說明如何從一組區域中,在一個區域內建立 1,000 個 VM。嘗試從一組區域在單一區域中大量建立 VM 時,要求會先檢查容量。如果容量不足,要求會立即失敗,並嘗試使用集合中的下一個區域。

  1. 指定要在可用區中建立的 VM 數量。

    nTarget = 1000
    
  2. 指定要嘗試在其中建立 VM 的區域。

    acceptableRegions = ["us-central1", "us-east1", "us-west1"]
    
  3. 逐一檢查各個區域,並嘗試在每個區域中建立 VM,直到成功為止。

    for region in acceptableRegions:
      call bulk API: region=region, location-policy=location-policy, count=nTarget
      if request succeeds and the operation succeeds:
        break
    

在可用區中,以機器類型大量建立 VM

下列虛擬程式碼說明如何在可用區中,以指定的機器類型建立多部 VM。嘗試以相同機器類型大量建立 VM 時,要求會先檢查這些機器類型是否可用。如果沒有足夠的機器類型可用,要求會立即失敗,並使用下一個機器類型重試。

  1. 指定要建立的 VM 數量,以及建立 VM 的區域。

    nTarget = 1000
    region = "us-central1"
    
  2. 指定要嘗試建立 VM 的機器系列。

    acceptableMachineFamilies = ["n2","c2","e2","n1"]
    
  3. 逐一嘗試使用機器類型建立 VM,直到成功為止。

    for family in acceptableMachineFamilies:
      call bulk APIs: region=region, count=nTarget, machineFamily=family
      if request succeeds and the operation succeeds:
        break
    

在一個可用區中建立超過 5,000 個 VM

大量建立 VM 時,每個要求只能建立 5,000 個 VM。 下列虛擬程式碼說明如何發出多項要求,在一個可用區中建立超過 5,000 個 VM。

  1. 指定要建立的 VM 數量、用來追蹤建立 VM 總數的計數器、要建立 VM 的區域,以及用來儲存 Compute Engine 建立 VM 的可用區的變數。

    nTarget = 10000
    nCreated = 0
    region = "us-central1"
    targetZone = ""
    
  2. 發出初始要求,建立 5,000 個 VM,儲存要求傳回的可用區,並更新已建立 VM 數量的計數器。

    call bulk API: region=region, count=5000
    targetZone = zone chosen by bulk API
    nCreated += # of VMs created
    
  3. 繼續向該區域發出要求,一次最多可建立 5,000 個 VM,直到 Compute Engine 建立指定數量的 VM 為止。

    while(nTarget - nCreated > 0):
      call bulk API: zone=targetZone, count=5000
      nCreated += # of VMs created
    

大量建立 VM 並查看狀態

下列程序說明如何建立一組具有預先定義名稱的 VM,然後查看其狀態:

  1. 指定要建立的 VM 數量、建立 VM 的可用區,以及用於儲存名稱的資料結構。

    nTarget = 1000
    targetZone = "us-central-1a"
    names = []
    
  2. 產生 VM 的模式化名稱,並將名稱新增至資料結構。

    for n in range(0, 1000):
      names.push("instance-%d".format(n))
    
  3. 建立 VM,並使用 perInstanceProperties 指定名稱。

    call bulk API(zone=targetZone, count=nTarget, names=perInstanceProperties)
    
  4. 使用 instances.list 方法,並篩選 VM 名稱,即可取得 VM 詳細資料。

    instances.list(filter=(name = "instance-1") OR (name = "instance-2") ...)
    

後續步驟

大量建立 VM 後,請執行下列任一或全部操作,簡化這些 VM 的管理作業: