Membuat pemesanan bersama

Dokumen ini menjelaskan cara membuat pemesanan bersama, yaitu pemesanan yang dibagikan ke beberapa project, dan mengelola project di organisasi Anda yang dapat memakai pemesanan bersama.

Pemesanan bersama dapat digunakan oleh project yang menghosting pemesanan (project pemilik) dan oleh project yang memakai pemesanan bersama tersebut (project konsumen). Gunakan pemesanan bersama jika organisasi Anda memiliki beberapa project yang membutuhkan instance mesin virtual (VM) dengan properti sama yang dipesan. Dengan menggunakan pemesanan bersama, Anda dapat meningkatkan pemanfaatan pemesanan dan mengurangi jumlah pemesanan yang perlu dibuat serta dikelola. Untuk mempelajari pemesanan lebih lanjut, lihat Pemesanan resource zona Compute Engine.

Untuk metode pembuatan pemesanan yang lain, lihat halaman berikut:

  • Untuk membuat pemesanan yang hanya dapat digunakan oleh satu project, lihat Membuat pemesanan untuk satu project.

  • Untuk membuat reservasi saat membeli komitmen berbasis resource, lihat Membeli komitmen dengan reservasi terlampir. Komitmen memberikan diskon, yang dikenal sebagai diskon abonemen (DA), untuk biaya resource sesuai permintaan Anda sebagai imbalan atas pembelian tingkat minimum resource atau pembelanjaan jumlah minimum.

Sebelum memulai

  • Tinjau praktik terbaik untuk pemesanan bersama.
  • Tinjau persyaratan kuota dan pembatasan untuk pemesanan bersama.
  • Pastikan project yang Anda gunakan untuk membuat pemesanan bersama telah ditambahkan ke daftar yang diizinkan untuk batasan kebijakan organisasi Project pemilik pemesanan bersama (compute.sharedReservationsOwnerProjects) oleh administrator kebijakan organisasi. Daftar yang diizinkan ini secara default kosong, sehingga Anda tidak dapat membuat pemesanan bersama hingga organisasi memberikan izin ini ke satu atau beberapa project. Untuk mengetahui detail selengkapnya tentang cara melihat dan mengedit batasan kebijakan organisasi, lihat Mengelola pembuatan pemesanan bersama.
  • Siapkan autentikasi jika Anda belum melakukannya. Autentikasi memverifikasi identitas Anda untuk mengakses layanan Google Cloud dan API. Untuk menjalankan kode atau contoh dari lingkungan pengembangan lokal, Anda dapat mengautentikasi ke Compute Engine dengan memilih salah satu opsi berikut:

    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. Instal Google Cloud CLI. Setelah penginstalan, inisialisasi Google Cloud CLI dengan menjalankan perintah berikut:

      gcloud init

      Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

    2. Set a default region and zone.

    Terraform

    Untuk menggunakan contoh Terraform di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      Instal Google Cloud CLI.

      Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

    Go

    Untuk menggunakan contoh Go di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      Instal Google Cloud CLI.

      Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

    Java

    Untuk menggunakan contoh Java di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      Instal Google Cloud CLI.

      Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

    Node.js

    Untuk menggunakan contoh Node.js di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      Instal Google Cloud CLI.

      Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

    Python

    Untuk menggunakan contoh Python di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

      Instal Google Cloud CLI.

      Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

      If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

    REST

    Untuk menggunakan contoh REST API di halaman ini dalam lingkungan pengembangan lokal, gunakan kredensial yang Anda berikan ke gcloud CLI.

      Instal Google Cloud CLI.

      Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

    Untuk mengetahui informasi selengkapnya, lihat Melakukan autentikasi untuk menggunakan REST dalam dokumentasi autentikasi Google Cloud .

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan untuk membuat reservasi bersama, minta administrator untuk memberi Anda peran IAM berikut :

Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.

Peran bawaan ini berisi izin yang diperlukan untuk membuat pemesanan bersama. Untuk melihat izin yang benar-benar diperlukan, perluas bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk membuat pemesanan bersama:

  • compute.reservations.create di project
  • Untuk melihat kebijakan organisasi: orgpolicy.policy.get di organisasi
  • Untuk mengedit kebijakan organisasi: orgpolicy.policy.set di organisasi
  • Untuk menentukan template instance: compute.instanceTemplates.useReadOnly pada template instance

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Membuat pemesanan bersama

Bagian ini menjelaskan cara membuat pemesanan bersama. Setelah Anda membuatnya, pemesanan bersama hanya dapat diubah oleh project pemilik, tetapi resource untuk pemesanan bersama dapat dipakai oleh project pemilik atau project konsumen mana pun.

Untuk menggunakan pemesanan, VM harus memiliki properti yang sama persis dengan pemesanan tersebut. Untuk menentukan properti VM yang ingin Anda pesan, pilih salah satu bagian berikut dalam dokumen ini:

Secara default, pemesanan dapat otomatis dipakai oleh semua VM yang memiliki properti yang sama persis dengannya. Jika Anda ingin mengontrol pemakaian pemesanan, lakukan satu atau beberapa hal berikut:

Menentukan template instance

Sebelum membuat pemesanan dengan menentukan template instance, pastikan hal berikut:

  • Template instance berisi setelan spesifik per project, sehingga Anda hanya dapat mengakses dan menggunakan template instance dalam project yang sama. Jika membuat pemesanan bersama dengan menentukan template instance, Anda tidak dapat menggunakan template yang sama untuk membuat VM yang dapat memakai pemesanan di luar project yang membuat pemesanan tersebut.

  • Buat pemesanan di region dan zona yang sama dengan resource dalam template instance. Semua resource regional atau resource zona yang ditentukan dalam template instance—seperti jenis mesin atau volume Persistent Disk—membatasi penggunaan template ke lokasi tempat resource tersebut berada. Misalnya, jika template instance Anda menentukan volume Persistent Disk yang ada di zona us-central1-a, Anda hanya dapat membuat reservasi di zona yang sama. Untuk memeriksa apakah template yang ada menentukan resource yang mengikat template ke region atau zona tertentu, lihat detail template instance dan cari referensi ke resource regional atau resource zona di dalamnya.

Untuk membuat pemesanan bersama dengan menentukan template instance, pilih salah satu opsi berikut:

Konsol

  1. Di konsol Google Cloud , buka halaman Reservations.

    Buka Reservations

  2. Klik Buat pemesanan. Halaman Buat pemesanan akan muncul.

  3. Di kolom Nama, masukkan nama untuk pemesanan Anda.

  4. Di daftar Region dan Zone, pilih tempat Anda ingin memesan resource.

  5. Di bagian Share type, lakukan tindakan berikut:

    1. Untuk membagikan reservasi dengan project lain, pilih Dibagikan.

    2. Klik Add projects, lalu pilih project dari organisasi project saat ini yang ingin Anda gunakan dalam pemesanan bersama. Anda dapat memilih hingga 100 project konsumen.

  6. Opsional: Agar tugas pelatihan kustom atau tugas prediksi di Vertex AI dapat menggunakan reservasi VM GPU, di bagian Google Cloud services, pilih Share reservation.

  7. Di bagian Gunakan dengan instance VM, pilih salah satu opsi berikut:

    • Agar VM yang cocok dapat otomatis menggunakan reservasi ini, pilih Gunakan pemesanan secara otomatis.

    • Untuk menggunakan resource pemesanan ini hanya saat Anda membuat VM yang cocok dan secara khusus menargetkan reservasi berdasarkan nama, pilih Pilih reservasi tertentu.

  8. Di bagian Detail resource, lakukan hal berikut:

    • Di kolom Jumlah instance VM, masukkan jumlah VM yang ingin Anda pesan.

    • Untuk menentukan konfigurasi VM menggunakan template instance, pilih Gunakan template instance, lalu pilih template instance dalam daftar yang muncul.

  9. Di bagian Hapus otomatis, Anda dapat mengaktifkan opsi hapus otomatis agar Compute Engine dapat menghapus pemesanan secara otomatis pada tanggal dan waktu tertentu. Penghapusan otomatis berguna untuk menghindari biaya yang tidak perlu saat Anda berhenti menggunakan reservasi.

  10. Untuk membuat pemesanan, klik Create. Halaman Reservasi akan muncul. Proses pembuatan pemesanan dapat memerlukan waktu hingga satu menit. Untuk memverifikasi kapan Compute Engine selesai membuatnya, lihat pemesanan Anda.

gcloud

Untuk membuat pemesanan bersama, gunakan perintah gcloud compute reservations create dengan flag --share-setting=projects dan --share-with.

Untuk membuat reservasi bersama dengan menentukan template instance dan tanpa menyertakan flag opsional, jalankan perintah berikut:

gcloud compute reservations create RESERVATION_NAME \
    --share-setting=projects \
    --share-with=CONSUMER_PROJECT_IDS \
    --source-instance-template=INSTANCE_TEMPLATE_URL \
    --vm-count=NUMBER_OF_VMS \
    --zone=ZONE

Ganti kode berikut:

  • RESERVATION_NAME: nama pemesanan yang akan dibuat.

  • PROJECT_ID: ID project tempat Anda ingin mencadangkan resource dan tempat template instance berada.

  • CONSUMER_PROJECT_IDS: daftar yang dipisahkan koma untuk ID project yang dapat menggunakan pemesanan ini—misalnya, project-1,project-2. Anda dapat menyertakan hingga 100 project konsumen. Project ini harus berada dalam organisasi yang sama dengan project pemilik. Jangan sertakan project pemilik. Secara default, project sudah diizinkan untuk menggunakan pemesanan.

  • INSTANCE_TEMPLATE_URL: URL template instance yang ada, yang harus ada di project Anda. Tentukan salah satu nilai berikut:

    • Untuk template instance regional: projects/PROJECT_ID/regions/REGION/instanceTemplates/INSTANCE_TEMPLATE_NAME

    • Untuk template instance global: INSTANCE_TEMPLATE_NAME

  • NUMBER_OF_VMS: jumlah VM yang akan dipesan.

  • ZONE: zona tempat memesan resource.

Misalnya, untuk membuat reservasi dengan menentukan template instance global di zona us-central1-a, membagikan reservasi dengan project project-1 dan project-2, serta memesan sepuluh VM yang masing-masing menggunakan jenis mesin N2 yang telah ditetapkan dengan 4 vCPU, jalankan perintah berikut:

gcloud compute reservations create my-reservation \
    --share-setting=projects \
    --share-with=project-1,project-2 \
    --source-instance-template=projects/example-project/global/example-instance-template \
    --vm-count=10 \
    --zone=us-central1-a

Secara opsional, Anda dapat melakukan satu atau beberapa hal berikut:

  • Untuk menentukan bahwa hanya VM yang secara khusus menargetkan reservasi ini yang dapat menggunakannya, sertakan flag --require-specific-reservation.

    gcloud compute reservations create RESERVATION_NAME \
        --require-specific-reservation \
        --share-setting=projects \
        --share-with=CONSUMER_PROJECT_IDS \
        --source-instance-template=INSTANCE_TEMPLATE_URL \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    
  • Agar tugas pelatihan kustom atau tugas prediksi di Vertex AI dapat menggunakan reservasi VM GPU, sertakan tanda --reservation-sharing-policy yang ditetapkan ke ALLOW_ALL.

    gcloud compute reservations create RESERVATION_NAME \
        --reservation-sharing-policy=ALLOW_ALL \
        --share-setting=projects \
        --share-with=CONSUMER_PROJECT_IDS \
        --source-instance-template=INSTANCE_TEMPLATE_URL \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    
  • Agar Compute Engine dapat menghapus pemesanan secara otomatis, pilih salah satu metode berikut:

    • Untuk menghapus reservasi pada tanggal dan waktu tertentu, gunakan perintah gcloud beta compute reservations create dengan flag --delete-at-time.

      gcloud beta compute reservations create RESERVATION_NAME \
          --delete-at-time=DELETE_AT_TIME \
          --share-setting=projects \
          --share-with=CONSUMER_PROJECT_IDS \
          --source-instance-template=INSTANCE_TEMPLATE_URL \
          --vm-count=NUMBER_OF_VMS \
          --zone=ZONE
      

      Ganti DELETE_AT_TIME dengan tanggal dan waktu yang diformat sebagai stempel waktu RFC 3339, yang harus seperti berikut:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Ganti kode berikut:

      • YYYY-MM-DD: tanggal yang diformat sebagai tahun 4 digit, bulan 2 digit, dan hari 2 digit dalam bulan, yang dipisahkan oleh tanda hubung (-).

      • HH:MM:SS: waktu yang diformat sebagai jam 2 digit menggunakan waktu 24 jam, menit 2 digit, dan detik 2 digit, yang dipisahkan oleh titik dua (:).

      • OFFSET: zona waktu yang diformat sebagai offset dari Waktu Universal Terkoordinasi (UTC). Misalnya, untuk menggunakan Waktu Standar Pasifik (PST), tentukan -08:00. Atau, untuk tidak menggunakan penyeimbang, tentukan Z.

    • Untuk menghapus pemesanan setelah durasi tertentu, gunakan perintah gcloud beta compute reservations create dengan flag --delete-after-duration.

      gcloud beta compute reservations create RESERVATION_NAME \
          --delete-after-duration=DELETE_AFTER_DURATION \
          --share-setting=projects \
          --share-with=CONSUMER_PROJECT_IDS \
          --source-instance-template=INSTANCE_TEMPLATE_URL \
          --vm-count=NUMBER_OF_VMS \
          --zone=ZONE
      

      Ganti DELETE_AFTER_DURATION dengan durasi dalam hari, jam, menit, atau detik. Misalnya, tentukan 30m selama 30 menit, atau 1d2h3m4s untuk 1 hari, 2 jam, 3 menit, dan 4 detik.

Go

import (
	"context"
	"fmt"
	"io"

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

// Creates shared reservation from given template in particular zone
func createSharedReservation(w io.Writer, client ClientInterface, projectID, baseProjectId, zone, reservationName, sourceTemplate string) error {
	// client, err := compute.NewReservationsRESTClient(ctx)
	// projectID := "your_project_id". Destination of sharing.
	// baseProjectId := "your_project_id2". Project where the reservation will be created.
	// zone := "us-west3-a"
	// reservationName := "your_reservation_name"
	// sourceTemplate: existing template path. Following formats are allowed:
	//  	- projects/{project_id}/global/instanceTemplates/{template_name}
	//  	- projects/{project_id}/regions/{region}/instanceTemplates/{template_name}
	//  	- https://www.googleapis.com/compute/v1/projects/{project_id}/global/instanceTemplates/instanceTemplate
	//  	- https://www.googleapis.com/compute/v1/projects/{project_id}/regions/{region}/instanceTemplates/instanceTemplate

	ctx := context.Background()

	shareSettings := map[string]*computepb.ShareSettingsProjectConfig{
		projectID: {ProjectId: proto.String(projectID)},
	}

	req := &computepb.InsertReservationRequest{
		Project: baseProjectId,
		ReservationResource: &computepb.Reservation{
			Name: proto.String(reservationName),
			Zone: proto.String(zone),
			SpecificReservation: &computepb.AllocationSpecificSKUReservation{
				Count:                  proto.Int64(2),
				SourceInstanceTemplate: proto.String(sourceTemplate),
			},
			ShareSettings: &computepb.ShareSettings{
				ProjectMap: shareSettings,
				ShareType:  proto.String("SPECIFIC_PROJECTS"),
			},
		},
		Zone: zone,
	}

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

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

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

	return nil
}

Java

import com.google.cloud.compute.v1.AllocationSpecificSKUReservation;
import com.google.cloud.compute.v1.InsertReservationRequest;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.Operation.Status;
import com.google.cloud.compute.v1.Reservation;
import com.google.cloud.compute.v1.ReservationsClient;
import com.google.cloud.compute.v1.ShareSettings;
import com.google.cloud.compute.v1.ShareSettingsProjectConfig;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateSharedReservation {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // The ID of the project where you want to reserve resources
    // and where the instance template exists.
    // By default, no projects are allowed to create or modify shared reservations
    // in an organization. Add projects to the Shared Reservations Owner Projects
    // (compute.sharedReservationsOwnerProjects) organization policy constraint
    // to allow them to create and modify shared reservations.
    // For more information visit this page:
    // https://cloud.google.com/compute/docs/instances/reservations-shared#shared_reservation_constraint
    String projectId = "YOUR_PROJECT_ID";
    // Zone in which to reserve resources.
    String zone = "us-central1-a";
    // Name of the reservation to be created.
    String reservationName = "YOUR_RESERVATION_NAME";
    // The URI of the global instance template to be used for creating the reservation.
    String instanceTemplateUri = String.format(
        "projects/%s/global/instanceTemplates/%s", projectId, "YOUR_INSTANCE_TEMPLATE_NAME");
    // Number of instances for which capacity needs to be reserved.
    int vmCount = 3;

    createSharedReservation(projectId, zone, reservationName, instanceTemplateUri, vmCount);
  }

  // Creates a shared reservation with the given name in the given zone.
  public static Status createSharedReservation(
          String projectId, String zone,
          String reservationName, String instanceTemplateUri, int vmCount)
          throws ExecutionException, InterruptedException, TimeoutException, IOException {

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (ReservationsClient reservationsClient = ReservationsClient.create()) {
      ShareSettings shareSettings = ShareSettings.newBuilder()
              .setShareType(String.valueOf(ShareSettings.ShareType.SPECIFIC_PROJECTS))
              // The IDs of projects that can consume this reservation. You can include up to
              // 100 consumer projects. These projects must be in the same organization as
              // the owner project. Don't include the owner project.
              // By default, it is already allowed to consume the reservation.
              .putProjectMap("CONSUMER_PROJECT_1", ShareSettingsProjectConfig.newBuilder().build())
              .putProjectMap("CONSUMER_PROJECT_2", ShareSettingsProjectConfig.newBuilder().build())
              .build();

      Reservation reservationResource =
              Reservation.newBuilder()
                      .setName(reservationName)
                      .setZone(zone)
                      .setSpecificReservationRequired(true)
                      .setShareSettings(shareSettings)
                      .setSpecificReservation(
                              AllocationSpecificSKUReservation.newBuilder()
                                      .setCount(vmCount)
                                      .setSourceInstanceTemplate(instanceTemplateUri)
                                      .build())
                      .build();

      InsertReservationRequest request =
              InsertReservationRequest.newBuilder()
                      .setProject(projectId)
                      .setZone(zone)
                      .setReservationResource(reservationResource)
                      .build();

      Operation response = reservationsClient.insertAsync(request)
              .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        throw new Error("Reservation creation failed!!" + response);
      }
      return response.getStatus();
    }
  }
}

Node.js

// Import the Compute library
const computeLib = require('@google-cloud/compute');
const compute = computeLib.protos.google.cloud.compute.v1;

/**
 * TODO(developer): Uncomment reservationsClient and zoneOperationsClient before running the sample.
 */
// Instantiate a reservationsClient
// reservationsClient = new computeLib.ReservationsClient();
// Instantiate a zoneOperationsClient
// zoneOperationsClient = new computeLib.ZoneOperationsClient();

/**
 * TODO(developer): Update these variables before running the sample.
 */
// The ID of the project where you want to reserve resources and where the instance template exists.
const projectId = await reservationsClient.getProjectId();
// The zone in which to reserve resources.
const zone = 'us-central1-a';
// The name of the reservation to create.
const reservationName = 'reservation-01';
// The number of VMs to reserve.
const vmsNumber = 3;
// The name of an existing instance template.
const instanceTemplateName = 'global-instance-template-name';
// The location of the instance template.
const location = 'global';

async function callCreateComputeSharedReservation() {
  // Create reservation for 3 VMs in zone us-central1-a by specifying a instance template.
  const specificReservation = new compute.AllocationSpecificSKUReservation({
    count: vmsNumber,
    sourceInstanceTemplate: `projects/${projectId}/${location}/instanceTemplates/${instanceTemplateName}`,
  });

  // Create share settings. Share reservation with one customer project.
  const shareSettings = new compute.ShareSettings({
    shareType: 'SPECIFIC_PROJECTS',
    projectMap: {
      // The IDs of projects that can consume this reservation. You can include up to 100 consumer projects.
      // These projects must be in the same organization as the owner project.
      // Don't include the owner project. By default, it is already allowed to consume the reservation.
      consumer_project_id: {
        projectId: 'consumer_project_id',
      },
    },
  });

  // Create a reservation.
  const reservation = new compute.Reservation({
    name: reservationName,
    specificReservation,
    specificReservationRequired: true,
    shareSettings,
  });

  const [response] = await reservationsClient.insert({
    project: projectId,
    reservationResource: reservation,
    zone,
  });

  let operation = response.latestResponse;

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

  console.log(`Reservation: ${reservationName} created.`);
  return response;
}

return await callCreateComputeSharedReservation();

Python

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_compute_shared_reservation(
    project_id: str,
    zone: str = "us-central1-a",
    reservation_name="your-reservation-name",
    shared_project_id: str = "shared-project-id",
) -> compute_v1.Reservation:
    """Creates a compute reservation in GCP.
    Args:
        project_id (str): The ID of the Google Cloud project.
        zone (str): The zone to create the reservation.
        reservation_name (str): The name of the reservation to create.
        shared_project_id (str): The ID of the project that the reservation is shared with.
    Returns:
        Reservation object that represents the new reservation.
    """

    instance_properties = compute_v1.AllocationSpecificSKUAllocationReservedInstanceProperties(
        machine_type="n1-standard-1",
        # Optional. Specifies amount of local ssd to reserve with each instance.
        local_ssds=[
            compute_v1.AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk(
                disk_size_gb=375, interface="NVME"
            ),
        ],
    )

    reservation = compute_v1.Reservation(
        name=reservation_name,
        specific_reservation=compute_v1.AllocationSpecificSKUReservation(
            count=3,  # Number of resources that are allocated.
            # If you use source_instance_template, you must exclude the instance_properties field.
            # It can be a full or partial URL.
            # source_instance_template="projects/[PROJECT_ID]/global/instanceTemplates/my-instance-template",
            instance_properties=instance_properties,
        ),
        share_settings=compute_v1.ShareSettings(
            share_type="SPECIFIC_PROJECTS",
            project_map={
                shared_project_id: compute_v1.ShareSettingsProjectConfig(
                    project_id=shared_project_id
                )
            },
        ),
    )

    # Create a client
    client = compute_v1.ReservationsClient()

    operation = client.insert(
        project=project_id,
        zone=zone,
        reservation_resource=reservation,
    )
    wait_for_extended_operation(operation, "Reservation creation")

    reservation = client.get(
        project=project_id, zone=zone, reservation=reservation_name
    )
    shared_project = next(iter(reservation.share_settings.project_map.values()))

    print("Name: ", reservation.name)
    print("STATUS: ", reservation.status)
    print("SHARED PROJECT: ", shared_project)
    # Example response:
    # Name:  your-reservation-name
    # STATUS:  READY
    # SHARED PROJECT:  project_id: "123456789012"

    return reservation

REST

Untuk membuat pemesanan bersama, buat permintaan POST ke metode reservations.insert. Dalam isi permintaan, sertakan hal berikut:

  • Kolom projectMap.

  • Kolom shareType ditetapkan ke SPECIFIC_PROJECTS.

Misalnya, untuk membuat pemesanan bersama dengan menentukan template instance tanpa menyertakan kolom opsional, dan membagikan pemesanan dengan dua project konsumen, buat permintaan POST berikut:

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

{
  "name": "RESERVATION_NAME",
  "shareSettings": {
    "shareType": "SPECIFIC_PROJECTS",
    "projectMap": {
      "CONSUMER_PROJECT_ID_1": {
        "projectId": "CONSUMER_PROJECT_ID_1"
      },
      "CONSUMER_PROJECT_ID_2": {
        "projectId": "CONSUMER_PROJECT_ID_2"
      }
    }
  },
  "specificReservation": {
    "count": "NUMBER_OF_VMS",
    "sourceInstanceTemplate": "INSTANCE_TEMPLATE_URL"
  }
}

Ganti kode berikut:

  • PROJECT_ID: ID project tempat Anda ingin mencadangkan resource dan tempat template instance berada.

  • ZONE: zona tempat memesan resource.

  • RESERVATION_NAME: nama pemesanan yang akan dibuat.

  • CONSUMER_PROJECT_ID_1 dan CONSUMER_PROJECT_ID_2: ID project yang dapat menggunakan pemesanan ini. Anda dapat menyertakan hingga 100 project konsumen. Project ini harus berada dalam organisasi yang sama dengan project pemilik. Jangan sertakan project pemilik. Secara default, project sudah diizinkan untuk menggunakan pemesanan.

  • NUMBER_OF_VMS: jumlah VM yang akan dipesan.

  • INSTANCE_TEMPLATE_URL: URL template instance yang ada, yang harus ada di project Anda. Tentukan salah satu nilai berikut:

    • Untuk template instance regional: projects/PROJECT_ID/regions/REGION/instanceTemplates/INSTANCE_TEMPLATE_NAME

    • Untuk template instance global: INSTANCE_TEMPLATE_NAME

Misalnya, untuk membuat reservasi untuk sepuluh VM di zona us-central1-a dengan menentukan template instance global, dan membagikan reservasi dengan project project-1 dan project-2, buat permintaan POST berikut:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/reservations

{
  "name": "my-reservation",
  "shareSettings": {
    "shareType": "SPECIFIC_PROJECTS",
    "projectMap": {
      "project-1": {
        "projectId": "project-1"
      },
      "project-2": {
        "projectId": "project-2"
      }
    }
  },
  "specificReservation": {
    "count": "10",
    "sourceInstanceTemplate": "example-instance-template"
  }
}

Secara opsional, Anda dapat melakukan satu atau beberapa hal berikut:

  • Untuk menentukan bahwa hanya VM yang secara khusus menargetkan pemesanan ini yang dapat menggunakannya, sertakan kolom specificReservationRequired dalam isi permintaan, dan tetapkan kolom ke true.

    Misalnya, untuk membuat pemesanan tertentu dengan menentukan template instance, dan membagikan pemesanan dengan dua project konsumen, buat permintaan sebagai berikut:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "shareSettings": {
        "shareType": "SPECIFIC_PROJECTS",
        "projectMap": {
          "CONSUMER_PROJECT_ID_1": {
            "projectId": "CONSUMER_PROJECT_ID_1"
          },
          "CONSUMER_PROJECT_ID_2": {
            "projectId": "CONSUMER_PROJECT_ID_2"
          }
        }
      },
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "sourceInstanceTemplate": "INSTANCE_TEMPLATE_URL"
      },
      "specificReservationRequired": true
    }
    
  • Agar tugas pelatihan kustom atau tugas prediksi di Vertex AI dapat menggunakan reservasi VM GPU, sertakan kolom serviceShareType dan tetapkan ke ALLOW_ALL.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "reservationSharingPolicy": {
        "serviceShareType": "ALLOW_ALL"
      },
      "shareSettings": {
        "shareType": "SPECIFIC_PROJECTS",
        "projectMap": {
          "CONSUMER_PROJECT_ID_1": {
            "projectId": "CONSUMER_PROJECT_ID_1"
          },
          "CONSUMER_PROJECT_ID_2": {
            "projectId": "CONSUMER_PROJECT_ID_2"
          }
        }
      },
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "sourceInstanceTemplate": "INSTANCE_TEMPLATE_URL"
      }
    }
    
  • Agar Compute Engine dapat menghapus pemesanan secara otomatis, pilih salah satu metode berikut:

    • Untuk menghapus pemesanan pada tanggal dan waktu tertentu, buat permintaan POST ke metode beta.reservations.insert. Dalam isi permintaan, sertakan kolom deleteAtTime.

      Misalnya, untuk membuat pemesanan dengan menentukan template instance, menghapus pemesanan secara otomatis pada tanggal dan waktu tertentu, serta membagikan pemesanan ke dua project konsumen, buat permintaan sebagai berikut:

      POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/reservations
      
      {
        "deleteAtTime": "DELETE_AT_TIME",
        "name": "RESERVATION_NAME",
        "shareSettings": {
          "shareType": "SPECIFIC_PROJECTS",
          "projectMap": {
            "CONSUMER_PROJECT_ID_1": {
              "projectId": "CONSUMER_PROJECT_ID_1"
            },
            "CONSUMER_PROJECT_ID_2": {
              "projectId": "CONSUMER_PROJECT_ID_2"
            }
          }
        },
        "specificReservation": {
          "count": "NUMBER_OF_VMS",
          "sourceInstanceTemplate": "INSTANCE_TEMPLATE_URL"
        }
      }
      

      Ganti DELETE_AT_TIME dengan tanggal dan waktu yang diformat sebagai stempel waktu RFC 3339, yang harus seperti berikut:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Ganti kode berikut:

      • YYYY-MM-DD: tanggal yang diformat sebagai tahun 4 digit, bulan 2 digit, dan hari 2 digit dalam bulan, yang dipisahkan oleh tanda hubung (-).

      • HH:MM:SS: waktu yang diformat sebagai jam 2 digit menggunakan waktu 24 jam, menit 2 digit, dan detik 2 digit, yang dipisahkan oleh titik dua (:).

      • OFFSET: zona waktu yang diformat sebagai offset dari Waktu Universal Terkoordinasi (UTC). Misalnya, untuk menggunakan Waktu Standar Pasifik (PST), tentukan -08:00. Atau, untuk tidak menggunakan penyeimbang, tentukan Z.

    • Untuk menghapus pemesanan setelah durasi tertentu, buat permintaan POST ke metode beta.reservations.insert. Dalam isi permintaan, sertakan kolom deleteAfterDuration.

      Misalnya, untuk membuat pemesanan dengan menentukan template instance, menghapus pemesanan secara otomatis setelah durasi tertentu, dan membagikan pemesanan ke dua project konsumen, buat permintaan sebagai berikut:

      POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/reservations
      
      {
        "deleteAfterDuration": {
          "seconds": "DELETE_AFTER_DURATION"
        },
        "name": "RESERVATION_NAME",
        "shareSettings": {
          "shareType": "SPECIFIC_PROJECTS",
          "projectMap": {
            "CONSUMER_PROJECT_ID_1": {
              "projectId": "CONSUMER_PROJECT_ID_1"
            },
            "CONSUMER_PROJECT_ID_2": {
              "projectId": "CONSUMER_PROJECT_ID_2"
            }
          }
        },
        "specificReservation": {
          "count": "NUMBER_OF_VMS",
          "sourceInstanceTemplate": "INSTANCE_TEMPLATE_URL"
        }
      }
      

      Ganti DELETE_AFTER_DURATION dengan durasi dalam detik. Misalnya, tentukan 86400 untuk 86.400 detik (1 hari).

Menentukan VM yang ada

Anda hanya dapat membuat reservasi bersama berdasarkan VM yang ada di project dan zona yang sama dengan VM tersebut.

Setelah membuat reservasi, Anda dapat menggunakannya dengan membuat VM yang memiliki properti yang cocok dengan VM referensi. Anda dapat melakukannya dengan melakukan salah satu tindakan berikut:

  • Buat dan gunakan template instance sebagai berikut:

    1. Buat template instance berdasarkan VM referensi tanpa mengganti properti VM referensi.

    2. Buat VM menggunakan template yang baru dibuat dengan melakukan salah satu atau kedua hal berikut:

  • Buat VM dengan properti yang sama persis dengan VM referensi sebagai berikut:

    • Di project pemilik, buat VM berdasarkan VM referensi tanpa mengubah properti VM yang Anda buat.

    • Di project konsumen, buat VM sambil memastikan secara manual bahwa propertinya dan properti VM referensi cocok.

Untuk membuat reservasi bersama yang menggunakan properti VM yang ada, lakukan hal berikut:

  1. Di konsol Google Cloud , buka halaman Reservations.

    Buka Reservations

  2. Klik Buat reservasi. Halaman Buat pemesanan akan muncul.

  3. Di kolom Nama, masukkan nama untuk pemesanan Anda.

  4. Di daftar Region dan Zone, pilih tempat Anda ingin memesan resource.

  5. Di bagian Share type, lakukan tindakan berikut:

    1. Untuk membagikan reservasi dengan project lain, pilih Dibagikan.

    2. Klik Add projects, lalu pilih project dari organisasi project saat ini yang ingin Anda ajak berbagi reservasi. Anda dapat memilih hingga 100 project konsumen.

  6. Opsional: Agar tugas pelatihan kustom atau tugas prediksi di Vertex AI dapat menggunakan reservasi VM GPU, di bagian Google Cloud services, pilih Share reservation.

  7. Di bagian Gunakan dengan instance VM, pilih salah satu opsi berikut:

    • Agar VM yang cocok dapat otomatis menggunakan reservasi ini, pilih Gunakan reservasi secara otomatis.

    • Untuk menggunakan resource dari pemesanan ini hanya saat Anda membuat VM yang cocok dan secara khusus menargetkan pemesanan berdasarkan nama, pilih Pilih pemesanan tertentu.

  8. Di bagian Detail resource, lakukan hal berikut:

    • Di kolom Jumlah instance VM, masukkan jumlah VM yang ingin Anda pesan.

    • Untuk menentukan konfigurasi VM menggunakan VM referensi, pilih Gunakan VM yang ada, lalu pilih VM dalam daftar yang muncul.

  9. Di bagian Hapus otomatis, Anda dapat mengaktifkan opsi hapus otomatis agar Compute Engine menghapus pemesanan secara otomatis pada tanggal dan waktu tertentu. Penghapusan otomatis pemesanan dapat berguna untuk menghindari biaya yang tidak perlu saat Anda berhenti menggunakan pemesanan.

  10. Untuk membuat pemesanan, klik Create. Halaman Reservasi akan muncul. Proses pembuatan pemesanan dapat memerlukan waktu hingga satu menit. Untuk memverifikasi kapan Compute Engine selesai membuatnya, lihat pemesanan Anda.

Menentukan properti secara langsung

Untuk membuat reservasi bersama dengan menentukan properti secara langsung, pilih salah satu opsi berikut:

Konsol

  1. Di konsol Google Cloud , buka halaman Reservations.

    Buka Reservations

  2. Klik Buat reservasi. Halaman Buat pemesanan akan muncul.

  3. Di kolom Nama, masukkan nama untuk pemesanan Anda.

  4. Di daftar Region dan Zone, pilih tempat Anda ingin memesan resource.

  5. Di bagian Share type, lakukan tindakan berikut:

    1. Untuk membagikan reservasi dengan project lain, pilih Dibagikan.

    2. Klik Add projects, lalu pilih project dari organisasi project saat ini yang ingin Anda gunakan dalam pemesanan bersama. Anda dapat memilih hingga 100 project konsumen.

  6. Opsional: Agar tugas pelatihan kustom atau tugas prediksi di Vertex AI dapat menggunakan reservasi VM GPU, di bagian Google Cloud services, pilih Share reservation.

  7. Di bagian Gunakan dengan instance VM, pilih salah satu opsi berikut:

    • Agar VM yang cocok dapat otomatis menggunakan reservasi ini, pilih Gunakan pemesanan secara otomatis.

    • Untuk menggunakan resource pemesanan ini hanya saat Anda membuat VM yang cocok dan secara khusus menargetkan reservasi berdasarkan nama, pilih Pilih reservasi tertentu.

  8. Di bagian Detail resource, lakukan hal berikut:

    • Di kolom Jumlah instance VM, masukkan jumlah VM yang ingin Anda pesan.

    • Tentukan seri dan jenis mesin yang ingin Anda pesan.

  9. Di bagian Hapus otomatis, Anda dapat mengaktifkan opsi hapus otomatis agar Compute Engine menghapus pemesanan secara otomatis pada tanggal dan waktu tertentu. Penghapusan otomatis berguna untuk menghindari biaya yang tidak perlu saat Anda berhenti menggunakan reservasi.

  10. Untuk membuat pemesanan, klik Create. Halaman Reservasi akan muncul. Proses pembuatan pemesanan dapat memerlukan waktu hingga satu menit. Untuk memverifikasi kapan Compute Engine selesai membuatnya, lihat pemesanan Anda.

gcloud

Untuk membuat pemesanan bersama, gunakan perintah gcloud compute reservations create dengan flag --share-setting=projects dan --share-with.

Untuk membuat reservasi bersama dengan menentukan properti secara langsung dan tanpa menyertakan flag opsional, jalankan perintah berikut:

gcloud compute reservations create RESERVATION_NAME \
    --machine-type=MACHINE_TYPE \
    --share-setting=projects \
    --share-with=CONSUMER_PROJECT_IDS \
    --vm-count=NUMBER_OF_VMS \
    --zone=ZONE

Ganti kode berikut:

  • RESERVATION_NAME: nama pemesanan yang akan dibuat.

  • MACHINE_TYPE: jenis mesin yang akan digunakan untuk setiap VM.

  • CONSUMER_PROJECT_IDS: daftar yang dipisahkan koma untuk ID project yang dapat menggunakan pemesanan ini—misalnya, project-1,project-2. Anda dapat menyertakan hingga 100 project konsumen. Project ini harus berada dalam organisasi yang sama dengan project pemilik. Jangan sertakan project pemilik. Secara default, project sudah diizinkan untuk menggunakan pemesanan.

  • NUMBER_OF_VMS: jumlah VM yang akan dipesan.

  • ZONE: zona tempat memesan resource.

Misalnya, untuk membuat reservasi di zona us-central1-a untuk sepuluh VM yang masing-masing menggunakan jenis mesin standar N2 dengan 4 vCPU, dan membagikan reservasi tersebut ke project project-1 dan project-2, jalankan perintah berikut:

gcloud compute reservations create my-reservation \
    --machine-type=n2-standard-4 \
    --share-setting=projects \
    --share-with=project-1,project-2 \
    --vm-count=10 \
    --zone=us-central1-a

Secara opsional, Anda dapat melakukan satu atau beberapa hal berikut:

  • Untuk memasang GPU ke VM N1 yang dipesan, sertakan tanda --accelerator.

    gcloud compute reservations create RESERVATION_NAME \
        --accelerator=count=NUMBER_OF_ACCELERATORS,type=ACCELERATOR_TYPE
        --machine-type=MACHINE_TYPE \
        --share-setting=projects \
        --share-with=CONSUMER_PROJECT_IDS \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    

    Ganti kode berikut:

    • NUMBER_OF_ACCELERATORS: jumlah GPU yang akan ditambahkan per VM yang dipesan.

    • ACCELERATOR_TYPE: model GPU yang didukung untuk VM N1. Pastikan model GPU yang Anda pilih tersedia di zona tempat Anda ingin memesan resource. Jika tidak, pembuatan pemesanan akan gagal.

  • Untuk memasang disk SSD Lokal ke jenis mesin yang tidak menyertakan disk SSD Lokal secara default, sertakan tanda --local-ssd. Anda hanya dapat melampirkan disk SSD Lokal berukuran 375 GB.

    gcloud compute reservations create RESERVATION_NAME \
        --local-ssd=count=NUMBER_OF_LOCAL_SSD_DISKS,size=375,interface=INTERFACE_TYPE \
        --machine-type=MACHINE_TYPE \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    

    Ganti kode berikut:

    • NUMBER_OF_LOCAL_SSD_DISKS: jumlah disk SSD Lokal yang akan dipasang.

    • INTERFACE_TYPE: jenis antarmuka disk yang Anda inginkan untuk digunakan setiap disk SSD Lokal dan yang didukung oleh jenis mesin yang Anda tentukan. Tentukan salah satu nilai berikut:

      • Untuk antarmuka disk NVME: nvme

      • Untuk antarmuka disk SCSI: scsi

  • Agar VM yang dipesan menggunakan platform CPU minimum tertentu, bukan platform CPU default zona, sertakan flag --min-cpu-platform.

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE \
        --min-cpu-platform="MIN_CPU_PLATFORM" \
        --share-setting=projects \
        --share-with=CONSUMER_PROJECT_IDS \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    

    Ganti MIN_CPU_PLATFORM dengan platform CPU minimum. Untuk memastikan bahwa platform CPU tersedia di zona tempat Anda memesan resource, lihat platform CPU yang tersedia menurut zona.

  • Untuk menentukan bahwa hanya VM yang secara khusus menargetkan reservasi ini yang dapat menggunakannya, sertakan flag --require-specific-reservation.

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE \
        --require-specific-reservation \
        --share-setting=projects \
        --share-with=CONSUMER_PROJECT_IDS \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    
  • Agar tugas pelatihan kustom atau tugas prediksi di Vertex AI dapat menggunakan reservasi VM GPU, sertakan tanda --reservation-sharing-policy yang ditetapkan ke ALLOW_ALL.

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE \
        --reservation-sharing-policy=ALLOW_ALL \
        --share-setting=projects \
        --share-with=CONSUMER_PROJECT_IDS \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    
  • Agar Compute Engine dapat menghapus pemesanan secara otomatis, pilih salah satu metode berikut:

    • Untuk menghapus reservasi pada tanggal dan waktu tertentu, gunakan perintah gcloud beta compute reservations create dengan flag --delete-at-time.

      gcloud beta compute reservations create RESERVATION_NAME \
          --delete-at-time=DELETE_AT_TIME \
          --machine-type=MACHINE_TYPE \
          --share-setting=projects \
          --share-with=CONSUMER_PROJECT_IDS \
          --vm-count=NUMBER_OF_VMS \
          --zone=ZONE
      

      Ganti DELETE_AT_TIME dengan tanggal dan waktu yang diformat sebagai stempel waktu RFC 3339, yang harus seperti berikut:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Ganti kode berikut:

      • YYYY-MM-DD: tanggal yang diformat sebagai tahun 4 digit, bulan 2 digit, dan hari 2 digit dalam bulan, yang dipisahkan oleh tanda hubung (-).

      • HH:MM:SS: waktu yang diformat sebagai jam 2 digit menggunakan waktu 24 jam, menit 2 digit, dan detik 2 digit, yang dipisahkan oleh titik dua (:).

      • OFFSET: zona waktu yang diformat sebagai offset dari Waktu Universal Terkoordinasi (UTC). Misalnya, untuk menggunakan Waktu Standar Pasifik (PST), tentukan -08:00. Atau, untuk tidak menggunakan penyeimbang, tentukan Z.

    • Untuk menghapus pemesanan setelah durasi tertentu, gunakan perintah gcloud beta compute reservations create dengan flag --delete-after-duration.

      gcloud beta compute reservations create RESERVATION_NAME \
          --delete-after-duration=DELETE_AFTER_DURATION \
          --machine-type=MACHINE_TYPE \
          --share-setting=projects \
          --share-with=CONSUMER_PROJECT_IDS \
          --vm-count=NUMBER_OF_VMS \
          --zone=ZONE
      

      Ganti DELETE_AFTER_DURATION dengan durasi dalam hari, jam, menit, atau detik. Misalnya, tentukan 30m selama 30 menit, atau 1d2h3m4s untuk 1 hari, 2 jam, 3 menit, dan 4 detik.

Terraform

Untuk membuat pemesanan, gunakan resource Terraform google_compute_reservation. Untuk membagikan pemesanan dengan project lain, tentukan blok share_settings:

  • Tetapkan kolom share_type ke SPECIFIC_PROJECTS.
  • Di blok project_map, tentukan project ID dari project yang ingin Anda gunakan dalam pemesanan bersama.

Untuk informasi selengkapnya tentang cara menggunakan Terraform, lihat artikel Menggunakan Terraform dengan Google Cloud.

REST

Untuk membuat pemesanan bersama, buat permintaan POST ke metode reservations.insert. Dalam isi permintaan, sertakan hal berikut:

  • Kolom projectMap.

  • Kolom shareType ditetapkan ke SPECIFIC_PROJECTS.

Misalnya, untuk membuat pemesanan bersama tanpa menyertakan kolom opsional dan membagikan pemesanan tersebut ke dua project konsumen, buat permintaan POST berikut:

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

{
  "name": "RESERVATION_NAME",
  "shareSettings": {
    "shareType": "SPECIFIC_PROJECTS",
    "projectMap": {
      "CONSUMER_PROJECT_ID_1": {
        "projectId": "CONSUMER_PROJECT_ID_1"
      },
      "CONSUMER_PROJECT_ID_2": {
        "projectId": "CONSUMER_PROJECT_ID_2"
      }
    }
  },
  "specificReservation": {
    "count": "NUMBER_OF_VMS",
    "instanceProperties": {
      "machineType": "MACHINE_TYPE"
    }
  }
}

Ganti kode berikut:

  • PROJECT_ID: ID project tempat Anda ingin memesan resource.

  • ZONE: zona tempat memesan resource.

  • RESERVATION_NAME: nama pemesanan yang akan dibuat.

  • CONSUMER_PROJECT_ID_1 dan CONSUMER_PROJECT_ID_2: ID project yang dapat menggunakan pemesanan ini. Anda dapat menyertakan hingga 100 project konsumen. Project ini harus berada dalam organisasi yang sama dengan project pemilik. Jangan sertakan project pemilik. Secara default, project sudah diizinkan untuk menggunakan pemesanan.

  • NUMBER_OF_VMS: jumlah VM yang akan dipesan.

  • MACHINE_TYPE: jenis mesin yang akan digunakan untuk setiap VM.

Misalnya, untuk membuat reservasi dengan menentukan template instance global di zona us-central1-a, membagikan reservasi dengan project project-1 dan project-2, serta memesan sepuluh VM yang masing-masing menggunakan jenis mesin N2 yang telah ditetapkan dengan 4 vCPU, buat permintaan POST berikut:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/reservations

{
  "name": "my-reservation",
  "shareSettings": {
    "shareType": "SPECIFIC_PROJECTS",
    "projectMap": {
      "project-1": {
        "projectId": "project-1"
      },
      "project-2": {
        "projectId": "project-2"
      }
    }
  },
  "specificReservation": {
    "count": "10",
    "instanceProperties": {
      "machineType": "n2-standard-4",
    }
  }
}

Secara opsional, Anda dapat melakukan satu atau beberapa hal berikut:

  • Untuk memasang GPU ke VM N1 yang dipesan, sertakan kolom guestAccelerators di isi permintaan.

    Misalnya, untuk membuat reservasi yang dibagikan ke dua project konsumen, dan melampirkan GPU ke VM N1 yang dipesan, buat permintaan sebagai berikut:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "shareSettings": {
        "shareType": "SPECIFIC_PROJECTS",
        "projectMap": {
          "CONSUMER_PROJECT_ID_1": {
            "projectId": "CONSUMER_PROJECT_ID_1"
          },
          "CONSUMER_PROJECT_ID_2": {
            "projectId": "CONSUMER_PROJECT_ID_2"
          }
        }
      },
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "instanceProperties": {
          "guestAccelerators": [
            {
              "acceleratorCount": NUMBER_OF_ACCELERATORS,
              "acceleratorType": "ACCELERATOR_TYPE"
            }
          ],
          "machineType": "MACHINE_TYPE"
        }
      }
    }
    

    Ganti kode berikut:

    • NUMBER_OF_ACCELERATORS: jumlah GPU yang akan ditambahkan per VM yang dipesan.

    • ACCELERATOR_TYPE: model GPU yang didukung untuk VM N1. Pastikan model GPU yang Anda pilih tersedia di zona tempat Anda ingin memesan resource. Jika tidak, pembuatan pemesanan akan gagal.

  • Untuk memasang disk SSD Lokal ke jenis mesin yang tidak menyertakan disk SSD Lokal secara default, sertakan kolom localSsds dalam isi permintaan. Anda hanya dapat memasang disk SSD Lokal berukuran 375 GB.

    Misalnya, untuk melampirkan dua disk SSD Lokal ke jenis mesin yang ingin Anda pesan sambil menentukan dua project konsumen, buat permintaan sebagai berikut:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "shareSettings": {
        "shareType": "SPECIFIC_PROJECTS",
        "projectMap": {
          "CONSUMER_PROJECT_ID_1": {
            "projectId": "CONSUMER_PROJECT_ID_1"
          },
          "CONSUMER_PROJECT_ID_2": {
            "projectId": "CONSUMER_PROJECT_ID_2"
          }
        }
      },
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "instanceProperties": {
          "localSsds": [
            {
              "diskSizeGb": "375",
              "interface": "INTERFACE_TYPE"
            },
            {
              "diskSizeGb": "375",
              "interface": "INTERFACE_TYPE"
            }
          ],
          "machineType": "MACHINE_TYPE"
        }
      }
    }
    

    Ganti INTERFACE_TYPE dengan jenis antarmuka disk yang Anda inginkan untuk digunakan setiap disk SSD Lokal dan yang didukung oleh jenis mesin yang Anda tentukan. Tentukan salah satu nilai berikut:

    • Untuk antarmuka disk NVME: NVME

    • Untuk antarmuka disk SCSI: SCSI

  • Agar VM yang dipesan menggunakan platform CPU minimum tertentu, bukan platform CPU default zona, sertakan kolom minCpuPlatform dalam isi permintaan.

    Misalnya, untuk membuat pemesanan bersama sambil menentukan platform CPU minimum dan dua project konsumen, buat permintaan sebagai berikut:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "shareSettings": {
        "shareType": "SPECIFIC_PROJECTS",
        "projectMap": {
          "CONSUMER_PROJECT_ID_1": {
            "projectId": "CONSUMER_PROJECT_ID_1"
          },
          "CONSUMER_PROJECT_ID_2": {
            "projectId": "CONSUMER_PROJECT_ID_2"
          }
        }
      },
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "instanceProperties": {
          "machineType": "MACHINE_TYPE",
          "minCpuPlatform": "MIN_CPU_PLATFORM"
        }
      }
    }
    

    Ganti MIN_CPU_PLATFORM dengan platform CPU minimum. Untuk memastikan bahwa platform CPU tersedia di zona tempat Anda memesan resource, lihat platform CPU yang tersedia menurut zona.

  • Untuk menentukan bahwa hanya VM yang secara khusus menargetkan pemesanan ini yang dapat menggunakannya, sertakan kolom specificReservationRequired dalam isi permintaan, dan tetapkan kolom ke true.

    Misalnya, untuk membuat reservasi tertentu dan membagikannya ke dua project konsumen, buat permintaan sebagai berikut:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "shareSettings": {
        "shareType": "SPECIFIC_PROJECTS",
        "projectMap": {
          "CONSUMER_PROJECT_ID_1": {
            "projectId": "CONSUMER_PROJECT_ID_1"
          },
          "CONSUMER_PROJECT_ID_2": {
            "projectId": "CONSUMER_PROJECT_ID_2"
          }
        }
      },
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "instanceProperties": {
          "machineType": "MACHINE_TYPE"
        }
      },
      "specificReservationRequired": true
    }
    
  • Agar tugas pelatihan kustom atau tugas prediksi di Vertex AI dapat menggunakan reservasi VM GPU, sertakan kolom serviceShareType dan tetapkan ke ALLOW_ALL.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "reservationSharingPolicy": {
        "serviceShareType": "ALLOW_ALL"
      },
      "shareSettings": {
        "shareType": "SPECIFIC_PROJECTS",
        "projectMap": {
          "CONSUMER_PROJECT_ID_1": {
            "projectId": "CONSUMER_PROJECT_ID_1"
          },
          "CONSUMER_PROJECT_ID_2": {
            "projectId": "CONSUMER_PROJECT_ID_2"
          }
        }
      },
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "instanceProperties": {
          "machineType": "MACHINE_TYPE"
        }
      }
    }
    
  • Agar Compute Engine dapat menghapus pemesanan secara otomatis, pilih salah satu metode berikut:

    • Untuk menghapus pemesanan pada tanggal dan waktu tertentu, buat permintaan POST ke metode beta.reservations.insert. Dalam isi permintaan, sertakan kolom deleteAtTime.

      Misalnya, untuk membuat pemesanan sambil menentukan tanggal dan waktu untuk menghapus pemesanan, serta membagikan pemesanan ke dua project konsumen, buat permintaan sebagai berikut:

      POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/reservations
      
      {
        "deleteAtTime": "DELETE_AT_TIME",
        "name": "RESERVATION_NAME",
        "shareSettings": {
          "shareType": "SPECIFIC_PROJECTS",
          "projectMap": {
            "CONSUMER_PROJECT_ID_1": {
              "projectId": "CONSUMER_PROJECT_ID_1"
            },
            "CONSUMER_PROJECT_ID_2": {
              "projectId": "CONSUMER_PROJECT_ID_2"
            }
          }
        },
        "specificReservation": {
          "count": "NUMBER_OF_VMS",
          "instanceProperties": {
            "machineType": "MACHINE_TYPE"
          }
        }
      }
      

      Ganti DELETE_AT_TIME dengan tanggal dan waktu yang diformat sebagai stempel waktu RFC 3339, yang harus seperti berikut:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Ganti kode berikut:

      • YYYY-MM-DD: tanggal yang diformat sebagai tahun 4 digit, bulan 2 digit, dan hari 2 digit dalam bulan, yang dipisahkan oleh tanda hubung (-).

      • HH:MM:SS: waktu yang diformat sebagai jam 2 digit menggunakan waktu 24 jam, menit 2 digit, dan detik 2 digit, yang dipisahkan oleh titik dua (:).

      • OFFSET: zona waktu yang diformat sebagai offset dari Waktu Universal Terkoordinasi (UTC). Misalnya, untuk menggunakan Waktu Standar Pasifik (PST), tentukan -08:00. Atau, untuk tidak menggunakan penyeimbang, tentukan Z.

    • Untuk menghapus pemesanan setelah durasi tertentu, buat permintaan POST ke metode beta.reservations.insert. Dalam isi permintaan, sertakan kolom deleteAfterDuration.

      Misalnya, untuk membuat reservasi yang dihapus Compute Engine setelah durasi tertentu, dan membagikan reservasi tersebut ke dua project konsumen, buat permintaan sebagai berikut:

      POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/reservations
      
      {
        "deleteAfterDuration": {
          "seconds": "DELETE_AFTER_DURATION"
        },
        "name": "RESERVATION_NAME",
        "shareSettings": {
          "shareType": "SPECIFIC_PROJECTS",
          "projectMap": {
            "CONSUMER_PROJECT_ID_1": {
              "projectId": "CONSUMER_PROJECT_ID_1"
            },
            "CONSUMER_PROJECT_ID_2": {
              "projectId": "CONSUMER_PROJECT_ID_2"
            }
          }
        },
        "specificReservation": {
          "count": "NUMBER_OF_VMS",
          "instanceProperties": {
            "machineType": "MACHINE_TYPE"
          }
        }
      }
      

      Ganti DELETE_AFTER_DURATION dengan durasi dalam detik. Misalnya, tentukan 86400 untuk 86.400 detik (1 hari).

Pemecahan masalah

Pelajari cara memecahkan masalah pembuatan reservasi.

Langkah berikutnya