建立機器映像檔後,您就能使用該映像檔複製來源 Compute 執行個體。如要進一步瞭解機器映像檔的用途,請參閱何時該使用機器映像檔。
機器映像檔包含複製執行個體所需的大部分資訊和資料。
機器映像檔無法變更。不過,從機器映像檔建立執行個體時,您可以覆寫機器映像檔的幾乎所有屬性。
您可以使用Google Cloud 控制台、Google Cloud CLI 或 REST,透過機器映像檔建立執行個體。
事前準備
-
如果尚未設定驗證,請先完成設定。
驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:
選取這個頁面上的分頁,瞭解如何使用範例:
控制台
使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,無須設定驗證。
gcloud
-
安裝 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 進行驗證」。
必要的角色
如要取得從機器映像檔建立 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,並為每個附加的區域磁碟指定
replicaZones和deviceName參數。詳情請參閱「使用屬性覆寫從機器映像檔建立執行個體」。
從機器映像檔建立執行個體 (不覆寫)
如要建立完全以機器映像檔為基礎的執行個體,且不變更任何屬性,請使用這個方法。
控制台
前往 Google Cloud 控制台的「Create an instance」(建立執行個體) 頁面。
在「從...建立 VM」 選單中,選取「機器映像檔」。
在隨即顯示的「依據機器映像檔建立 VM」視窗中,執行下列操作:
選取機器映像檔。
如要建立並啟動執行個體,請按一下「建立」。
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-imageprojects/myProject/global/machineImages/my-machine-imageglobal/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-imageprojects/myProject/global/machineImages/my-machine-imageglobal/machineImages/my-machine-image
DEVICE_NAME_IN_IMAGE:磁碟 (開機或非開機) 的裝置名稱,如來源機器映像檔中所定義。KMS_PROJECT:金鑰所在的專案。KMS_LOCATION:金鑰的位置。KMS_KEYRING:金鑰的金鑰環。KMS_KEY:CMEK 金鑰的名稱。
從機器映像檔建立執行個體,並覆寫屬性
如果您想主要根據機器映像檔建立執行個體,但稍做一些變更,可使用覆寫行為。如要使用覆寫行為,您可在建立執行個體時傳入屬性,以覆寫現有機器映像檔屬性。
使用覆寫功能時,請注意下列事項:
- 從機器映像檔建立執行個體時,除了磁碟名稱,您無法覆寫已連結磁碟的任何屬性。
您必須為每個連結的區域磁碟指定
replicaZones參數,以及機器映像檔中的區域磁碟deviceName。如果來源執行個體 (用於產生機器映像檔) 和新執行個體屬於同一專案和同一區域,則適用下列情況:
- 來源執行個體和新執行個體的大部分屬性都相同。 例如系統自動指派的臨時 IP 位址。
- 如果建立新執行個體時來源執行個體仍存在,新執行個體就無法使用與來源執行個體相同的名稱和區域。
如果用於產生機器映像檔的來源執行個體和新執行個體屬於相同專案,但位於不同區域,則適用下列情況:
- 您必須為新執行個體覆寫所有可用區和區域資源。 舉例來說,如果您從來源執行個體屬於不同區域的機器映像檔建立執行個體,則需要覆寫子網路和區域防火牆規則等區域資源。不過,除非您想修改負載平衡器和服務帳戶等全域資源,否則不需要覆寫這些資源。
控制台
前往 Google Cloud 控制台的「Create an instance」(建立執行個體) 頁面。
在「從...建立 VM」 選單中,選取「機器映像檔」。
在隨即顯示的「Create VM from machine image」(從機器映像檔建立 VM) 視窗中,選取範本,然後按一下 「Customize」(自訂)。
選用:指定其他設定選項。詳情請參閱「建立執行個體時的設定選項」。
如要建立並啟動執行個體,請按一下「建立」。
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-imageprojects/myProject/global/machineImages/my-machine-imageglobal/machineImages/my-machine-image
覆寫行為
Compute Engine API 中的覆寫行為遵守 JSON 合併修補規則,如 RFC 7396 所述。總而言之,請遵守下列規則:
- 若要覆寫基本欄位,則機器映像檔中對應的基本欄位,會替換成要求中指定的基本欄位值。基本欄位包括
machineType和name等參數。 - 若覆寫重複欄位,該屬性的所有重複值都將替換成要求中提供的對應值。重複欄位通常是類型為
list的屬性。例如,disks和networkInterfaces是重複欄位。 - 若要覆寫
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"
]
}
}
]
}
使用其他專案的機器映像檔建立執行個體
使用其他專案的機器映像檔建立執行個體時,您可能無法存取附加至該來源專案的服務帳戶。如要從其他專案的機器映像檔建立執行個體,請務必確認您有權存取該機器映像檔,並覆寫新執行個體的服務帳戶屬性。
如果您在共用虛擬私有雲網路的專案之間共用機器映像檔,從機器映像檔建立執行個體時,必須明確指定 Shared VPC 詳細資料。舉例來說,在非主專案中建立執行個體時,請使用 --network、--subnet 或 --network-interface 旗標,提供主專案的共用虛擬私有雲詳細資料。
以下各節說明如何使用 Google Cloud CLI,從位於不同專案的機器映像檔建立執行個體。
授予存取權,存取儲存在其他專案中的機器映像檔。
您可以在來源專案或機器映像檔上授予權限。使用
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:建立執行個體的serviceAccount或user的電子郵件地址。請確認電子郵件格式包含必要前置字元。前置字元必須是下列其中一種: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'將與機器映像檔相關聯的服務帳戶的服務帳戶使用者角色 (
roles/iam.serviceAccountUser) 授予執行gcloud compute instances create指令的使用者。使用
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:您要在當中建立執行個體的專案 IDINSTANCE_NAME:執行個體的名稱ZONE:執行個體的區域MACHINE_IMAGE_PROJECT:機器映像檔所在專案的專案 IDMACHINE_IMAGE_NAME:要從中建立執行個體的機器映像檔SERVICE_ACCOUNT_EMAIL:要附加至執行個體的服務帳戶電子郵件地址SUBNET:如果子網路和執行個體位於同一個專案中,請將 SUBNET 替換為與執行個體位於相同區域的子網路名稱如要在 Shared VPC 網路中指定子網路,請將
SUBNET替換為下列格式的字串:projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
請替換下列項目:
HOST_PROJECT_ID:Shared VPC 主專案的專案 IDREGION:子網路的區域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
後續步驟
- 進一步瞭解機器映像檔
- 進一步瞭解如何建立 Compute Engine 執行個體