從機器映像檔建立 Compute Engine 執行個體


建立機器映像檔後,您就能使用該映像檔複製來源 Compute 執行個體。如要進一步瞭解機器映像檔的用途,請參閱何時該使用機器映像檔

機器映像檔包含複製執行個體所需的大部分資訊和資料。

機器映像檔無法變更。不過,從機器映像檔建立執行個體時,您可以覆寫機器映像檔的幾乎所有屬性。

您可以使用Google Cloud 控制台Google Cloud CLIREST,透過機器映像檔建立執行個體。

事前準備

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

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

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    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.
      3. REST

        如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 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.

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

必要的角色

如要取得從機器映像檔建立 Compute Engine 執行個體所需的權限,請要求管理員授予您 Compute 執行個體或專案的 Compute 執行個體管理員 (v1) (roles/compute.instanceAdmin.v1) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

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

限制

從機器映像檔建立執行個體時,會受到以下限制:

  • 您最多可在 60 分鐘內,從來源機器映像檔建立 6 個執行個體。 如果超出這個限制,執行個體建立作業就會失敗,並傳回類似以下的錯誤:

    Operation rate exceeded for resource 'projects/test/global/machineImages/machine-image-1'.
    Too frequent operations from the source resource.
    

    如要建立的執行個體數量超過定義的限制 (60 分鐘內 6 個執行個體),請從來源執行個體建立額外的機器映像檔,或從新執行個體建立短期機器映像檔。接著,您就能從新的機器映像檔建立所需數量的執行個體。

  • 您無法使用 Google Cloud 控制台,從附加地區磁碟的機器映像檔建立執行個體。使用 Google Cloud CLI 或 REST,並為每個附加的區域磁碟指定 replicaZonesdeviceName 參數。詳情請參閱使用屬性覆寫從機器映像檔建立執行個體

從機器映像檔建立執行個體 (不覆寫)

如要建立完全以機器映像檔為基礎的執行個體,且不變更任何屬性,請使用這個方法。

主控台

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

    前往「建立執行個體」

  2. 在「從...建立 VM」 選單中,選取「機器映像檔」

  3. 在隨即顯示的「依據機器映像檔建立 VM」視窗中,執行下列操作:

    1. 選取機器映像檔。

    2. 如要建立並啟動執行個體,請按一下「建立」

gcloud

使用 gcloud compute instances create 指令從機器映像檔建立執行個體。

gcloud compute instances create INSTANCE_NAME \
    --zone=ZONE \
    --source-machine-image=SOURCE_MACHINE_IMAGE_NAME

更改下列內容:

  • INSTANCE_NAME:執行個體的名稱
  • ZONE:執行個體的區域
  • SOURCE_MACHINE_IMAGE_NAME:用於建立執行個體的機器映像檔

示例

舉例來說,您可以使用下列 gcloud 指令,從名為 my-machine-image 的機器映像檔,在 us-east1-b 區域中建立名為 my-instance 的執行個體。

gcloud compute instances create my-instance \
    --zone=us-east1-b \
    --source-machine-image=my-machine-image

建立執行個體後,輸出內容會類似以下內容:

Created [https://www.googleapis.com/compute/v1/projects/project-12345/zones/us-east1-b/instances/my-instance].
NAME               ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
my-instance        us-east1-b  e2-standard-2               192.0.2.1   203.224.0.113  RUNNING

REST

在 API 中,建構對 instances.insert 方法POST 要求。在要求主體中加入下列參數:

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

{
  "name": "INSTANCE_NAME",
  "sourceMachineImage": "SOURCE_MACHINE_IMAGE_URL"
}

更改下列內容:

  • PROJECT_ID:您的專案 ID
  • ZONE:執行個體的區域
  • INSTANCE_NAME:執行個體的名稱。
  • SOURCE_MACHINE_IMAGE_URL:要用於建立執行個體的機器映像檔完整或部分網址。舉例來說,如果您在名為 myProject 的專案中,有名為 my-machine-image 的機器映像檔,下列網址有效:

    • https://www.googleapis.com/compute/v1/projects/myProject/global/machineImages/my-machine-image
    • projects/myProject/global/machineImages/my-machine-image
    • global/machineImages/my-machine-image

從機器映像檔建立執行個體,並覆寫屬性

如果您想主要根據機器映像檔建立執行個體,但稍做一些變更,可使用覆寫行為。如要使用覆寫行為,您可在建立執行個體時傳入屬性,以覆寫現有機器映像檔屬性。

使用覆寫功能時,請注意下列事項:

  • 從機器映像檔建立執行個體時,除了磁碟名稱,您無法覆寫已連結磁碟的任何屬性。
  • 您必須為每個連結的區域磁碟指定 replicaZones 參數,以及機器映像檔中的區域磁碟 deviceName

  • 如果來源執行個體 (用於產生機器映像檔) 和新執行個體屬於同一專案和同一區域,則適用下列情況:

    • 來源執行個體和新執行個體的大部分屬性都相同。 例如系統自動指派的臨時 IP 位址。
    • 如果建立新執行個體時來源執行個體仍存在,新執行個體就無法使用與來源執行個體相同的名稱和區域。
  • 如果用於產生機器映像檔的來源執行個體和新執行個體屬於相同專案,但位於不同區域,則適用下列情況:

    • 您必須為新執行個體覆寫所有可用區和區域資源。舉例來說,如果您從機器映像檔建立執行個體,而該機器映像檔的來源執行個體屬於不同區域,則必須覆寫子網路和區域防火牆規則等區域資源。不過,負載平衡器和服務帳戶等全域資源不需要覆寫,除非您想修改這些資源。

主控台

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

    前往「建立執行個體」

  2. 在「從...建立 VM」 選單中,選取「機器映像檔」

  3. 在隨即顯示的「Create VM from machine image」(從機器映像檔建立 VM) 視窗中,選取範本,然後按一下 「Customize」(自訂)

  4. 視需要指定其他設定選項。詳情請參閱「建立執行個體時的設定選項」。

  5. 如要建立並啟動執行個體,請按一下「建立」

gcloud

使用 gcloud compute instances create 指令從機器映像檔建立執行個體,並新增要覆寫的屬性。

舉例來說,您可以使用下列 gcloud 指令,從名為 my-machine-image 的機器映像檔,在 us-east1-b 可用區中建立名為 my-instance 的 VM。在本範例中,系統會套用覆寫項目來變更機器類型、停止主機維護政策,並設定名為 regional-disk-0 的區域永久磁碟。

gcloud compute instances create my-instance \
    --zone=us-east1-b \
    --source-machine-image=my-machine-image \
    --machine-type=e2-standard-2 \
    --maintenance-policy=TERMINATE \
    --create-disk=device-name=boot-device-0,boot=true,auto-delete=true \
    --create-disk=device-name=regional-disk-0,\
      replica-zones=^:^us-east1-b:us-east1-c,boot=false

REST

如要在建立執行個體時覆寫機器映像檔屬性,請對 instances.insert 方法建構 POST 要求。在要求主體中,加入 sourceMachineImage 參數和任何需要的覆寫項目。您可以新增通常在建立執行個體時設定的任何屬性。舉例來說,如要覆寫機器類型,API 呼叫會包含 machineType 參數。

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

{
  "name": "INSTANCE_NAME",
  "machineType": "zones/ZONE/machineTypes/NEW_MACHINE_TYPE",
  "sourceMachineImage": "SOURCE_MACHINE_IMAGE_URL"
}

更改下列內容:

  • PROJECT_ID專案 ID
  • ZONE:執行個體的區域
  • INSTANCE_NAME:執行個體的名稱。
  • NEW_MACHINE_TYPE:要用於執行個體的機器類型
  • SOURCE_MACHINE_IMAGE_URL:要用於建立執行個體的機器映像檔完整或部分網址。舉例來說,如果您在名為 myProject 的專案中,有名為 my-machine-image 的機器映像檔,下列網址有效:

    • https://www.googleapis.com/compute/v1/projects/myProject/global/machineImages/my-machine-image
    • projects/myProject/global/machineImages/my-machine-image
    • global/machineImages/my-machine-image

覆寫行為

Compute Engine API 中的覆寫行為遵守 JSON 合併修補規則,如 RFC 7396 所述。總而言之,請遵守下列規則:

  • 若要覆寫基本欄位,則機器映像檔中對應的基本欄位,會替換成要求中指定的基本欄位值。基本欄位包括 machineTypename 等參數。
  • 若覆寫重複欄位,該屬性的所有重複值都將替換成要求中提供的對應值。重複欄位通常是類型為 list 的屬性。例如,disksnetworkInterfaces 是重複欄位。
  • 若要覆寫 nested object,則機器映像檔中的物件會與要求中的對應物件規格合併。請注意,如果巢狀物件存在於重複欄位之中,系統會依據重複欄位的規則處理欄位。此規則唯一的例外是標籤,即使標籤屬於 object 類型,也會將其視為重複欄位。

舉例來說,如果您想從機器映像檔建立 VM,並使用 VM 建立區域磁碟,請覆寫磁碟,以便指定 replicaZones 選項。由於 disks 欄位是重複欄位,因此您必須為所有附加磁碟和開機磁碟指定磁碟設定,而不只是區域磁碟。

POST https://compute.googleapis.com/compute/v1/projects/my-proj/zones/us-west1-a/instances
{
  "name": "vm-from-image",
  "sourceMachineImage": "global/machineImages/my-machine-image",
  "disks": [
    {
      "kind": "compute#attachedDisks",
      "boot": true,
      "autoDelete": true,
      "deviceName": "boot-device",
      "initializeParams": {
        "sourceImage": "projects/my-proj/global/images/my-image",
        "diskType": "projects/my-proj/zones/us-west1-a/diskTypes/pd-standard",
      }
    },
    {
      "kind": "compute#attachedDisk",
      "boot": false,
      "autoDelete": true,
      "deviceName": "regional-device-0",
      "initializeParams": {
         "diskType": "projects/my-proj/zones/us-west1-a/diskTypes/pd-standard",
         "replicaZones": [
            "projects/my-proj/zones/us-west1-a",
            "projects/my-proj/zones/us-west1-c"
         ]
      }
    }
  ]
}

使用其他專案的機器映像檔建立執行個體

使用其他專案的機器映像檔建立執行個體時,您可能無法存取附加至該來源專案的服務帳戶。如要從其他專案的機器映像檔建立執行個體,請務必確認您有權存取該機器映像檔,並覆寫新執行個體的服務帳戶屬性。

如果您在共用虛擬私有雲網路的專案之間共用機器映像檔,從機器映像檔建立執行個體時,必須明確指定共用虛擬私有雲詳細資料。舉例來說,在非主專案中建立執行個體時,請使用 --network--subnet--network-interface 旗標,提供主專案的共用虛擬私有雲詳細資料。

以下各節說明如何使用 Google Cloud CLI,從位於不同專案的機器映像檔建立執行個體。

  1. 授予存取權,存取儲存在其他專案中的機器映像檔。

    您可以在來源專案或機器映像檔上授予權限。使用 gcloud compute machine-images add-iam-policy-binding 指令授予機器映像檔權限。

    gcloud compute machine-images add-iam-policy-binding MACHINE_IMAGE_NAME \
        --project=MACHINE_IMAGE_PROJECT \
        --member='ACCOUNT_EMAIL' \
        --role='roles/compute.admin'
    

    更改下列內容:

    • MACHINE_IMAGE_PROJECT:包含來源機器映像檔的專案 ID。
    • MACHINE_IMAGE_NAME:要新增權限繫結的機器映像檔名稱。
    • ACCOUNT_EMAIL:建立執行個體的serviceAccountuser的電子郵件地址。請確認電子郵件格式包含必要前置字串。前置字元必須是下列其中一項:

      • user: 如果電子郵件地址與使用者帳戶相關聯,請指定這個欄位。例如:user:user@example.com
      • serviceAccount: 如果電子郵件地址與服務帳戶相關聯,請指定這項屬性。例如:serviceAccount:123456789000-compute@developer.gserviceaccount.com

    示例

    舉例來說,如要將 compute.admin 繫結新增至名為 my-machine-image 的機器映像檔,並新增至服務帳戶電子郵件地址 123456789000-compute@developer.gserviceaccount.com,請使用下列 gcloud CLI 指令:

    gcloud compute machine-images add-iam-policy-binding my-machine-image \
        --project=machine-image-project \
        --member='serviceAccount:123456789000-compute@developer.gserviceaccount.com' \
        --role='roles/compute.admin'
    
  2. 將與機器映像檔相關聯的服務帳戶服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予執行 gcloud compute instances create 指令的使用者。

  3. 使用 gcloud compute instances create 指令從機器映像檔建立執行個體。

    gcloud compute instances create INSTANCE_NAME \
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE \
        --source-machine-image=projects/MACHINE_IMAGE_PROJECT/global/machineImages/MACHINE_IMAGE_NAME \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --subnet=SUBNET
    

    更改下列內容:

    • INSTANCE_PROJECT_ID:要在其中建立執行個體的專案 ID
    • INSTANCE_NAME:執行個體的名稱
    • ZONE:執行個體的區域
    • MACHINE_IMAGE_PROJECT:機器映像檔所在專案的專案 ID
    • MACHINE_IMAGE_NAME:用於建立執行個體的機器映像檔
    • SERVICE_ACCOUNT_EMAIL:要附加至執行個體的服務帳戶電子郵件地址
    • SUBNET:如果子網路和執行個體位於同一個專案中,請將 SUBNET 替換為與執行個體位於相同區域的子網路名稱

      如要在共用虛擬私有雲網路中指定子網路,請將 SUBNET 替換為下列格式的字串:

      projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
      

      取代下列項目:

      • HOST_PROJECT_ID:共用 VPC 主專案的專案 ID
      • REGION:子網路的區域
      • SUBNET_NAME:子網路名稱

      示例

      舉例來說,下列指令會在 us-east1-b 可用區的 vm-project 中,從名為 my-machine-image 的機器映像檔建立名為 my-instance 的 VM。

      --service-account 旗標會指定要附加至新建立 VM 的服務帳戶。如未提供這個標記,來源服務帳戶就無法在兩個專案之間共用,作業也會失敗。

      gcloud compute instances create my-instance \
       --project=vm-project \
       --zone=us-east1-b \
       --source-machine-image=projects/machine-image-project/global/machineImages/my-machine-image \
       --service-account=000123456789-compute@developer.gserviceaccount.com
      

      建立 VM 後,輸出內容會類似以下內容:

      Created [https://www.googleapis.com/compute/v1/projects/project-12345/zones/us-east1-b/instances/my-instance].
      NAME               ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
      my-instance        us-east1-b  e2-standard-2               192.0.2.1   203.224.0.113  RUNNING
      

後續步驟