שחזור מתמונת מצב

דיסק יכול להיות דיסק אתחול שמשמש להפעלה של מערכת ההפעלה במכונה וירטואלית, או דיסק שאינו דיסק אתחול ומשמש את המכונה רק לאחסון נתונים.

אתם יכולים להשתמש בתמונות מצב כדי לגבות ולשחזר נתונים בדיסק בדרכים הבאות:

לפני שמתחילים

התפקידים הנדרשים

כדי לקבל את ההרשאות שנדרשות לשחזור מתמונת מצב, צריך לבקש מהאדמין להקצות לכם ב-IAM את התפקיד אדמין מכונות של Compute ‏ (v1) (roles/compute.instanceAdmin.v1) בפרויקט. כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

זהו תפקיד שמוגדר מראש וכולל את ההרשאות שנדרשות לשחזור מתמונת מצב. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:

ההרשאות הנדרשות

כדי לשחזר מתמונת מצב, צריך את ההרשאות הבאות:

  • כדי ליצור דיסק מ-snapshot בהיקף גלובלי (ברירת מחדל):
    • compute.disks.create בפרויקט
    • compute.instances.attachDisk במופע
    • compute.disks.use בדיסק שרוצים לצרף
    • compute.snapshots.useReadOnly,‏ compute.snapshots.create או compute.disks.createSnapshot בפרויקט
  • כדי ליצור דיסק מקובץ snapshot בהיקף אזורי:
    • compute.disks.create בפרויקט
    • compute.instances.attachDisk במופע
    • compute.disks.use בדיסק שרוצים לצרף
    • compute.snapshots.useReadOnly בפרויקט
  • כדי ליצור מכונה מקובץ snapshot של דיסק אתחול ודיסק שאינו דיסק אתחול, צריך לפחות את ההרשאות הבאות:
    • compute.instances.create בפרויקט
    • compute.snapshots.useReadOnly בתמונת המצב
    • compute.disks.create בפרויקט
    • compute.disks.use בדיסק
    • compute.instances.attachDisk במופע

יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.

מגבלות

  • הדיסק החדש צריך להיות לפחות באותו גודל כמו דיסק המקור המקורי של ה-snapshot. אם יוצרים דיסק שגדול יותר מדיסק המקור המקורי של תמונת המצב, צריך לשנות את הגודל של מערכת הקבצים בדיסק הזה כדי לכלול את נפח האחסון הנוסף בדיסק. יכול להיות שתצטרכו להשתמש בכלי אחר לשינוי גודל של מערכת קבצים, בהתאם למערכת ההפעלה ולסוג מערכת הקבצים. מידע נוסף זמין במסמכי מערכת ההפעלה.

  • אפשר ליצור דיסקים אזוריים או דיסקים אזוריים חדשים מתמונת מצב נתונה פעם אחת לכל היותר כל עשר דקות. אם רוצים לשלוח מספר גדול של בקשות ליצירת תמונת מצב של הדיסקים, אפשר לשלוח לכל היותר 6 בקשות ב-60 דקות. המגבלה הזו לא חלה כשיוצרים דיסקים אזוריים מתמונת מצב. מידע נוסף זמין במאמר בנושא מגבלות על תדירות יצירת תמונות מצב.

יצירת דיסק מקובץ snapshot וצירוף שלו למכונה (אופציונלי)

אם גיביתם דיסק אתחול או דיסק שאינו דיסק אתחול באמצעות קובץ snapshot, תוכלו ליצור דיסק חדש על סמך קובץ ה-snapshot.

המסוף

  1. נכנסים לדף Snapshots במסוף Google Cloud .

    כניסה לדף Snapshots

  2. מוצאים את השם של התמונה של מצב המערכת שרוצים לשחזר.

  3. נכנסים לדף Disks.

    לדף Disks

  4. לוחצים על יצירת דיסק חדש.

  5. מציינים את פרמטרי ההגדרה הבאים:

    • שם הדיסק.
    • סוג הדיסק.
    • אפשר גם לשנות את בחירת האזור והתחום שמוגדרים כברירת מחדל. אפשר לבחור כל אזור ותחום, בלי קשר למיקום האחסון של תמונת המצב של המקור.
  6. בקטע סוג המקור, לוחצים על Snapshot (קובץ snapshot).

  7. בוחרים את שם התמונה של מצב המערכת שרוצים לשחזר.

  8. בוחרים את הגודל של הדיסק החדש, בגיגה-בייט. המספר הזה צריך להיות שווה לגודל של דיסק המקור המקורי של התמונה או גדול ממנו.

  9. לוחצים על Create כדי ליצור את הדיסק.

אפשר גם לצרף דיסק שאינו דיסק אתחול למופע.

gcloud

  1. משתמשים בפקודה gcloud compute snapshots list כדי למצוא את השם של תמונת המצב שרוצים לשחזר:

    gcloud compute snapshots list
    
  2. משתמשים בפקודה gcloud compute snapshots describe כדי למצוא את הגודל של התמונה המיידית שרוצים לשחזר:

    gcloud compute snapshots describe SNAPSHOT_NAME
    

    מחליפים את SNAPSHOT_NAME בשם של תמונת המצב שמשוחזרת.

  3. משתמשים בפקודה gcloud compute disks create כדי ליצור דיסק אזורי או דיסק של אזור זמינות חדש מקובץ ה-snapshot. אפשר לכלול את הדגל --type כדי לציין את סוג הדיסק שרוצים ליצור.

    • כדי ליצור דיסק אזורי מקובץ snapshot בהיקף גלובלי:
    gcloud compute disks create DISK_NAME \
        --zone=ZONE \
        --size=DISK_SIZE \
        --source-snapshot=SNAPSHOT_NAME \
        --type=DISK_TYPE
    
    gcloud beta compute disks create DISK_NAME \
        --zone=ZONE \
        --source-snapshot=SNAPSHOT_NAME \
        --source-snapshot-region=SOURCE_REGION \
        --type=DISK_TYPE
    
    • כדי ליצור דיסק אזורי מקובץ snapshot בהיקף גלובלי:
    gcloud beta compute disks create DISK_NAME \
        --size=DISK_SIZE \
        --source-snapshot=SNAPSHOT_NAME \
        --type=DISK_TYPE \
        --region=REGION \
        --replica-zones=ZONE1,ZONE2
    
    gcloud beta compute disks create DISK_NAME \
        --size=DISK_SIZE \
        --source-snapshot=SNAPSHOT_NAME \
        --source-snapshot-region=SOURCE_REGION \
        --type=DISK_TYPE \
        --region=REGION \
        --replica-zones=ZONE1,ZONE2
    

    מחליפים את מה שכתוב בשדות הבאים:

    • DISK_NAME: השם של הדיסק החדש
    • DISK_SIZE: גודל הדיסק החדש, בגיביבייט (GiB). המספר הזה צריך להיות שווה לדיסק המקור המקורי של התמונה או גדול ממנו.
    • SNAPSHOT_NAME: השם של ה-snapshot שמשוחזר
    • DISK_TYPE: הסוג של הדיסק, לדוגמה:,‏ pd-ssd,‏ ,‏ hyperdisk-throughput או hyperdisk-balanced-high-availability
    • REGION: האזור שבו הדיסק האזורי נמצא, לדוגמה: europe-west1
    • SOURCE_REGION: האזור שקובץ ה-snapshot של המקור מוגבל אליו
    • ZONE: האזור שבו הדיסק החדש ימוקם
    • ZONE1,ZONE2: האזורים באזור שבו נמצאות שתי העתקי הדיסק, לדוגמה: europe-west1-b ו-europe-west1-c
  4. אופציונלי: כדי לצרף את הדיסק החדש למכונה קיימת, משתמשים בפקודה gcloud compute instances attach-disk:

    gcloud compute instances attach-disk INSTANCE_NAME \
        --disk DISK_NAME
    

    מחליפים את מה שכתוב בשדות הבאים:

    • INSTANCE_NAME: השם של המכונה
    • DISK_NAME: השם של הדיסק שנוצר מקובץ ה-snapshot

המשך

Go

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של Compute Engine באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Compute Engine Go API.

כדי לבצע אימות ב-Compute Engine, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"google.golang.org/protobuf/proto"
)

// createDiskFromSnapshot creates a new disk in a project in given zone.
func createDiskFromSnapshot(
	w io.Writer,
	projectID, zone, diskName, diskType, snapshotLink string,
	diskSizeGb int64,
) error {
	// projectID := "your_project_id"
	// zone := "us-west3-b" // should match diskType below
	// diskName := "your_disk_name"
	// diskType := "zones/us-west3-b/diskTypes/pd-ssd"
	// snapshotLink := "projects/your_project_id/global/snapshots/snapshot_name"
	// diskSizeGb := 120

	ctx := context.Background()
	disksClient, err := compute.NewDisksRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewDisksRESTClient: %w", err)
	}
	defer disksClient.Close()

	req := &computepb.InsertDiskRequest{
		Project: projectID,
		Zone:    zone,
		DiskResource: &computepb.Disk{
			Name:           proto.String(diskName),
			Zone:           proto.String(zone),
			Type:           proto.String(diskType),
			SourceSnapshot: proto.String(snapshotLink),
			SizeGb:         proto.Int64(diskSizeGb),
		},
	}

	op, err := disksClient.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create disk: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Disk created\n")

	return nil
}

Java

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של Compute Engine באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Compute Engine Java API.

כדי לבצע אימות ב-Compute Engine, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.


import com.google.cloud.compute.v1.Disk;
import com.google.cloud.compute.v1.DisksClient;
import com.google.cloud.compute.v1.InsertDiskRequest;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateDiskFromSnapshot {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.

    // Project ID or project number of the Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";

    // Name of the zone in which you want to create the disk.
    String zone = "europe-central2-b";

    // Name of the disk you want to create.
    String diskName = "YOUR_DISK_NAME";

    // The type of disk you want to create. This value uses the following format:
    // "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
    // For example: "zones/us-west3-b/diskTypes/pd-ssd"
    String diskType = String.format("zones/%s/diskTypes/pd-ssd", zone);

    // Size of the new disk in gigabytes.
    long diskSizeGb = 10;

    // The full path and name of the snapshot that you want to use as the source for the new disk.
    // This value uses the following format:
    // "projects/{projectName}/global/snapshots/{snapshotName}"
    String snapshotLink = String.format("projects/%s/global/snapshots/%s", projectId,
        "SNAPSHOT_NAME");

    createDiskFromSnapshot(projectId, zone, diskName, diskType, diskSizeGb, snapshotLink);
  }

  // Creates a new disk in a project in given zone, using a snapshot.
  public static void createDiskFromSnapshot(String projectId, String zone, String diskName,
      String diskType, long diskSizeGb, String snapshotLink)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `disksClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (DisksClient disksClient = DisksClient.create()) {

      // Set the disk properties and the source snapshot.
      Disk disk = Disk.newBuilder()
          .setName(diskName)
          .setZone(zone)
          .setSizeGb(diskSizeGb)
          .setType(diskType)
          .setSourceSnapshot(snapshotLink)
          .build();

      // Create the insert disk request.
      InsertDiskRequest insertDiskRequest = InsertDiskRequest.newBuilder()
          .setProject(projectId)
          .setZone(zone)
          .setDiskResource(disk)
          .build();

      // Wait for the create disk operation to complete.
      Operation response = disksClient.insertAsync(insertDiskRequest)
          .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Disk creation failed!" + response);
        return;
      }
      System.out.println("Disk created. Operation Status: " + response.getStatus());
    }
  }
}

Node.js

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של Compute Engine באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Compute Engine Node.js API.

כדי לבצע אימות ב-Compute Engine, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const zone = 'europe-central2-b';
// const diskName = 'YOUR_DISK_NAME';
// const diskType = 'zones/us-west3-b/diskTypes/pd-ssd';
// const diskSizeGb = 10;
// const snapshotLink = 'projects/project_name/global/snapshots/snapshot_name';

const compute = require('@google-cloud/compute');

async function createDiskFromSnapshot() {
  const disksClient = new compute.DisksClient();

  const [response] = await disksClient.insert({
    project: projectId,
    zone,
    diskResource: {
      sizeGb: diskSizeGb,
      name: diskName,
      zone,
      type: diskType,
      sourceSnapshot: snapshotLink,
    },
  });
  let operation = response.latestResponse;
  const operationsClient = new compute.ZoneOperationsClient();

  // Wait for the create disk operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
      zone: operation.zone.split('/').pop(),
    });
  }

  console.log('Disk created.');
}

createDiskFromSnapshot();

Python

Python

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של Compute Engine באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Compute Engine Python API.

כדי לבצע אימות ב-Compute Engine, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def create_disk_from_snapshot(
    project_id: str,
    zone: str,
    disk_name: str,
    disk_type: str,
    disk_size_gb: int,
    snapshot_link: str,
) -> compute_v1.Disk:
    """
    Creates a new disk in a project in given zone.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone in which you want to create the disk.
        disk_name: name of the disk you want to create.
        disk_type: the type of disk you want to create. This value uses the following format:
            "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
            For example: "zones/us-west3-b/diskTypes/pd-ssd"
        disk_size_gb: size of the new disk in gigabytes
        snapshot_link: a link to the snapshot you want to use as a source for the new disk.
            This value uses the following format: "projects/{project_name}/global/snapshots/{snapshot_name}"

    Returns:
        An unattached Disk instance.
    """
    disk_client = compute_v1.DisksClient()
    disk = compute_v1.Disk()
    disk.zone = zone
    disk.size_gb = disk_size_gb
    disk.source_snapshot = snapshot_link
    disk.type_ = disk_type
    disk.name = disk_name
    operation = disk_client.insert(project=project_id, zone=zone, disk_resource=disk)

    wait_for_extended_operation(operation, "disk creation")

    return disk_client.get(project=project_id, zone=zone, disk=disk_name)

REST

  1. יוצרים בקשת GET אל snapshots.list כדי להציג את רשימת התמונות של מצב המערכת בפרויקט.

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/snapshots
    

    מחליפים את PROJECT_ID במזהה הפרויקט.

  2. יוצרים בקשת POST כדי ליצור דיסק אזורי או דיסק אזורי באמצעות ה-method המתאימה: disks.insert

    כוללים את המאפיינים name, sizeGb ו-type. כדי לשחזר דיסק באמצעות תמונת מצב, צריך לכלול את המאפיין sourceSnapshot.

    • כדי ליצור דיסק אזורי מקובץ snapshot בהיקף גלובלי:
    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/disks
    {
      "name": "DISK_NAME",
      "sourceSnapshot": "SNAPSHOT_NAME",
      "sizeGb": "DISK_SIZE",
      "type": "zones/ZONE/diskTypes/DISK_TYPE"
    }
    
    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/disks
    {
      "name": "DISK_NAME",
      "sourceSnapshot": "projects/PROJECT_ID/regions/SOURCE_REGION/snapshots/SNAPSHOT_NAME",
      "sizeGb": "DISK_SIZE",
      "type": "projects/PROJECT_ID/zones/ZONE/diskTypes/DISK_TYPE",
      "zone": "projects/PROJECT_ID/zones/ZONE"
    }
    
    • כדי ליצור דיסק אזורי מקובץ snapshot בהיקף גלובלי:
    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/regions/REGION/disks
    {
      "name": "DISK_NAME",
      "sourceSnapshot": "SNAPSHOT_NAME",
      "region": "projects/PROJECT_ID/regions/REGION",
      "replicaZones": [
         "projects/PROJECT_ID/zones/ZONE1",
         "projects/PROJECT_ID/zones/ZONE2"
      ],
      "sizeGb": "DISK_SIZE",
      "type": "zones/ZONE/diskTypes/DISK_TYPE"
    }
    
    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/regions/REGION/disks
    {
      "name": "DISK_NAME",
      "sourceSnapshot": "projects/PROJECT_ID/regions/SOURCE_REGION/snapshots/SNAPSHOT_NAME",
      "replicaZones": [
         "projects/PROJECT_ID/zones/ZONE1",
         "projects/PROJECT_ID/zones/ZONE2"
      ],
      "sizeGb": "DISK_SIZE",
      "type": "projects/PROJECT_ID/regions/REGION/diskTypes/DISK_TYPE"
    }
    

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט
    • ZONE: האזור שבו נמצאים המכונה והדיסק החדש
    • DISK_NAME: השם של הדיסק החדש
    • SNAPSHOT_NAME: קובץ ה-snapshot של המקור של הדיסק שאתם משחזרים
    • REGION: האזור שבו הדיסק האזורי נמצא, לדוגמה: europe-west1
    • SOURCE_REGION: האזור שקובץ ה-snapshot של המקור מוגבל אליו
    • ZONE1, ZONE2: האזורים שבהם צריכות להיות רפליקות של הדיסק החדש
    • DISK_SIZE: גודל הדיסק החדש, בגיביבייט (GiB). המספר הזה צריך להיות שווה לגודל דיסק המקור המקורי של התמונה או גדול ממנו.
    • DISK_TYPE: כתובת URL מלאה או חלקית של הסוג של הדיסק, לדוגמה,,‏ PROJECT_ID/zones/ZONE/diskTypes/pd-ssd,‏,‏ PROJECT_ID/zones/ZONE/diskTypes/hyperdisk-balanced או PROJECT_ID/zones/ZONE/diskTypes/hyperdisk-balanced-high-availability
  3. זה שינוי אופציונלי. מצרפים את הדיסק החדש למכונה קיימת.

    יוצרים בקשת POST ל-method‏ instances.attachDisk, וכוללים את כתובת ה-URL של הדיסק שיצרתם מקובץ ה-snapshot.

    לדיסקים אזוריים:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/attachDisk
    {
      "source": "/compute/v1/projects/PROJECT_ID/zones/ZONE/disks/DISK_NAME"
    }
    

    עבור דיסקים אזוריים:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/attachDisk
    {
      "source": "/compute/v1/projects/PROJECT_ID/regions/REGION/disks/DISK_NAME"
    }
    

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט
    • ZONE: האזור שבו נמצאים המכונה והדיסק החדש
    • REGION: האזור שבו נמצא הדיסק האזורי. האזור הזה צריך להיות זהה לאזור שבו נמצא מופע החישוב.
    • INSTANCE_NAME: השם של המכונה שמוסיפים לה את הדיסק החדש
    • DISK_NAME: השם של הדיסק החדש

אחרי שיוצרים דיסק חדש ומצרפים אותו למופע, צריך להרכיב את הדיסק כדי שמערכת ההפעלה תוכל להשתמש בנפח האחסון שזמין בו.

יצירת מכונה מדיסקים קיימים

אתם יכולים ליצור דיסקים של אתחול ודיסקים של נתונים מתמונות מצב, ואז לצרף את הדיסקים האלה למופע חדש של מחשוב.

המשך

Go

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של Compute Engine באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Compute Engine Go API.

כדי לבצע אימות ב-Compute Engine, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"google.golang.org/protobuf/proto"
)

// createWithExistingDisks create a new VM instance using selected disks.
// The first disk in diskNames will be used as boot disk.
func createWithExistingDisks(
	w io.Writer,
	projectID, zone, instanceName string,
	diskNames []string,
) error {
	// projectID := "your_project_id"
	// zone := "europe-central2-b"
	// instanceName := "your_instance_name"
	// diskNames := []string{"boot_disk", "disk1", "disk2"}

	ctx := context.Background()
	instancesClient, err := compute.NewInstancesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer instancesClient.Close()

	disksClient, err := compute.NewDisksRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewDisksRESTClient: %w", err)
	}
	defer disksClient.Close()

	disks := [](*computepb.Disk){}

	for _, diskName := range diskNames {
		reqDisk := &computepb.GetDiskRequest{
			Project: projectID,
			Zone:    zone,
			Disk:    diskName,
		}

		disk, err := disksClient.Get(ctx, reqDisk)
		if err != nil {
			return fmt.Errorf("unable to get disk: %w", err)
		}

		disks = append(disks, disk)
	}

	attachedDisks := [](*computepb.AttachedDisk){}

	for _, disk := range disks {
		attachedDisk := &computepb.AttachedDisk{
			Source: proto.String(disk.GetSelfLink()),
		}
		attachedDisks = append(attachedDisks, attachedDisk)
	}

	attachedDisks[0].Boot = proto.Bool(true)

	instanceResource := &computepb.Instance{
		Name:        proto.String(instanceName),
		Disks:       attachedDisks,
		MachineType: proto.String(fmt.Sprintf("zones/%s/machineTypes/n1-standard-1", zone)),
		NetworkInterfaces: []*computepb.NetworkInterface{
			{
				Name: proto.String("global/networks/default"),
			},
		},
	}

	req := &computepb.InsertInstanceRequest{
		Project:          projectID,
		Zone:             zone,
		InstanceResource: instanceResource,
	}

	op, err := instancesClient.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create instance: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Instance created\n")

	return nil
}

Java

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של Compute Engine באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Compute Engine Java API.

כדי לבצע אימות ב-Compute Engine, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.


import com.google.cloud.compute.v1.AttachedDisk;
import com.google.cloud.compute.v1.Disk;
import com.google.cloud.compute.v1.DisksClient;
import com.google.cloud.compute.v1.InsertInstanceRequest;
import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.NetworkInterface;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateInstanceWithExistingDisks {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.

    // Project ID or project number of the Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";

    // Name of the zone to create the instance in. For example: "us-west3-b"
    String zone = "europe-central2-b";

    // Name of the new virtual machine (VM) instance.
    String instanceName = "YOUR_INSTANCE_NAME";

    // Array of disk names to be attached to the new virtual machine.
    // First disk in this list will be used as the boot disk.
    List<String> diskNames = List.of("your-boot-disk", "another-disk1", "another-disk2");

    createInstanceWithExistingDisks(projectId, zone, instanceName, diskNames);
  }

  // Create a new VM instance using the selected disks.
  // The first disk in diskNames will be used as the boot disk.
  public static void createInstanceWithExistingDisks(String projectId, String zone,
      String instanceName, List<String> diskNames)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `instancesClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (InstancesClient instancesClient = InstancesClient.create();
        DisksClient disksClient = DisksClient.create()) {

      if (diskNames.size() == 0) {
        throw new Error("At least one disk should be provided");
      }

      // Create the list of attached disks to be used in instance creation.
      List<AttachedDisk> attachedDisks = new ArrayList<>();
      for (int i = 0; i < diskNames.size(); i++) {
        String diskName = diskNames.get(i);
        Disk disk = disksClient.get(projectId, zone, diskName);
        AttachedDisk attDisk = null;

        if (i == 0) {
          // Make the first disk in the list as the boot disk.
          attDisk = AttachedDisk.newBuilder()
              .setSource(disk.getSelfLink())
              .setBoot(true)
              .build();
        } else {
          attDisk = AttachedDisk.newBuilder()
              .setSource(disk.getSelfLink())
              .build();
        }
        attachedDisks.add(attDisk);
      }

      // Create the instance.
      Instance instance = Instance.newBuilder()
          .setName(instanceName)
          // Add the attached disks to the instance.
          .addAllDisks(attachedDisks)
          .setMachineType(String.format("zones/%s/machineTypes/n1-standard-1", zone))
          .addNetworkInterfaces(
              NetworkInterface.newBuilder().setName("global/networks/default").build())
          .build();

      // Create the insert instance request.
      InsertInstanceRequest insertInstanceRequest = InsertInstanceRequest.newBuilder()
          .setProject(projectId)
          .setZone(zone)
          .setInstanceResource(instance)
          .build();

      // Wait for the create operation to complete.
      Operation response = instancesClient.insertAsync(insertInstanceRequest)
          .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Instance creation failed!" + response);
        return;
      }
      System.out.println("Operation Status: " + response.getStatus());

    }
  }
}

Node.js

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של Compute Engine באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Compute Engine Node.js API.

כדי לבצע אימות ב-Compute Engine, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const zone = 'europe-central2-b';
// const instanceName = 'YOUR_INSTANCE_NAME';
// const diskNames = ['boot_disk', 'disk1', 'disk2'];

const compute = require('@google-cloud/compute');

async function createWithExistingDisks() {
  const instancesClient = new compute.InstancesClient();
  const disksClient = new compute.DisksClient();

  if (diskNames.length < 1) {
    throw new Error('At least one disk should be provided');
  }

  const disks = [];
  for (const diskName of diskNames) {
    const [disk] = await disksClient.get({
      project: projectId,
      zone,
      disk: diskName,
    });
    disks.push(disk);
  }

  const attachedDisks = [];

  for (const disk of disks) {
    attachedDisks.push({
      source: disk.selfLink,
    });
  }

  attachedDisks[0].boot = true;

  const [response] = await instancesClient.insert({
    project: projectId,
    zone,
    instanceResource: {
      name: instanceName,
      disks: attachedDisks,
      machineType: `zones/${zone}/machineTypes/n1-standard-1`,
      networkInterfaces: [
        {
          name: 'global/networks/default',
        },
      ],
    },
  });
  let operation = response.latestResponse;
  const operationsClient = new compute.ZoneOperationsClient();

  // Wait for the create operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
      zone: operation.zone.split('/').pop(),
    });
  }

  console.log('Instance created.');
}

createWithExistingDisks();

Python

Python

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של Compute Engine באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Compute Engine Python API.

כדי לבצע אימות ב-Compute Engine, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

from __future__ import annotations

import re
import sys
from typing import Any
import warnings

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def get_disk(project_id: str, zone: str, disk_name: str) -> compute_v1.Disk:
    """
    Gets a disk from a project.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone where the disk exists.
        disk_name: name of the disk you want to retrieve.
    """
    disk_client = compute_v1.DisksClient()
    return disk_client.get(project=project_id, zone=zone, disk=disk_name)


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def create_instance(
    project_id: str,
    zone: str,
    instance_name: str,
    disks: list[compute_v1.AttachedDisk],
    machine_type: str = "n1-standard-1",
    network_link: str = "global/networks/default",
    subnetwork_link: str = None,
    internal_ip: str = None,
    external_access: bool = False,
    external_ipv4: str = None,
    accelerators: list[compute_v1.AcceleratorConfig] = None,
    preemptible: bool = False,
    spot: bool = False,
    instance_termination_action: str = "STOP",
    custom_hostname: str = None,
    delete_protection: bool = False,
) -> compute_v1.Instance:
    """
    Send an instance creation request to the Compute Engine API and wait for it to complete.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone to create the instance in. For example: "us-west3-b"
        instance_name: name of the new virtual machine (VM) instance.
        disks: a list of compute_v1.AttachedDisk objects describing the disks
            you want to attach to your new instance.
        machine_type: machine type of the VM being created. This value uses the
            following format: "zones/{zone}/machineTypes/{type_name}".
            For example: "zones/europe-west3-c/machineTypes/f1-micro"
        network_link: name of the network you want the new instance to use.
            For example: "global/networks/default" represents the network
            named "default", which is created automatically for each project.
        subnetwork_link: name of the subnetwork you want the new instance to use.
            This value uses the following format:
            "regions/{region}/subnetworks/{subnetwork_name}"
        internal_ip: internal IP address you want to assign to the new instance.
            By default, a free address from the pool of available internal IP addresses of
            used subnet will be used.
        external_access: boolean flag indicating if the instance should have an external IPv4
            address assigned.
        external_ipv4: external IPv4 address to be assigned to this instance. If you specify
            an external IP address, it must live in the same region as the zone of the instance.
            This setting requires `external_access` to be set to True to work.
        accelerators: a list of AcceleratorConfig objects describing the accelerators that will
            be attached to the new instance.
        preemptible: boolean value indicating if the new instance should be preemptible
            or not. Preemptible VMs have been deprecated and you should now use Spot VMs.
        spot: boolean value indicating if the new instance should be a Spot VM or not.
        instance_termination_action: What action should be taken once a Spot VM is terminated.
            Possible values: "STOP", "DELETE"
        custom_hostname: Custom hostname of the new VM instance.
            Custom hostnames must conform to RFC 1035 requirements for valid hostnames.
        delete_protection: boolean value indicating if the new virtual machine should be
            protected against deletion or not.
    Returns:
        Instance object.
    """
    instance_client = compute_v1.InstancesClient()

    # Use the network interface provided in the network_link argument.
    network_interface = compute_v1.NetworkInterface()
    network_interface.network = network_link
    if subnetwork_link:
        network_interface.subnetwork = subnetwork_link

    if internal_ip:
        network_interface.network_i_p = internal_ip

    if external_access:
        access = compute_v1.AccessConfig()
        access.type_ = compute_v1.AccessConfig.Type.ONE_TO_ONE_NAT.name
        access.name = "External NAT"
        access.network_tier = access.NetworkTier.PREMIUM.name
        if external_ipv4:
            access.nat_i_p = external_ipv4
        network_interface.access_configs = [access]

    # Collect information into the Instance object.
    instance = compute_v1.Instance()
    instance.network_interfaces = [network_interface]
    instance.name = instance_name
    instance.disks = disks
    if re.match(r"^zones/[a-z\d\-]+/machineTypes/[a-z\d\-]+$", machine_type):
        instance.machine_type = machine_type
    else:
        instance.machine_type = f"zones/{zone}/machineTypes/{machine_type}"

    instance.scheduling = compute_v1.Scheduling()
    if accelerators:
        instance.guest_accelerators = accelerators
        instance.scheduling.on_host_maintenance = (
            compute_v1.Scheduling.OnHostMaintenance.TERMINATE.name
        )

    if preemptible:
        # Set the preemptible setting
        warnings.warn(
            "Preemptible VMs are being replaced by Spot VMs.", DeprecationWarning
        )
        instance.scheduling = compute_v1.Scheduling()
        instance.scheduling.preemptible = True

    if spot:
        # Set the Spot VM setting
        instance.scheduling.provisioning_model = (
            compute_v1.Scheduling.ProvisioningModel.SPOT.name
        )
        instance.scheduling.instance_termination_action = instance_termination_action

    if custom_hostname is not None:
        # Set the custom hostname for the instance
        instance.hostname = custom_hostname

    if delete_protection:
        # Set the delete protection bit
        instance.deletion_protection = True

    # Prepare the request to insert an instance.
    request = compute_v1.InsertInstanceRequest()
    request.zone = zone
    request.project = project_id
    request.instance_resource = instance

    # Wait for the create operation to complete.
    print(f"Creating the {instance_name} instance in {zone}...")

    operation = instance_client.insert(request=request)

    wait_for_extended_operation(operation, "instance creation")

    print(f"Instance {instance_name} created.")
    return instance_client.get(project=project_id, zone=zone, instance=instance_name)


def create_with_existing_disks(
    project_id: str, zone: str, instance_name: str, disk_names: list[str]
) -> compute_v1.Instance:
    """
    Create a new VM instance using selected disks. The first disk in disk_names will
    be used as boot disk.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone to create the instance in. For example: "us-west3-b"
        instance_name: name of the new virtual machine (VM) instance.
        disk_names: list of disk names to be attached to the new virtual machine.
            First disk in this list will be used as the boot device.

    Returns:
        Instance object.
    """
    assert len(disk_names) >= 1
    disks = [get_disk(project_id, zone, disk_name) for disk_name in disk_names]
    attached_disks = []
    for disk in disks:
        adisk = compute_v1.AttachedDisk()
        adisk.source = disk.self_link
        attached_disks.append(adisk)
    attached_disks[0].boot = True
    instance = create_instance(project_id, zone, instance_name, attached_disks)
    return instance

יצירת מכונה מקובץ snapshot של דיסק אתחול

אם יצרתם קובץ snapshot של דיסק האתחול של מופע Compute,אתם יכולים להשתמש ב-snapshot הזה כדי ליצור מופע חדש.

כדי ליצור במהירות יותר ממכונה אחת עם אותו דיסק אתחול, יוצרים קובץ אימג' בהתאמה אישית ואז יוצרים מכונות מקובץ האימג' הזה במקום להשתמש ב-snapshot.

כדי ליצור מכונת חישוב עם דיסק אתחול אזורי שנוצר מקובץ snapshot, משתמשים ב-Google Cloud CLI או ב-REST.

המסוף

  1. נכנסים לדף Create an instance במסוף Google Cloud .

    כניסה לדף Create an instance

    אם מוצגת בקשה לעשות זאת, בוחרים פרויקט ולוחצים על המשך. הדף Create an instance מופיע ובו החלונית Machine configuration.

  2. בחלונית Machine configuration:

    1. בשדה Name, מציינים שם למכונה. מידע נוסף זמין במאמר מוסכמות למתן שמות למשאבים.
    2. אופציונלי: בשדה Zone, בוחרים אזור למכונה הזו.

      ברירת המחדל היא Any (כל). אם לא תשנו את ברירת המחדל הזו, Google תבחר בשבילכם אזור באופן אוטומטי על סמך סוג המכונה והזמינות שלה.

    3. בוחרים את משפחת המכונות למופע. במסוף Google Cloud מוצגות סדרות המכונות שזמינות למשפחת המכונות שבחרתם. אלה האפשרויות הזמינות של משפחות מכונות:

      • מטרה כללית
      • אופטימיזציה של מחשוב
      • מותאם לצריכת זיכרון גבוהה
      • אופטימיזציה של האחסון
      • אופטימיזציה לרשת
      • GPUs
      • TPUs

    4. בעמודה Series, בוחרים את סדרת המכונות של המכונה.

      אם בחרתם באפשרות GPUs (מעבדי GPU) כסוג המכונה בשלב הקודם, בוחרים את סוג ה-GPU הרצוי. סדרת המכונות נבחרת אוטומטית לפי סוג ה-GPU שנבחר.

    5. בקטע Machine type, בוחרים את סוג המכונה למופע.

  3. בתפריט הניווט, לוחצים על מערכת הפעלה ואחסון. בחלונית Operating system and storage שמופיעה, מגדירים את דיסק האתחול באופן הבא:

    1. לוחצים על Change. מופיעה החלונית דיסק אתחול עם הכרטיסייה Public images.
    2. לוחצים על תמונות מצב. מוצגת הכרטיסייה תמונת מצב.
    3. ברשימה Snapshot, בוחרים את תמונת המצב שרוצים להשתמש בה.
    4. ברשימה Boot disk type בוחרים את סוג דיסק האתחול.
    5. בשדה Size (GB) מציינים את גודל דיסק האתחול.
    6. אופציונלי: כדי לראות אפשרויות הגדרה מתקדמות, מרחיבים את הקטע הצגת הגדרות מתקדמות.
    7. כדי לאשר את האפשרויות של דיסק האתחול ולחזור לחלונית מערכת ההפעלה והאחסון, לוחצים על בחירה.
  4. בתפריט הניווט, לוחצים על Networking (רשת). בחלונית Networking שמופיעה, מבצעים את הפעולות הבאות:

    1. עוברים לקטע Firewall.
    2. כדי לאפשר תעבורת HTTP או HTTPS למופע, בוחרים באפשרות Allow HTTP traffic או Allow HTTPS traffic.

    Google Cloud המסוף מוסיף תג רשת למופע ויוצר את כלל חומת האש המתאים לתעבורת נתונים נכנסת, שמאפשר את כל תעבורת הנתונים הנכנסת ב-tcp:80 (HTTP) או ב-tcp:443 (HTTPS). תג הרשת משייך את כלל חומת האש למכונה. מידע נוסף זמין במאמר סקירה כללית על כללים של חומת אש במאמרי העזרה בנושא ענן וירטואלי פרטי (VPC).

  5. אופציונלי: מציינים אפשרויות הגדרה אחרות. מידע נוסף מופיע במאמר אפשרויות הגדרה במהלך יצירת מכונה.

  6. כדי ליצור את המכונה ולהפעיל אותה, לוחצים על Create.

gcloud

דיסק אתחול אזורי

משתמשים בפקודה gcloud compute instances create וכוללים את הדגל --source-snapshot.

   gcloud compute instances create INSTANCE_NAME  
--source-snapshot=BOOT_SNAPSHOT_NAME
--boot-disk-size=BOOT_DISK_SIZE
--boot-disk-type=BOOT_DISK_TYPE
--boot-disk-device-name=BOOT_DISK_NAME

מחליפים את מה שכתוב בשדות הבאים:

  • INSTANCE_NAME: name for the new instance
  • BOOT_SNAPSHOT_NAME: השם של קובץ ה-snapshot של דיסק האתחול שרוצים לשחזר לדיסק האתחול של המכונה החדשה
  • BOOT_DISK_SIZE: אופציונלי: הגודל ב-GiB של דיסק האתחול החדש

    הגודל צריך להיות שווה לגודל של דיסק המקור שממנו נוצרה התמונה או גדול ממנו.

  • BOOT_DISK_TYPE: אופציונלי: type של דיסק האתחול, לדוגמה PROJECT_ID/zones/ZONE/diskTypes/pd-ssd או PROJECT_ID/zones/ZONE/diskTypes/hyperdisk-balanced

  • BOOT_DISK_NAME: השם של דיסק האתחול החדש של המכונה הזו

דיסק אתחול אזורי

משתמשים בפקודה gcloud compute instances create וכוללים את הדגל --create-disk עם המאפיינים source-snapshot, replica-zones ו-boot.

  gcloud compute instances create INSTANCE_NAME 
--zone=ZONE
--create-disk=^:^name=DISK_NAME:source-snapshot=BOOT_SNAPSHOT_NAME:boot=true:type=BOOT_DISK_TYPE:replica-zones=ZONE,REMOTE_ZONE

התווים ^:^ מציינים שנקודתיים : משמשות כמפריד בין כל מאפייני הדיסק. ההגדרה הזו נדרשת כדי שתוכלו להשתמש בפסיק , כשמציינים את האזורים של replica-zones.

מחליפים את מה שכתוב בשדות הבאים:

  • INSTANCE_NAME: name למופע החדש
  • ZONE: האזור שבו רוצים ליצור את המכונה
  • DISK_NAME: אופציונלי: שם לדיסק
  • BOOT_SNAPSHOT_NAME: השם של קובץ ה-snapshot של דיסק האתחול שרוצים לשחזר לדיסק האתחול של המכונה החדשה.
  • BOOT_DISK_TYPE: אופציונלי: type של דיסק האתחול, לדוגמה pd-ssd או hyperdisk-balanced-high-availability
  • REMOTE_ZONE: האזור שאליו משוכפל דיסק האתחול. במאפיין replica-zones צריך לציין שני אזורים שמופרדים בפסיק, ואחד מהאזורים צריך להיות זהה לאזור של המופע.

המשך

Go

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של Compute Engine באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Compute Engine Go API.

כדי לבצע אימות ב-Compute Engine, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"google.golang.org/protobuf/proto"
)

// createInstanceFromSnapshot creates a new VM instance with boot disk created from a snapshot.
func createInstanceFromSnapshot(w io.Writer, projectID, zone, instanceName, snapshotLink string) error {
	// projectID := "your_project_id"
	// zone := "europe-central2-b"
	// instanceName := "your_instance_name"
	// snapshotLink := "projects/project_name/global/snapshots/snapshot_name"

	ctx := context.Background()
	instancesClient, err := compute.NewInstancesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer instancesClient.Close()

	req := &computepb.InsertInstanceRequest{
		Project: projectID,
		Zone:    zone,
		InstanceResource: &computepb.Instance{
			Name: proto.String(instanceName),
			Disks: []*computepb.AttachedDisk{
				{
					InitializeParams: &computepb.AttachedDiskInitializeParams{
						DiskSizeGb:     proto.Int64(11),
						SourceSnapshot: proto.String(snapshotLink),
						DiskType:       proto.String(fmt.Sprintf("zones/%s/diskTypes/pd-standard", zone)),
					},
					AutoDelete: proto.Bool(true),
					Boot:       proto.Bool(true),
					Type:       proto.String(computepb.AttachedDisk_PERSISTENT.String()),
				},
			},
			MachineType: proto.String(fmt.Sprintf("zones/%s/machineTypes/n1-standard-1", zone)),
			NetworkInterfaces: []*computepb.NetworkInterface{
				{
					Name: proto.String("global/networks/default"),
				},
			},
		},
	}

	op, err := instancesClient.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create instance: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Instance created\n")

	return nil
}

Java

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של Compute Engine באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Compute Engine Java API.

כדי לבצע אימות ב-Compute Engine, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.compute.v1.AttachedDisk;
import com.google.cloud.compute.v1.AttachedDisk.Type;
import com.google.cloud.compute.v1.AttachedDiskInitializeParams;
import com.google.cloud.compute.v1.Image;
import com.google.cloud.compute.v1.ImagesClient;
import com.google.cloud.compute.v1.InsertInstanceRequest;
import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.NetworkInterface;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.Vector;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateInstancesAdvanced {

  /**
   * @param diskType the type of disk you want to create. This value uses the following format:
   * "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)". For example:
   * "zones/us-west3-b/diskTypes/pd-ssd"
   * @param diskSizeGb size of the new disk in gigabytes
   * @param boot boolean flag indicating whether this disk should be used as a boot disk of an
   * instance
   * @param diskSnapshot disk snapshot to use when creating this disk. You must have read access to
   * this disk. This value uses the following format:
   * "projects/{project_name}/global/snapshots/{snapshot_name}"
   * @return AttachedDisk object configured to be created using the specified snapshot.
   */
  private static AttachedDisk diskFromSnapshot(String diskType, int diskSizeGb, boolean boot,
      String diskSnapshot) {
    AttachedDisk disk =
        AttachedDisk.newBuilder()
            .setBoot(boot)
            // Remember to set auto_delete to True if you want the disk to be deleted when
            // you delete your VM instance.
            .setAutoDelete(true)
            .setType(Type.PERSISTENT.toString())
            .setInitializeParams(
                AttachedDiskInitializeParams.newBuilder()
                    .setSourceSnapshot(diskSnapshot)
                    .setDiskSizeGb(diskSizeGb)
                    .setDiskType(diskType)
                    .build())
            .build();
    return disk;
  }


  /**
   * Send an instance creation request to the Compute Engine API and wait for it to complete.
   *
   * @param project project ID or project number of the Cloud project you want to use.
   * @param zone name of the zone to create the instance in. For example: "us-west3-b"
   * @param instanceName name of the new virtual machine (VM) instance.
   * @param disks a list of compute_v1.AttachedDisk objects describing the disks you want to attach
   * to your new instance.
   * @param machineType machine type of the VM being created. This value uses the following format:
   * "zones/{zone}/machineTypes/{type_name}".
   * For example: "zones/europe-west3-c/machineTypes/f1-micro"
   * @param network name of the network you want the new instance to use. For example:
   * "global/networks/default" represents the network named "default", which is created
   * automatically for each project.
   * @param subnetwork name of the subnetwork you want the new instance to use. This value uses the
   * following format: "regions/{region}/subnetworks/{subnetwork_name}"
   * @return Instance object.
   */
  private static Instance createWithDisks(String project, String zone, String instanceName,
      Vector<AttachedDisk> disks, String machineType, String network, String subnetwork)
      throws IOException, InterruptedException, ExecutionException, TimeoutException {
    try (InstancesClient instancesClient = InstancesClient.create()) {
      // Use the network interface provided in the networkName argument.
      NetworkInterface networkInterface;
      if (subnetwork != null) {
        networkInterface = NetworkInterface.newBuilder()
            .setName(network).setSubnetwork(subnetwork)
            .build();
      } else {
        networkInterface = NetworkInterface.newBuilder()
            .setName(network).build();
      }

      machineType = String.format("zones/%s/machineTypes/%s", zone, machineType);

      // Bind `instanceName`, `machineType`, `disk`, and `networkInterface` to an instance.
      Instance instanceResource =
          Instance.newBuilder()
              .setName(instanceName)
              .setMachineType(machineType)
              .addAllDisks(disks)
              .addNetworkInterfaces(networkInterface)
              .build();

      System.out.printf("Creating instance: %s at %s ", instanceName, zone);

      // Insert the instance in the specified project and zone.
      InsertInstanceRequest insertInstanceRequest = InsertInstanceRequest.newBuilder()
          .setProject(project)
          .setZone(zone)
          .setInstanceResource(instanceResource).build();

      OperationFuture<Operation, Operation> operation = instancesClient.insertAsync(
          insertInstanceRequest);

      // Wait for the operation to complete.
      Operation response = operation.get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Instance creation failed ! ! " + response);
        return null;
      }
      System.out.println("Operation Status: " + response.getStatus());

      return instancesClient.get(project, zone, instanceName);
    }
  }

  /**
   * Create a new VM instance with boot disk created from a snapshot.
   *
   * @param project project ID or project number of the Cloud project you want to use.
   * @param zone name of the zone to create the instance in. For example: "us-west3-b"
   * @param instanceName name of the new virtual machine (VM) instance.
   * @param snapshotName link to the snapshot you want to use as the source of your boot disk in the
   * form of: "projects/{project_name}/global/snapshots/{snapshot_name}"
   * @return Instance object.
   */
  public static Instance createFromSnapshot(String project, String zone, String instanceName,
      String snapshotName)
      throws IOException, InterruptedException, ExecutionException, TimeoutException {
    String diskType = String.format("zones/%s/diskTypes/pd-standard", zone);
    Vector<AttachedDisk> disks = new Vector<>();
    disks.add(diskFromSnapshot(diskType, 11, true, snapshotName));
    return createWithDisks(project, zone, instanceName, disks, "n1-standard-1",
        "global/networks/default", null);
  }

Node.js

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של Compute Engine באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Compute Engine Node.js API.

כדי לבצע אימות ב-Compute Engine, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const zone = 'europe-central2-b';
// const instanceName = 'YOUR_INSTANCE_NAME';
// const snapshotLink = 'projects/YOUR_PROJECT/global/snapshots/YOUR_SNAPSHOT_NAME';

const compute = require('@google-cloud/compute');

// Creates a new VM instance with boot disk created from a snapshot.
async function createInstanceFromSnapshot() {
  const instancesClient = new compute.InstancesClient();

  const [response] = await instancesClient.insert({
    project: projectId,
    zone,
    instanceResource: {
      name: instanceName,
      disks: [
        {
          initializeParams: {
            diskSizeGb: '11',
            sourceSnapshot: snapshotLink,
            diskType: `zones/${zone}/diskTypes/pd-standard`,
          },
          autoDelete: true,
          boot: true,
          type: 'PERSISTENT',
        },
      ],
      machineType: `zones/${zone}/machineTypes/n1-standard-1`,
      networkInterfaces: [
        {
          name: 'global/networks/default',
        },
      ],
    },
  });
  let operation = response.latestResponse;
  const operationsClient = new compute.ZoneOperationsClient();

  // Wait for the create operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
      zone: operation.zone.split('/').pop(),
    });
  }

  console.log('Instance created.');
}

createInstanceFromSnapshot();

Python

Python

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של Compute Engine באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Compute Engine Python API.

כדי לבצע אימות ב-Compute Engine, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

from __future__ import annotations

import re
import sys
from typing import Any
import warnings

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def disk_from_snapshot(
    disk_type: str,
    disk_size_gb: int,
    boot: bool,
    source_snapshot: str,
    auto_delete: bool = True,
) -> compute_v1.AttachedDisk():
    """
    Create an AttachedDisk object to be used in VM instance creation. Uses a disk snapshot as the
    source for the new disk.

    Args:
         disk_type: the type of disk you want to create. This value uses the following format:
            "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
            For example: "zones/us-west3-b/diskTypes/pd-ssd"
        disk_size_gb: size of the new disk in gigabytes
        boot: boolean flag indicating whether this disk should be used as a boot disk of an instance
        source_snapshot: disk snapshot to use when creating this disk. You must have read access to this disk.
            This value uses the following format: "projects/{project_name}/global/snapshots/{snapshot_name}"
        auto_delete: boolean flag indicating whether this disk should be deleted with the VM that uses it

    Returns:
        AttachedDisk object configured to be created using the specified snapshot.
    """
    disk = compute_v1.AttachedDisk()
    initialize_params = compute_v1.AttachedDiskInitializeParams()
    initialize_params.source_snapshot = source_snapshot
    initialize_params.disk_type = disk_type
    initialize_params.disk_size_gb = disk_size_gb
    disk.initialize_params = initialize_params
    # Remember to set auto_delete to True if you want the disk to be deleted when you delete
    # your VM instance.
    disk.auto_delete = auto_delete
    disk.boot = boot
    return disk


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def create_instance(
    project_id: str,
    zone: str,
    instance_name: str,
    disks: list[compute_v1.AttachedDisk],
    machine_type: str = "n1-standard-1",
    network_link: str = "global/networks/default",
    subnetwork_link: str = None,
    internal_ip: str = None,
    external_access: bool = False,
    external_ipv4: str = None,
    accelerators: list[compute_v1.AcceleratorConfig] = None,
    preemptible: bool = False,
    spot: bool = False,
    instance_termination_action: str = "STOP",
    custom_hostname: str = None,
    delete_protection: bool = False,
) -> compute_v1.Instance:
    """
    Send an instance creation request to the Compute Engine API and wait for it to complete.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone to create the instance in. For example: "us-west3-b"
        instance_name: name of the new virtual machine (VM) instance.
        disks: a list of compute_v1.AttachedDisk objects describing the disks
            you want to attach to your new instance.
        machine_type: machine type of the VM being created. This value uses the
            following format: "zones/{zone}/machineTypes/{type_name}".
            For example: "zones/europe-west3-c/machineTypes/f1-micro"
        network_link: name of the network you want the new instance to use.
            For example: "global/networks/default" represents the network
            named "default", which is created automatically for each project.
        subnetwork_link: name of the subnetwork you want the new instance to use.
            This value uses the following format:
            "regions/{region}/subnetworks/{subnetwork_name}"
        internal_ip: internal IP address you want to assign to the new instance.
            By default, a free address from the pool of available internal IP addresses of
            used subnet will be used.
        external_access: boolean flag indicating if the instance should have an external IPv4
            address assigned.
        external_ipv4: external IPv4 address to be assigned to this instance. If you specify
            an external IP address, it must live in the same region as the zone of the instance.
            This setting requires `external_access` to be set to True to work.
        accelerators: a list of AcceleratorConfig objects describing the accelerators that will
            be attached to the new instance.
        preemptible: boolean value indicating if the new instance should be preemptible
            or not. Preemptible VMs have been deprecated and you should now use Spot VMs.
        spot: boolean value indicating if the new instance should be a Spot VM or not.
        instance_termination_action: What action should be taken once a Spot VM is terminated.
            Possible values: "STOP", "DELETE"
        custom_hostname: Custom hostname of the new VM instance.
            Custom hostnames must conform to RFC 1035 requirements for valid hostnames.
        delete_protection: boolean value indicating if the new virtual machine should be
            protected against deletion or not.
    Returns:
        Instance object.
    """
    instance_client = compute_v1.InstancesClient()

    # Use the network interface provided in the network_link argument.
    network_interface = compute_v1.NetworkInterface()
    network_interface.network = network_link
    if subnetwork_link:
        network_interface.subnetwork = subnetwork_link

    if internal_ip:
        network_interface.network_i_p = internal_ip

    if external_access:
        access = compute_v1.AccessConfig()
        access.type_ = compute_v1.AccessConfig.Type.ONE_TO_ONE_NAT.name
        access.name = "External NAT"
        access.network_tier = access.NetworkTier.PREMIUM.name
        if external_ipv4:
            access.nat_i_p = external_ipv4
        network_interface.access_configs = [access]

    # Collect information into the Instance object.
    instance = compute_v1.Instance()
    instance.network_interfaces = [network_interface]
    instance.name = instance_name
    instance.disks = disks
    if re.match(r"^zones/[a-z\d\-]+/machineTypes/[a-z\d\-]+$", machine_type):
        instance.machine_type = machine_type
    else:
        instance.machine_type = f"zones/{zone}/machineTypes/{machine_type}"

    instance.scheduling = compute_v1.Scheduling()
    if accelerators:
        instance.guest_accelerators = accelerators
        instance.scheduling.on_host_maintenance = (
            compute_v1.Scheduling.OnHostMaintenance.TERMINATE.name
        )

    if preemptible:
        # Set the preemptible setting
        warnings.warn(
            "Preemptible VMs are being replaced by Spot VMs.", DeprecationWarning
        )
        instance.scheduling = compute_v1.Scheduling()
        instance.scheduling.preemptible = True

    if spot:
        # Set the Spot VM setting
        instance.scheduling.provisioning_model = (
            compute_v1.Scheduling.ProvisioningModel.SPOT.name
        )
        instance.scheduling.instance_termination_action = instance_termination_action

    if custom_hostname is not None:
        # Set the custom hostname for the instance
        instance.hostname = custom_hostname

    if delete_protection:
        # Set the delete protection bit
        instance.deletion_protection = True

    # Prepare the request to insert an instance.
    request = compute_v1.InsertInstanceRequest()
    request.zone = zone
    request.project = project_id
    request.instance_resource = instance

    # Wait for the create operation to complete.
    print(f"Creating the {instance_name} instance in {zone}...")

    operation = instance_client.insert(request=request)

    wait_for_extended_operation(operation, "instance creation")

    print(f"Instance {instance_name} created.")
    return instance_client.get(project=project_id, zone=zone, instance=instance_name)


def create_from_snapshot(
    project_id: str, zone: str, instance_name: str, snapshot_link: str
):
    """
    Create a new VM instance with boot disk created from a snapshot. The
    new boot disk will have 20 gigabytes.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone to create the instance in. For example: "us-west3-b"
        instance_name: name of the new virtual machine (VM) instance.
        snapshot_link: link to the snapshot you want to use as the source of your
            boot disk in the form of: "projects/{project_name}/global/snapshots/{snapshot_name}"

    Returns:
        Instance object.
    """
    disk_type = f"zones/{zone}/diskTypes/pd-standard"
    disks = [disk_from_snapshot(disk_type, 20, True, snapshot_link)]
    instance = create_instance(project_id, zone, instance_name, disks)
    return instance

REST

כשמשתמשים ב-API כדי ליצור מופע מ-snapshot, חלות ההגבלות הבאות:

  • אפשר להשתמש רק בדיסק אחד בתור דיסק האתחול.
  • צריך לצרף את דיסק האתחול כדיסק הראשון של המכונה.
  • אם מציינים את המאפיין source, אי אפשר לציין גם את המאפיין initializeParams. אם מציינים source, המשמעות היא שדיסק האתחול כבר קיים, אבל המאפיין initializeParams מציין ש-Compute Engine צריך ליצור דיסק אתחול חדש.

דיסק אתחול אזורי

כדי ליצור מכונה מ-snapshot של דיסק אתחול, משתמשים בשיטה instances.insert ומציינים את השדה sourceSnapshot במאפיין disks. אפשר גם לציין את המאפיינים diskSizeGb ו-diskType לדיסק האתחול החדש.
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
  "name": "INSTANCE_NAME",
  "machineType": "machineTypes/MACHINE_TYPE",
  "disks": [{
     "boot": true,
     "initializeParams": {
       "sourceSnapshot": "global/snapshots/BOOT_SNAPSHOT_NAME",
       "diskSizeGb": "BOOT_DISK_SIZE",
       "diskType": "BOOT_DISK_TYPE"
      }
   }],
  "networkInterfaces": [
    {
       "nicType": "GVNIC"
    }
  ]
}
מחליפים את מה שכתוב בשדות הבאים:
  • PROJECT_ID: מזהה הפרויקט
  • ZONE: האזור שבו רוצים ליצור את המכונה החדשה
  • INSTANCE_NAME: name של המכונה שאליה רוצים לשחזר קובץ snapshot
  • MACHINE_TYPE: סוג המכונה של המופע
  • BOOT_SNAPSHOT_NAME: השם של קובץ ה-snapshot שבו רוצים להשתמש כדי ליצור את דיסק האתחול של המכונה החדשה
  • BOOT_DISK_SIZE: אופציונלי: הגודל בגיביבייט (GiB) של דיסק האתחול החדש

    הגודל צריך להיות שווה לגודל של דיסק המקור שממנו נוצרה התמונה, או גדול ממנו.

  • BOOT_DISK_TYPE: אופציונלי: type של דיסק האתחול, לדוגמה PROJECT_ID/zones/ZONE/diskTypes/pd-ssd או PROJECT_ID/zones/ZONE/diskTypes/hyperdisk-balanced

דיסק אתחול אזורי

כדי ליצור מכונה עם דיסק אתחול אזורי באמצעות קובץ snapshot של דיסק אתחול כמקור, משתמשים בשיטה instances.insert ומציינים את השדות sourceSnapshot ו-replicaZones במאפיין disks.
   POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
   {
     "name": "INSTANCE_NAME",
     "disks": [
       {
         "boot": true,
         "initializeParams": {
            "sourceSnapshot": "global/snapshots/BOOT_SNAPSHOT_NAME",
            "replicaZones": [
                "projects/PROJECT_ID/zones/ZONE",
                "projects/PROJECT_ID/zones/REMOTE_ZONE"
              ],
            "diskType": "BOOT_DISK_TYPE"
         }
       }
     ],
     "networkInterfaces": [
       {
         "nicType": "GVNIC"
       }
     ]
   }
   
מחליפים את מה שכתוב בשדות הבאים:
  • PROJECT_ID: מזהה הפרויקט
  • ZONE: השם של האזור שבו רוצים ליצור את המכונה
  • INSTANCE_NAME: שם למכונה
  • BOOT_SNAPSHOT_NAME: השם של קובץ ה-snapshot של דיסק האתחול
  • REMOTE_ZONE: האזור המרוחק של הדיסק האזורי
  • BOOT_DISK_TYPE: אופציונלי: type של דיסק האתחול, לדוגמה PROJECT_ID/zones/ZONE/diskTypes/pd-ssd או PROJECT_ID/zones/ZONE/diskTypes/hyperdisk-balanced-high-availability

יצירת מכונה וירטואלית מקובץ snapshot של דיסק שאינו דיסק אתחול

אם גיביתם דיסק שאינו דיסק אתחול באמצעות snapshot, תוכלו ליצור מכונה עם דיסק נוסף שאינו דיסק אתחול על סמך ה-snapshot.

המסוף

כשמשחזרים קובצי snapshot שאינם קובצי אתחול למכונה חדשה מהמסוף, צריך קודם ליצור דיסק מכל קובץ snapshot. לאחר מכן, מחברים את הדיסקים החדשים כשיוצרים את המכונה.

  1. משחזרים כל תמונת מצב שאינה ניתנת לאתחול לדיסק חדש.

    1. נכנסים לדף Disks במסוף Google Cloud .

      לפתיחת הדף Disks

    2. לוחצים על Create disk.

    3. מציינים Name (שם) לדיסק. מידע נוסף זמין במאמר מוסכמות למתן שמות למשאבים.

    4. בוחרים את האזור והתחום של הדיסק. הדיסק והמופע צריכים להיות באותו אזור עבור דיסקים אזוריים, או באותו אזור עבור דיסקים אזוריים.

    5. בוחרים סוג דיסק.

    6. בקטע Source type (סוג המקור), בוחרים באפשרות Snapshot (קובץ snapshot).

    7. בשדה החדש Source snapshot, בוחרים תמונת מצב שאינה תמונת מצב של אתחול שרוצים לשחזר לדיסק החדש.

    8. לוחצים על Create כדי ליצור את הדיסק.

    חוזרים על השלבים האלה כדי ליצור דיסק מכל קובץ snapshot שרוצים לשחזר.

  2. נכנסים לדף VM instances במסוף Google Cloud .

    כניסה לדף VM instances

  3. בוחרים פרויקט ולוחצים על המשך.

  4. לוחצים על Create instance.

  5. מציינים שם למכונה. מידע נוסף זמין במאמר מוסכמות למתן שמות למשאבים.

  6. בוחרים את האזור והתחום של המופע הזה. הדיסק והמופע צריכים להיות באותו אזור עבור דיסקים אזוריים, או באותו אזור עבור דיסקים אזוריים.

  7. בוחרים סוג מכונה למופע.

  8. אם רוצים לאפשר תעבורה חיצונית נכנסת, צריך לשנות את כללי חומת האש של המופע.

  9. כדי לצרף דיסקים למכונה, מרחיבים את הקטע אפשרויות מתקדמות ופועלים לפי השלבים הבאים:

    1. מרחיבים את הקטע Disks.
    2. לוחצים על Attach existing disk (צירוף דיסק קיים).
    3. ברשימה Disk, בוחרים דיסק לצירוף למכונה הזו.
    4. בקטע Attachment Setting, בוחרים את Mode של צירוף הדיסק ואת Deletion rule. מידע נוסף על הוספת דיסקים חדשים זמין במאמרים הוספת דיסק מתמשך או הוספת Hyperdisk.
    5. לוחצים על Save.

    חוזרים על השלבים האלה לכל דיסק שרוצים לצרף.

  10. כדי ליצור את המכונה ולהפעיל אותה, לוחצים על Create.

gcloud

כדי ליצור מכונה, משתמשים בפקודה gcloud compute instances create. לכל תמונת מצב שאינה ניתנת לאתחול שרוצים לשחזר, כוללים את הדגל --create-disk ומציינים source-snapshot.

לדוגמה, כדי לשחזר שני צילומים של דיסקים שאינם דיסקים לאתחול למופע חדש, משתמשים בפקודה הבאה:

gcloud compute instances create INSTANCE_NAME \
    --create-disk source-snapshot=SNAPSHOT_1_NAME,name=DISK_1_NAME,size=DISK_1_SIZE,type=DISK_1_TYPE \
    --create-disk source-snapshot=SNAPSHOT_2_NAME,name=DISK_2_NAME,size=DISK_2_SIZE,type=DISK_2_TYPE

מחליפים את מה שכתוב בשדות הבאים:

  • INSTANCE_NAME: name for the new instance
  • SNAPSHOT_1_NAME ו-SNAPSHOT_2_NAME: שמות של תמונות המצב של הדיסק שאינו דיסק האתחול שרוצים לשחזר
  • DISK_1_NAME ו-DISK_2_NAME: שמות הדיסקים החדשים שאינם דיסקים לאתחול שייווצרו עבור המכונה הזו
  • DISK_1_SIZE ו-DISK_2_SIZE: אופציונלי: גדלים בגיביבייט (GiB) של כל דיסק חדש שאינו דיסק אתחול

    הגודל צריך להיות שווה לגודל של דיסקי המקור שמהם נוצרה התמונה או גדול ממנו.

  • DISK_1_TYPE ו-DISK_2_TYPE: אופציונלי: סוגי הדיסקים שרוצים ליצור, לדוגמה,‏ pd-ssd או ,‏ hyperdisk-balanced

REST

כשמשתמשים ב-REST כדי לשחזר תמונת מצב שאינה תמונת מצב של אתחול למופע חדש, חלות ההגבלות הבאות:

  • רק דיסק אחד יכול להיות דיסק האתחול.
  • צריך לצרף את דיסק האתחול כדיסק הראשון במכונה.
  • אם מציינים את המאפיין source, אי אפשר לציין גם את המאפיין initializeParams. אם מציינים source, המשמעות היא שדיסק האתחול כבר קיים, אבל המאפיין initializeParams מציין ש-Compute Engine צריך ליצור דיסק אתחול חדש.

יוצרים בקשת POST ל-method‏ instances.insert ומציינים את השדה sourceSnapshot בנכס initializeParams. אפשר להוסיף כמה דיסקים שאינם דיסקים לאתחול על ידי חזרה על המאפיין initializeParams לכל דיסק שאינו דיסק לאתחול שרוצים ליצור. אפשר לציין את המאפיינים diskSizeGb ו-diskType לכל אחד מהדיסקים שיוצרים.

לדוגמה, כדי לשחזר שני קובצי snapshot של דיסקים שאינם דיסקים לאתחול למכונה חדשה, שולחים את הבקשה הבאה:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
  "name": "INSTANCE_NAME",
  "machineType": "machineTypes/MACHINE_TYPE",
  "networkInterfaces": [
    {
      "nicType": "GVNIC"
    }
  ],
  "disks": [
    {
      "autoDelete": "true",
      "boot": "true",
      "diskSizeGb": "BOOT_DISK_SIZE",
      "diskType": "BOOT_DISK_TYPE",
      "initializeParams": {
         "sourceImage": "projects/IMAGE_PROJECT/global/images/family/IMAGE_FAMILY"
      }
    },
    {
      "deviceName": "DEVICE_1_NAME",
      "initializeParams": {
         "sourceSnapshot": "global/snapshots/SNAPSHOT_1_NAME",
         "diskSizeGb": "DISK_1_SIZE",
         "diskType": "DISK_1_TYPE"
      }
    },
    {
      "deviceName": "DEVICE_2_NAME",
      "initializeParams": {
         "sourceSnapshot": "global/snapshots/SNAPSHOT_2_NAME",
         "diskSizeGb": "DISK_2_SIZE",
         "diskType": "DISK_2_TYPE"
      }
    }
  ]
}

מחליפים את מה שכתוב בשדות הבאים:

  • PROJECT_ID: מזהה הפרויקט
  • ZONE: האזור שבו רוצים ליצור את המכונה
  • INSTANCE_NAME: שם למכונה החדשה
  • MACHINE_TYPE: סוג מכונה של המכונה
  • DISK_SIZE: אופציונלי: גודל הדיסק התואם בג'יביבייט (GiB)

    אם מציינים את המאפיין הזה, הוא צריך להיות שווה לגודל דיסק המקור שממנו נוצרה התמונה או גדול ממנו.

  • DISK_TYPE: אופציונלי: כתובת URL מלאה או חלקית של הסוג של הדיסק המתאים, לדוגמה: PROJECT_ID/zones/ZONE/diskTypes/pd-ssd או PROJECT_ID/zones/ZONE/diskTypes/hyperdisk-balanced

  • IMAGE_PROJECT: הפרויקט שמכיל את התמונה. לדוגמה, debian-cloud

  • IMAGE_FAMILY: משפחת תמונות. כך נוצרת הדוגמה מהתמונה העדכנית ביותר של מערכת ההפעלה שלא הוצאה משימוש באותה משפחה. לדוגמה, אם מציינים "sourceImage": "projects/debian-cloud/global/images/family/debian-11",‏ Compute Engine יוצר מכונה באמצעות הגרסה העדכנית ביותר של תמונת מערכת ההפעלה במשפחת תמונות Debian 11.

  • DEVICE_NAME: אופציונלי: שם המכשיר שמוצג במערכת ההפעלה האורחת של המכונה

  • SNAPSHOT_NAME: השמות של קובצי ה-snapshot התואמים של דיסקים שאינם דיסקי אתחול שרוצים לשחזר לדיסקים חדשים במופע