從機器映像檔建立 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. 安裝 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 驗證說明文件中的「使用 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 個執行個體),請從來源執行個體建立額外的機器映像檔,或從新執行個體建立短期機器映像檔。接著,您就能從新的機器映像檔建立所需數量的執行個體。

  • 如果您使用 gcloud CLI 或 REST,從具有 CMEK 加密磁碟的機器映像檔建立執行個體,除非您指定 CMEK 金鑰,否則新執行個體上的磁碟會使用預設加密功能。如果您使用 Google Cloud 控制台,系統會自動沿用 CMEK 加密。

  • 您無法使用 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

CMEK 加密注意事項:從以客戶自行管理的加密金鑰 (CMEK) 加密的機器映像檔建立 VM 時,gcloud CLI 預設會使用 Google 代管加密功能,為新 VM 的磁碟加密。這與 Google Cloud 控制台不同,後者會自動從來源機器映像檔繼承 CMEK。

如要確保新 VM 的磁碟從來源機器映像檔繼承 CMEK (複製 Google Cloud 控制台的行為),您必須使用 --create-disk 旗標,為要保留 CMEK 加密的每個磁碟明確提供磁碟設定。旗標中指定的 device-name 必須與來源機器映像檔中的磁碟裝置名稱完全相符。

請使用下列指令結構保留 CMEK 加密。以下範例說明如何保留開機磁碟 (boot=yes) 和非開機磁碟 (boot=no) 的 CMEK 加密。

gcloud compute instances create INSTANCE_NAME \
    --zone=ZONE \
    --source-machine-image=SOURCE_MACHINE_IMAGE \
    --create-disk=auto-delete=yes,boot=yes,device-name=DEVICE_NAME_IN_IMAGE,kms-key=KMS_KEY,kms-project=KMS_PROJECT,kms-location=KMS_LOCATION,kms-keyring=KMS_KEYRING \
    --create-disk=auto-delete=yes,boot=no,device-name=DEVICE_NAME_IN_IMAGE,kms-key=KMS_KEY,kms-project=KMS_PROJECT,kms-location=KMS_LOCATION,kms-keyring=KMS_KEYRING

更改下列內容:

  • INSTANCE_NAME:新 VM 執行個體的名稱。
  • ZONE:新 VM 執行個體的可用區。
  • SOURCE_MACHINE_IMAGE:來源機器映像檔的名稱。
  • DEVICE_NAME_IN_IMAGE:磁碟 (開機或非開機) 的裝置名稱,如來源機器映像檔中所定義。
  • KMS_KEY:CMEK 金鑰的名稱。
  • KMS_PROJECT:金鑰所在的專案。
  • KMS_LOCATION:金鑰的位置。
  • KMS_KEYRING:金鑰的金鑰環。

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

CMEK 加密注意事項

從以客戶管理的加密金鑰 (CMEK) 加密的機器映像檔建立 VM 時,預設 instances.insert 要求會導致新 VM 的磁碟以 Google 管理的加密方式加密。

如要確保新 VM 和磁碟是以與來源機器映像檔相同的 CMEK 建立 (複製Google Cloud 控制台的行為),您必須覆寫 disks 屬性,為要保留 CMEK 加密的每個磁碟 (開機或非開機) 指定 diskEncryptionKey

以下範例顯示保留來源機器映像檔 CMEK 加密的要求主體。請注意,由於 disks 是重複欄位,您必須為從映像檔建立的所有磁碟指定設定。

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

{
  "name": "INSTANCE_NAME",
  "sourceMachineImage": "SOURCE_MACHINE_IMAGE_URL",
  "disks": [
    {
      "boot": true,
      "autoDelete": true,
      "deviceName": "DEVICE_NAME_IN_IMAGE",
      "diskEncryptionKey": {
        "kmsKeyName": "projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING/cryptoKeys/KMS_KEY"
      }
    },
    {
      "boot": false,
      "autoDelete": true,
      "deviceName": "DEVICE_NAME_IN_IMAGE",
      "diskEncryptionKey": {
        "kmsKeyName": "projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING/cryptoKeys/KMS_KEY"
      }
    }
  ]
}

更改下列內容:

  • PROJECT_ID:您的專案 ID
  • ZONE:執行個體的區域
  • INSTANCE_NAME:新 VM 執行個體的名稱。
  • 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
  • DEVICE_NAME_IN_IMAGE:磁碟 (開機或非開機) 的裝置名稱,如來源機器映像檔中所定義。

  • KMS_PROJECT:金鑰所在的專案。

  • KMS_LOCATION:金鑰的位置。

  • KMS_KEYRING:金鑰的金鑰環。

  • KMS_KEY:CMEK 金鑰的名稱。

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

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

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

  • 從機器映像檔建立執行個體時,除了磁碟名稱,您無法覆寫已連結磁碟的任何屬性。
  • 您必須為每個附加的區域磁碟指定 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:共用虛擬私有雲主專案的專案 ID
      • REGION:子網路的區域
      • SUBNET_NAME:子網路名稱

      示例

      舉例來說,下列指令會從名為 my-machine-image 的機器映像檔,在 us-east1-b 可用區的 vm-project 中建立名為 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
      

後續步驟