大量建立 VM

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

如要進一步瞭解相關限制,請參閱「關於大量建立 VM」一文。如要建立附加 GPU 的執行個體,請參閱「大量建立 GPU VM」。

事前準備

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

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

    gcloud

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

      gcloud init

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

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

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

      安裝 Google Cloud CLI。

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

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

必要的角色

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

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

所需權限

如要大量建立 VM,必須具備下列權限:

  • compute.instances.create 專案
  • 如要使用自訂映像檔建立 VM: compute.images.useReadOnly 映像檔
  • 如要使用快照建立 VM,請按照下列步驟操作: compute.snapshots.useReadOnly 在快照上
  • 如要使用執行個體範本建立 VM,請按照下列步驟操作: compute.instanceTemplates.useReadOnly 在執行個體範本上
  • 如要為 VM 指定子網路: compute.subnetworks.use 在專案或所選子網路上
  • 如要為 VM 指定靜態 IP 位址: compute.addresses.use 專案
  • 使用虛擬私有雲網路時,如要將外部 IP 位址指派給 VM,請在專案或所選子網路上執行下列步驟: compute.subnetworks.useExternalIp
  • 如要將舊版網路指派給 VM,請按照下列步驟操作: compute.networks.use 在專案中
  • 使用舊版網路時,如要為 VM 指派外部 IP 位址,請執行下列步驟: compute.networks.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-1 和 vm-2 等 VM 名稱,最多可達 --count 指定的 VM 數量,且該數量必須小於或等於名稱模式允許的 VM 數量。

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

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

  • 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-1 和 vm-2 等的 VM,最多可達 --count 指定的 VM 數量,且必須小於或等於名稱模式允許的 VM 數量。

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

  • PREDEFINED_NAME_1、PREDEFINED_NAME_2、...:要建立的 VM 預先定義名稱清單。請指定這個或 namePattern。如果使用這個旗標並指定 COUNT,COUNT 必須等於提供的名稱數量。

  • 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-1 和 vm-2 等 VM 名稱,最多可達 --count 指定的 VM 數量,且該數量必須小於或等於名稱模式允許的 VM 數量。

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

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

  • 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-1 和 vm-2 等 VM 名稱,最多可產生 --count 指定的 VM 數量,且該數量必須小於或等於名稱模式允許的 VM 數量。

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

  • PREDEFINED_NAME_1、PREDEFINED_NAME_2、...:要建立的 VM 預先定義名稱清單。請指定這個或 namePattern。如果使用這個旗標並指定 COUNT,COUNT 必須等於提供的名稱數量。

  • 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-1 和 vm-2 等 VM 名稱,最多可達 --count 指定的 VM 數量,且該數量必須小於或等於名稱模式允許的 VM 數量。

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

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

  • [VM_NAME=HOSTNAME, ...]: 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-1 和 vm-2 等的 VM,最多可達 --count 指定的 VM 數量,且必須小於或等於名稱模式允許的 VM 數量。

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

  • PREDEFINED_NAME_1、PREDEFINED_NAME_2 等:要建立的 VM 預先定義名稱清單。請指定這個或 namePattern。如果使用這個旗標並指定 COUNT,COUNT 必須等於提供的名稱數量。

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

    舉例來說,如要建立兩個 VM vm-1 和 vm-2,並分別使用自訂主機名稱 my-host1234.example.com 和 test.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 物件會在 perLocationStatus 欄位中,包含各區域的作業詳細資料。對於大量建立要求中包含的每個區域,perLocationStatus 包含下列欄位:

  • status:狀態為下列其中一種:
    • CREATING:正在可用區中建立 VM。
    • ROLLING_BACK:要求在可用區中失敗,正在復原。
    • DONE:已在可用區中成功建立或復原 VM。
  • targetVmCount:Compute Engine 嘗試在可用區中建立的 VM 數量。Compute Engine 會在初始檢查後決定這個數量,且在作業期間不會變更。檢查作業狀態時,每個區域一律會顯示這個欄位。
  • createdVmCount:可用區中已建立的 VM 數量。在特定可用區中,這個值不會超過 targetVmCount。
    • 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 數量和區域。

    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 的管理作業: