大量建立 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. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.

    REST

    To use the REST API samples on this page in a local development environment, you use the credentials you provide to the gcloud CLI.

      After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    For more information, see Authenticate for using REST in the Google Cloud authentication documentation.

必要的角色

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

這個預先定義的角色包含大量建立虛擬機器所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要大量建立 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,但如果指定,則 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,但如果指定,則 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, ...]: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,但如果指定,則 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 回應」。

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

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 最小數量,或是 Compute Engine 完成要求的回溯時,作業會傳回狀態 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 狀態

以下程序說明如何建立一組具有預先定義名稱的 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 的管理作業: