Criar uma reserva compartilhada


Neste documento, explicamos como criar reservas compartilhadas, que são compartilhadas em vários projetos, e gerenciar quais projetos na sua organização podem consumir as reservas compartilhadas.

Uma reserva compartilhada pode ser usada pelo projeto que hospeda a reserva (projeto proprietário) e pelos projetos com que a reserva é compartilhada (projetos consumidores). Use reservas compartilhadas se a organização tiver vários projetos que precisam de instâncias de máquina virtual (VM) com as mesmas propriedades de instância reservadas. Com as reservas compartilhadas, é possível melhorar a utilização de reservas e diminuir o número de reservas que você precisa criar e gerenciar. Para saber mais sobre reservas, consulte Reservas para recursos zonais do Compute Engine.

Para outros métodos de criação de reservas, consulte as seguintes páginas:

  • Se você tiver um compromisso de um ou três anos no projeto atual, seus recursos reservados receberão automaticamente todos os descontos por uso contínuo aplicáveis. Também é possível criar e anexar uma reserva a um compromisso ao comprá-lo. Para saber mais, consulte Anexar reservas a compromissos.

  • Para criar uma reserva que só pode ser usada por um único projeto, consulte Criar uma reserva para um único projeto.

Antes de começar

  • Revise os requisitos e restrições para reservas.
  • Revise os requisitos de cota e as restrições para reservas compartilhadas.
  • Verifique se o projeto usado para criar reservas compartilhadas foi adicionado à lista de permissões da restrição da política da organização Projetos de proprietário de reservas compartilhadas (compute.sharedReservationsOwnerProjects) por um administrador de políticas da organização. Essa lista de permissões fica vazia por padrão. Portanto, não é possível criar reservas compartilhadas até que sua organização conceda essa permissão a um ou mais projetos. Para mais detalhes sobre como ver e editar a restrição da política da organização, consulte Como permitir e restringir projetos de criação e modificação de reservas compartilhadas neste documento.
  • Configure a autenticação, caso ainda não tenha feito isso. A autenticação é o processo de verificação da sua identidade para acesso a serviços e APIs do Google Cloud. Para executar códigos ou amostras de um ambiente de desenvolvimento local, autentique-se no Compute Engine selecionando uma das seguintes opções:

    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. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. Terraform

      Para usar os exemplos do Terraform nesta página em um ambiente de desenvolvimento local, instale e inicialize a gcloud CLI e, em seguida, configure o Application Default Credentials com suas credenciais de usuário.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. 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.

      Confira mais informações em Set up authentication for a local development environment.

      Go

      Para usar os exemplos Go desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. 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.

      Confira mais informações em Set up authentication for a local development environment.

      Java

      Para usar os exemplos Java desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. 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.

      Confira mais informações em Set up authentication for a local development environment.

      Node.js

      Para usar os exemplos Node.js desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. 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.

      Confira mais informações em Set up authentication for a local development environment.

      Python

      Para usar os exemplos Python desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. 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.

      Confira mais informações em Set up authentication for a local development environment.

      REST

      Para usar as amostras da API REST nesta página em um ambiente de desenvolvimento local, use as credenciais fornecidas para gcloud CLI.

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      Para mais informações, consulte Autenticar para usar REST na documentação de autenticação do Google Cloud.

Funções exigidas

Para ter as permissões necessárias para criar reservas compartilhadas, peça ao administrador para conceder a você os seguintes papéis do IAM:

Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Esses papéis predefinidos contêm as permissões necessárias para criar reservas compartilhadas. Para conferir as permissões exatas necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

As permissões a seguir são necessárias para criar reservas compartilhadas:

  • compute.reservations.create no projeto
  • Para visualizar as políticas da organização: orgpolicy.policy.get na organização
  • Para editar políticas da organização: orgpolicy.policy.set na organização
  • Para especificar um modelo de instância: compute.instanceTemplates.useReadOnly no modelo de instância

Essas permissões também podem ser concedidas com funções personalizadas ou outros papéis predefinidos.

Práticas recomendadas

Ao criar reservas compartilhadas, recomendamos as práticas a seguir. Ao adotá-las, é possível otimizar a capacidade de gerenciamento e a utilização de reservas compartilhadas na sua organização.

  • Fazer com que o projeto proprietário crie a reserva compartilhada, mas não a consuma
    • Para distribuir os gastos entre os projetos, é recomendável que uma reserva compartilhada seja consumida apenas pelos projetos consumidores. O projeto proprietário só deve ser usado para criar a reserva compartilhada.
    • Ao criar uma reserva compartilhada, o projeto proprietário precisa ter cota suficiente para o total de recursos a serem reservados. Depois que a reserva é criada, o projeto proprietário precisa ter cota para todos os recursos reservados que ele quer efetivar. Para mais informações, consulte Requisitos de cota adicionais para reservas compartilhadas.
  • Minimize o número de projetos na organização que têm permissão para criar reservas compartilhadas. Você pode controlar isso por meio da restrição da política da organização de Projetos de proprietário de reservas compartilhadas (compute.sharedReservationsOwnerProjects).
    • Só é possível listar as reservas criadas por cada projeto. Isso significa que as reservas compartilhadas são listadas apenas no projeto de proprietário. Não é possível listar as reservas compartilhadas com cada projeto ou todas as reservas compartilhadas em cada organização. Portanto, ter apenas alguns projetos de proprietário facilita o monitoramento e o gerenciamento das reservas compartilhadas.
    • Limite o compartilhamento de uma reserva compartilhada a poucos projetos, apenas para gerenciar a cota dos seus recursos reservados com mais facilidade.
    • Para mais informações, consulte Permitir e restringir projetos para criar e modificar reservas compartilhadas.
  • Minimize o número de reservas compartilhadas separadas com propriedades de VM idênticas.
    • Uma organização pode ter até 100 reservas compartilhadas para cada combinação exclusiva de propriedades de VM. Como resultado, minimizar o número de reservas compartilhadas com propriedades de VM idênticas criadas ajuda a atenuar esse limite.
    • Ter menos reservas compartilhadas melhora o gerenciamento.
  • Compartilhe reservas apenas entre projetos com a mesma conta do Cloud Billing.
    • Limite cada reserva compartilhada para ser compartilhada apenas com projetos de consumidor que tenham a mesma conta do Cloud Billing que o projeto do proprietário. Isso facilita ao verificar se a reserva foi consumida e como foi faturada.
    • Se você ativou o compartilhamento de CUD e se qualifica para receber CUDs no nível da conta do Cloud Billing, maximize os CUDs recebidos para suas reservas consumidas ao limitar suas reservas compartilhadas na conta do Cloud Billing desse compromisso. Isso permite manter um faturamento consistente nos projetos que criam e consomem reservas compartilhadas.
  • Para solicitações de reserva adiantada, analise cuidadosamente a contagem total de VMs solicitadas.
    • Se você estiver criando uma solicitação de reserva adiantada, solicite uma contagem total de VMs que considere todos os itens a seguir:
      • Todas as VMs reservadas correspondentes que já existirão na data futura
      • Todas as VMs não reservadas correspondentes que já existirão na data futura
      • Todas as reservas imediatas não utilizadas correspondentes que já existirão na data futura
      • O aumento no uso que você quer reservar na data futura.

      Por exemplo, suponha que você precise de 10 VMs extras na data futura e já tenha os seguintes recursos na data futura:

      • 40 VMs reservadas correspondentes
      • 50 VMs não reservadas correspondentes

      ou

      • 40 VMs reservadas correspondentes
      • 50 reservas imediatas não utilizadas correspondentes

      Como seu uso na data futura já adicionará até 90 VMs e reservas correspondentes e você precisará de mais 10 VMs, será preciso especificar uma contagem total de 100 na sua solicitação de reserva adiantada.

      Para mais informações, consulte Contar e provisionar recursos reservados.

Permitir e impedir que projetos criem e modifiquem reservas compartilhadas

Por padrão, nenhum projeto tem permissão para criar ou modificar reservas compartilhadas em uma organização. Adicione projetos à restrição da política da organização Projetos de proprietário de reservas compartilhadas (compute.sharedReservationsOwnerProjects) para permitir que criem e modifiquem reservas compartilhadas. Saiba mais sobre restrições de políticas da organização em Introdução ao serviço de políticas da organização.

Siga as etapas a seguir para visualizar e editar a restrição da política da organização Projetos de proprietário de reservas compartilhadas (compute.sharedReservationsOwnerProjects).

Ver a restrição da política da organização de reservas compartilhadas

Veja quais projetos têm permissão para criar e modificar reservas compartilhadas usando o console do Google Cloud ou a CLI gcloud.

Console

Siga as etapas em Como visualizar políticas da organização usando a restrição Projetos de proprietário de reservas compartilhadas.

gcloud

Para ver quais projetos a restrição compute.sharedReservationsOwnerProjects permite criar e modificar reservas compartilhadas:

  1. Faça o download da política da sua organização como um arquivo chamado policy.yaml, usando o comando gcloud resource-manager org-policies describe:

    gcloud resource-manager org-policies describe compute.sharedReservationsOwnerProjects --organization=ORGANIZATION_ID > policy.yaml
    

    Substitua ORGANIZATION_ID pelo ID da organização.

  2. Use um editor de texto para abrir o arquivo policy.yaml e ver a restrição compute.sharedReservationsOwnerProjects. Os projetos que têm permissão para criar e modificar reservas compartilhadas estão listados em allowedValues:

    ...
    constraint: constraints/compute.sharedReservationsOwnerProjects
    listPolicy:
      allowedValues:
      - projects/PROJECT_NUMBER_1
      - projects/PROJECT_NUMBER_2
      - projects/PROJECT_NUMBER_3
    ...
    

    em que PROJECT_NUMBER_1, PROJECT_NUMBER_2 e PROJECT_NUMBER_3 são os números de projeto dos únicos projetos da organização que têm permissão para criar reservas compartilhadas.

  3. Opcional: exclua o arquivo policy.yaml.

    • Se você estiver usando um terminal Linux ou macOS, use o seguinte comando:

      rm policy.yaml
      
    • Se você estiver usando um terminal do Windows, use o seguinte comando:

      del policy.yaml
      

Editar a restrição da política da organização de reservas compartilhadas

Para editar quais projetos têm permissão para criar e modificar reservas compartilhadas use o console do Google Cloud ou a CLI gcloud.

Console

Siga as etapas em Como personalizar políticas para restrições de lista usando a restrição Projetos de proprietário de reservas compartilhadas.

gcloud

Para editar quais projetos a restrição compute.sharedReservationsOwnerProjects permite criar e modificar reservas compartilhadas, use um dos seguintes métodos:

  • Para conceder permissão a um único projeto para criar e modificar reservas compartilhadas, use o comando gcloud resource-manager org-policies allow. Repita esse comando para cada projeto ao qual quer conceder essa permissão.

    gcloud resource-manager org-policies allow compute.sharedReservationsOwnerProjects projects/PROJECT_NUMBER \
        --organization=ORGANIZATION_ID
    

    Substitua:

    • PROJECT_NUMBER: o número do projeto (não o ID) de um projeto na organização que você quer permitir para criar e modificar reservas compartilhadas.
    • ORGANIZATION_ID: o ID da organização.
  • Para conceder ou revogar as permissões de vários projetos para criar e modificar reservas compartilhadas, substitua a restrição da política da organização:

    1. Para fazer o download da política da sua organização como um arquivo chamado policy.yaml, use o comando gcloud resource-manager org-policies describe:

      gcloud resource-manager org-policies describe compute.sharedReservationsOwnerProjects --organization=ORGANIZATION_ID > policy.yaml
      

      Substitua ORGANIZATION_ID pelo ID da organização.

    2. Use um editor de texto para modificar o arquivo policy.yaml para que a restrição compute.sharedReservationsOwnerProjects liste todos os projetos que podem ter permissão para criar e modificar reservas compartilhadas em allowedValues.

      • Para cada projeto que receber permissão para criar e modificar reservas compartilhadas, adicione o projeto a uma nova linha em allowedValues.
      • Para cada projeto que tiver permissão revogada para criar e modificar reservas compartilhadas, exclua a linha desse projeto.

      Ao terminar, verifique se o arquivo policy.yaml fica parecido com o seguinte:

      ...
      constraint: constraints/compute.sharedReservationsOwnerProjects
      listPolicy:
        allowedValues:
        - projects/PROJECT_NUMBER_1
        - projects/PROJECT_NUMBER_2
        - projects/PROJECT_NUMBER_3
      ...
      

      em que PROJECT_NUMBER_1, PROJECT_NUMBER_2 e PROJECT_NUMBER_3 são os números (não os IDs) de todos os projetos em sua organização que você quer que crie e modifique reservas compartilhadas.

    3. Salve o arquivo policy.yaml e feche o editor.

    4. Para atualizar a política da organização com as alterações, use o comando gcloud resource-manager org-policies set-policy:

      gcloud resource-manager org-policies set-policy --organization=ORGANIZATION_ID policy.yaml
      

      Substitua ORGANIZATION_ID pelo ID da organização.

    5. Opcional: exclua o arquivo policy.yaml.

      • Se você estiver usando um terminal Linux ou macOS, use o seguinte comando:

        rm policy.yaml
        
      • Se você estiver usando um terminal do Windows, use o seguinte comando:

        del policy.yaml
        

Talvez seja necessário aguardar alguns minutos para que a edição entre em vigor.

Criar uma reserva compartilhada

Nesta seção, explicamos como criar reservas compartilhadas. Depois de criar uma reserva compartilhada, ela pode ser modificada apenas pelo projeto proprietário, mas os recursos de uma reserva compartilhada podem ser consumidos pelo projeto proprietário ou por qualquer projeto do consumidor.

Para consumir uma reserva, uma VM precisa ter propriedades que correspondam exatamente a essa reserva. Para especificar as propriedades das VMs que você quer reservar, selecione uma das seguintes seções neste documento:

  • Recomendado: Especificar um modelo de instância

    Nesta seção, explicamos como usar um modelo de instância para definir as propriedades de uma reserva compartilhada. Ao usar um modelo de instância, é possível definir as propriedades de uma reserva e as VMs que podem consumir a reserva no mesmo lugar. No entanto, como os modelos são específicos do projeto, não é possível usar o mesmo modelo para criar VMs que possam consumir a reserva fora do projeto que a criou. Para os projetos com que a reserva é compartilhada, crie modelos semelhantes nesses projetos ou crie VMs especificando propriedades diretamente.

  • Especificar uma VM atual

    Esta seção explica como usar uma VM atual para definir as propriedades de uma reserva. Ao usar as propriedades de uma VM existente, é possível consumir a reserva criando VMs com propriedades que correspondem à VM de referência.

  • Especificar propriedades diretamente

    Nesta seção, explicamos como definir diretamente as propriedades de uma reserva compartilhada. Esse método exige que você garanta manualmente que as propriedades das VMs e reservas sejam exatamente correspondentes entre si, ou seja, propriedades incompatíveis impedem o consumo.

Por padrão, uma reserva pode ser consumida automaticamente por qualquer VM com propriedades correspondentes. Se você quiser controlar o consumo de reservas, siga um ou mais de um destes procedimentos:

Especificar um modelo de instância

Antes de criar uma reserva especificando um modelo de instância, verifique o seguinte:

  • Um modelo de instância contém configurações específicas do projeto. Portanto, só é possível acessar e usar um modelo de instância no mesmo projeto. Se você criar uma reserva compartilhada especificando um modelo de instância, não poderá usar o mesmo modelo para criar VMs que possam efetivar a reserva fora do projeto que a criou.

  • Crie a reserva na mesma região e zona que os recursos no modelo de instância. Todos os recursos regionais ou zonais especificados em um modelo de instância, como um tipo de máquina ou um Persistent Disk, restringem o uso do modelo aos locais em que esses recursos estão. Por exemplo, se o modelo de instância especificar um volume do Persistent Disk na zona us-central1-a, só será possível criar a reserva na mesma zona. Para verificar se um modelo já existente especifica algum recurso que o vincule a uma região ou zona específica, veja os detalhes do modelo e procure referências a esses recursos regionais ou zonais dentro dele.

Para criar uma reserva compartilhada especificando um modelo de instância, selecione uma das seguintes opções:

Console

  1. No console do Google Cloud, acesse a página Reservas.

    Acessar "Reservas"

    A página Reservas é exibida.

  2. Clique em Criar reserva.

    A página Criar uma reserva será exibida.

  3. Em Nome, insira um nome para o provedor.

  4. Para Região e Zona, selecione onde você quer reservar recursos.

  5. Na seção Tipo de compartilhamento, faça o seguinte:

    1. Para especificar uma reserva compartilhada, clique em Compartilhada.

    2. Clique em Adicionar projetos e selecione os projetos da organização com que você quer compartilhar a reserva. É possível selecionar até 100 projetos.

  6. Opcional: para permitir que uma reserva de VMs de GPU seja consumida por jobs de treinamento personalizado ou jobs de previsão na Vertex AI, na seção Serviços do Google Cloud, selecione Compartilhar reserva.

  7. Na seção Usar com instância de VM, selecione uma das seguintes opções:

    • Para permitir que instâncias de VM correspondentes usem essa reserva automaticamente, selecione Usar reserva automaticamente, se ainda não estiver selecionado.

    • Para consumir os recursos desta reserva apenas ao criar VMs correspondentes que visam especificamente essa reserva por nome, clique em Selecionar reserva específica.

  8. Em Número de instâncias de VM, insira o número de VMs que você quer reservar.

  9. Na seção Configuração da máquina, selecione Usar modelo de instância e escolha o modelo de instância de sua preferência. Se você selecionar um modelo de instância regional, só poderá reservar na mesma região que a do modelo.

  10. Na seção Exclusão automática, é possível ativar a opção para permitir que o Compute Engine exclua automaticamente a reserva em uma data e hora específicas. A exclusão automática de reservas pode ser útil para evitar cobranças desnecessárias quando você para de consumir a reserva.

  11. Para criar a reserva, clique em Criar.

    A página Reservas abre. A criação da reserva compartilhada pode levar até um minuto para ser concluída.

gcloud

Para criar uma reserva compartilhada, use o comando gcloud compute reservations create com as sinalizações --share-setting=projects e --share-with.

Para criar uma reserva compartilhada especificando um modelo de instância sem flags opcionais, execute o seguinte comando:

gcloud compute reservations create RESERVATION_NAME \
    --share-setting=projects \
    --share-with=CONSUMER_PROJECT_IDS \
    --source-instance-template=projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME \
    --vm-count=NUMBER_OF_VMS \
    --zone=ZONE

Substitua:

  • RESERVATION_NAME: o nome da reserva a ser criada.

  • PROJECT_ID: o ID do projeto em que você quer reservar recursos e onde o modelo de instância existe.

  • CONSUMER_PROJECT_IDS: uma lista separada por vírgulas de IDs de projetos que podem consumir essa reserva, por exemplo, project-1,project-2. É possível incluir até 100 projetos pessoais. Esses projetos precisam estar na mesma organização do projeto de proprietário. Não inclua o projeto proprietário. Por padrão, a reserva já pode ser efetivada.

  • LOCATION: o local do modelo de instância. Especifique um dos seguintes valores:

    • Para um modelo de instância global: global

    • Para um modelo de instância regional: regions/REGION. Substitua REGION pela região em que o modelo de instância está. Se você selecionar um modelo de instância regional, só poderá reservar na mesma região que a do modelo.

  • INSTANCE_TEMPLATE_NAME: o nome de um modelo de instância. Se o modelo de instância especificar um tipo de máquina A3, inclua a flag --require-specific-reservation. Isso indica que apenas VMs que segmentam especificamente a reserva podem efetivá-la. Para mais informações, consulte Efetivar VMs de uma reserva específica.

  • NUMBER_OF_VMS: o número de VMs a serem reservadas.

  • ZONE: a zona em que os recursos serão reservados.

Por exemplo, para criar uma reserva especificando um modelo de instância global na zona us-central1-a, compartilhe a reserva com os projetos project-1 e project-2 e reserve dez VMs que usam um tipo de máquina predefinido N2 com quatro vCPUs, execute o seguinte comando:

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

Também é possível realizar uma ou mais das seguintes ações:

  • Para especificar que apenas VMs que segmentam especificamente esta reserva podem consumi-la, inclua a flag --require-specific-reservation.

    gcloud compute reservations create RESERVATION_NAME \
        --require-specific-reservation \
        --share-setting=projects \
        --share-with=CONSUMER_PROJECT_IDS \
        --source-instance-template=projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    
  • Para permitir que uma reserva de VMs de GPU seja consumida por jobs de treinamento personalizado ou jobs de previsão na Vertex AI, use o comando gcloud beta compute reservations create com a flag --reservation-sharing-policy=ALLOW_ALL.

    gcloud beta compute reservations create RESERVATION_NAME \
        --reservation-sharing-policy=ALLOW_ALL \
        --share-setting=projects \
        --share-with=CONSUMER_PROJECT_IDS \
        --source-instance-template=projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    
  • Para permitir que o Compute Engine exclua automaticamente a reserva, selecione um dos seguintes métodos:

    • Para excluir a reserva em uma data e hora específicas, use o comando gcloud beta compute reservations create com a 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=projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME \
          --vm-count=NUMBER_OF_VMS \
          --zone=ZONE
      

      Substitua DELETE_AT_TIME por uma data e hora formatadas como um carimbo de data/hora RFC 3339, que precisa ser o seguinte:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Substitua:

      • YYYY-MM-DD: uma data formatada como um ano de quatro dígitos, um mês de dois dígitos e um dia de dois dígitos, separados por hífens (-).

      • HH:MM:SS: um horário formatado como uma hora de dois dígitos usando um horário de 24 horas, minutos de dois dígitos e segundos de dois dígitos, separados por dois pontos (:).

      • OFFSET: o fuso horário formatado como um ajuste de Tempo Universal Coordenado (UTC). Por exemplo, para usar o horário padrão do Pacífico (PST), especifique -08:00. Outra possibilidade é não usar ajuste: especifique Z.

    • Para excluir a reserva após uma duração específica, use o comando gcloud beta compute reservations create com a 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=projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME \
          --vm-count=NUMBER_OF_VMS \
          --zone=ZONE
      

      Substitua DELETE_AFTER_DURATION por uma duração em dias, horas, minutos ou segundos. Por exemplo, especifique 30m para 30 minutos ou 1d2h3m4s para 1 dia, 2 horas, 3 minutos e 4 segundos.

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.Operation;
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 {
  private final ReservationsClient reservationsClient;

  // Constructor to inject the ReservationsClient
  public CreateSharedReservation(ReservationsClient reservationsClient) {
    this.reservationsClient = reservationsClient;
  }

  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 the reservation resides.
    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/YOUR_INSTANCE_TEMPLATE_NAME", projectId);
    // Number of instances for which capacity needs to be reserved.
    int vmCount = 3;
    // In your main method, create ReservationsClient
    ReservationsClient client = ReservationsClient.create();
    // Create an instance of your class, passing in the client
    CreateSharedReservation creator = new CreateSharedReservation(client);

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

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

    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_ID_1", ShareSettingsProjectConfig.newBuilder().build())
        .putProjectMap("CONSUMER_PROJECT_ID_2", ShareSettingsProjectConfig.newBuilder().build())
        .build();

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

    // Wait for the create reservation operation to complete.
    Operation response =
        this.reservationsClient.insertAsync(projectId, zone, reservation).get(3, TimeUnit.MINUTES);

    if (response.hasError()) {
      System.out.println("Reservation creation failed!" + response);
      return;
    }
    System.out.println("Reservation created. Operation Status: " + 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

Para criar uma reserva compartilhada, faça uma solicitação POST para o método reservations.insert. No corpo da solicitação, inclua o seguinte:

  • O campo projectMap.

  • O campo shareType definido como SPECIFIC_PROJECTS.

Por exemplo, para criar uma reserva compartilhada especificando um modelo de instância sem incluir campos opcionais e compartilhar a reserva com dois projetos de consumidor, faça a seguinte solicitação POST:

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": "projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME"
  }
}

Substitua:

  • PROJECT_ID: o ID do projeto em que você quer reservar recursos e onde o modelo de instância existe.

  • ZONE: a zona em que os recursos serão reservados.

  • RESERVATION_NAME: o nome da reserva a ser criada.

  • CONSUMER_PROJECT_ID_1 e CONSUMER_PROJECT_ID_2: os IDs do projeto que podem consumir essa reserva. É possível incluir até 100 projetos pessoais. Esses projetos precisam estar na mesma organização do projeto de proprietário. Não inclua o projeto proprietário. Por padrão, ele já pode consumir a reserva.

  • NUMBER_OF_VMS: o número de VMs a serem reservadas.

  • LOCATION: o local do modelo de instância. Especifique um dos seguintes valores:

    • Para um modelo de instância global: global

    • Para um modelo de instância regional: regions/REGION. Substitua REGION pela região em que o modelo de instância está. Se você selecionar um modelo de instância regional, só poderá reservar na mesma região que a do modelo.

  • INSTANCE_TEMPLATE_NAME: o nome de um modelo de instância. Se o modelo de instância especificar um tipo de máquina A3, inclua o campo specificReservationRequired no corpo da solicitação e defina o campo como true. Isso indica que apenas VMs que segmentam especificamente essa reserva podem efetivá-la. Para mais informações, consulte Efetivar VMs de uma reserva específica.

Por exemplo, para criar uma reserva para dez VMs na zona us-central1-a especificando um modelo de instância global e compartilhar a reserva com os projetos project-1 e project-2, faça a solicitação POST a seguir:

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": "projects/example-project/global/instanceTemplates/example-instance-template"
  }
}

Também é possível realizar uma ou mais das seguintes ações:

  • Para especificar que apenas VMs que segmentam especificamente esta reserva possam consumi-la, inclua o campo specificReservationRequired no corpo da solicitação e defina-o como true.

    Por exemplo, para criar uma reserva específica especificando um modelo de instância e compartilhar a reserva com dois projetos de consumidor, faça uma solicitação da seguinte maneira:

    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": "projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME"
      },
      "specificReservationRequired": true
    }
    
  • Para permitir que uma reserva de VMs de GPU seja consumida por jobs de treinamento personalizado ou jobs de previsão na Vertex AI, faça uma solicitação POST para o método beta.reservations.insert. No corpo da solicitação, inclua o campo serviceShareType e defina-o como ALLOW_ALL.

    POST https://compute.googleapis.com/compute/beta/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": "projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME"
      }
    }
    
  • Para permitir que o Compute Engine exclua automaticamente a reserva, selecione um dos seguintes métodos:

    • Para excluir a reserva em uma data e hora específicas, faça uma solicitação POST para o método beta.reservations.insert. No corpo da solicitação, inclua o campo deleteAtTime.

      Por exemplo, para criar uma reserva especificando um modelo de instância, excluir automaticamente a reserva em uma data e hora específicas e compartilhar a reserva com dois projetos de consumidor, faça uma solicitação da seguinte maneira:

      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": "projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME"
        }
      }
      

      Substitua DELETE_AT_TIME por uma data e hora formatadas como um carimbo de data/hora RFC 3339, que precisa ser o seguinte:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Substitua:

      • YYYY-MM-DD: uma data formatada como um ano de quatro dígitos, um mês de dois dígitos e um dia de dois dígitos, separados por hífens (-).

      • HH:MM:SS: um horário formatado como uma hora de dois dígitos usando um horário de 24 horas, minutos de dois dígitos e segundos de dois dígitos, separados por dois pontos (:).

      • OFFSET: o fuso horário formatado como um ajuste de Tempo Universal Coordenado (UTC). Por exemplo, para usar o horário padrão do Pacífico (PST), especifique -08:00. Outra possibilidade é não usar ajuste: especifique Z.

    • Para excluir a reserva após uma duração específica, faça uma solicitação POST para o método beta.reservations.insert. No corpo da solicitação, inclua o campo deleteAfterDuration.

      Por exemplo, para criar uma reserva especificando um modelo de instância, excluir automaticamente a reserva após um período específico e compartilhar a reserva com dois projetos de consumidor, faça uma solicitação da seguinte maneira:

      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": "projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME"
        }
      }
      

      Substitua DELETE_AFTER_DURATION por uma duração em segundos. Por exemplo, especifique 86400 para 86.400 segundos (1 dia).

Especificar uma VM atual

Só é possível criar uma reserva compartilhada com base em uma VM existente no mesmo projeto e zona que a VM.

Depois de criar a reserva, é possível consumi-la criando VMs com propriedades que correspondem à VM de referência. Para fazer isso, siga um destes procedimentos:

  • Crie e use um modelo de instância da seguinte maneira:

    1. Crie um modelo de instância com base na VM de referência sem substituir as propriedades dela.

    2. Crie VMs usando o modelo recém-criado fazendo uma ou ambas as seguintes ações:

  • Crie uma VM com propriedades que correspondam exatamente à VM de referência da seguinte maneira:

    • No projeto do proprietário, crie uma VM com base na VM de referência sem alterar as propriedades da VM que você está criando.

    • Nos projetos do consumidor, crie uma VM e verifique manualmente se as propriedades dela e da VM de referência correspondem.

Para criar uma reserva compartilhada que use as propriedades de uma VM existente, faça o seguinte:

  1. No console do Google Cloud, acesse a página Reservas.

    Acessar "Reservas"

  2. Na guia Reservas on demand (padrão), clique em Criar reserva.

    A página Criar uma reserva é aberta.

  3. Em Nome, insira um nome para o provedor.

  4. Para Região e Zona, selecione onde você quer reservar recursos.

  5. Na seção Tipo de compartilhamento, faça o seguinte:

    1. Para especificar uma reserva compartilhada, clique em Compartilhada.

    2. Clique em Adicionar projetos e selecione os projetos da organização com que você quer compartilhar a reserva. É possível selecionar até 100 projetos.

  6. Na seção Usar com instância de VM, selecione uma das seguintes opções:

    • Para permitir que VMs correspondentes consumam essa reserva automaticamente, selecione Usar reserva automaticamente, se ainda não estiver selecionado.

    • Para consumir os recursos desta reserva apenas ao criar VMs correspondentes que visam especificamente essa reserva por nome, clique em Selecionar reserva específica.

  7. Em Número de instâncias de VM, insira o número de VMs que você quer reservar.

  8. Na seção Configuração da máquina, faça o seguinte:

    1. Selecione Usar VM atual.

    2. Em VM existente, selecione as propriedades que você quer usar para criar a reserva.

  9. Na seção Exclusão automática, é possível ativar a opção para permitir que o Compute Engine exclua automaticamente a reserva em uma data e hora específicas. A exclusão automática de reservas pode ser útil para evitar cobranças desnecessárias quando você para de consumir a reserva.

  10. Para criar a reserva, clique em Criar.

    A página Reservas abre. A criação da reserva pode levar até um minuto para ser concluída.

Especificar propriedades diretamente

Para criar uma reserva compartilhada especificando propriedades diretamente, selecione uma das seguintes opções:

Console

  1. No console do Google Cloud, acesse a página Reservas.

    Acessar "Reservas"

  2. Na guia Reservas on demand (padrão), clique em Criar reserva.

  3. Clique em Criar reserva.

    A página Criar uma reserva será exibida.

  4. Em Nome, insira um nome para o provedor.

  5. Para Região e Zona, selecione onde você quer reservar recursos.

  6. Na seção Tipo de compartilhamento, faça o seguinte:

    1. Para especificar uma reserva compartilhada, clique em Compartilhada.

    2. Clique em Adicionar projetos e selecione os projetos da organização com que você quer compartilhar a reserva. É possível selecionar até 100 projetos.

  7. Opcional: para permitir que uma reserva de VMs de GPU seja consumida por jobs de treinamento personalizado ou jobs de previsão na Vertex AI, na seção Serviços do Google Cloud, selecione Compartilhar reserva.

  8. Na seção Usar com instância de VM, selecione uma das seguintes opções:

    • Permitir que VMs correspondentes efetivem essa reserva automaticamente. Clique em Usar reserva automaticamente (padrão).

    • Para consumir os recursos desta reserva apenas ao criar VMs correspondentes que visam especificamente essa reserva por nome, clique em Selecionar reserva específica.

  9. Em Número de instâncias de VM, insira o número de VMs que você quer reservar.

  10. Na seção Configuração da máquina, selecione Especificar tipo de máquina e especifique o seguinte:

    1. Em Família de máquinas, Série e Tipo de máquina, selecione uma família, uma série e um tipo de máquina.

    2. Opcional: para especificar uma plataforma mínima de CPU ou anexar GPUs a VMs N1, faça o seguinte:

      1. Para expandir a seção Plataforma de CPU e GPU, clique na seta de expansão .

      2. Opcional: para especificar uma plataforma mínima de CPU, selecione uma opção em Plataforma de CPU.

      3. Opcional: para anexar GPUs a VMs N1, clique em Adicionar GPU. Em seguida, para Tipo de GPU e Número de GPUs, selecione o tipo e o número de GPUs a serem anexados a cada VM N1.

    3. Opcional: para adicionar discos SSD locais, faça o seguinte:

      1. Em Número de discos, selecione o número de discos SSD locais para cada VM.

      2. Em Tipo de interface, selecione a interface para os discos SSD locais.

  11. Na seção Exclusão automática, é possível ativar a opção para permitir que o Compute Engine exclua automaticamente a reserva em uma data e hora específicas. A exclusão automática de reservas pode ser útil para evitar cobranças desnecessárias quando você para de consumir a reserva.

  12. Para criar a reserva, clique em Criar.

    A página Reservas abre. A criação da reserva compartilhada pode levar até um minuto para ser concluída.

gcloud

Para criar uma reserva compartilhada, use o comando gcloud compute reservations create com as sinalizações --share-setting=projects e --share-with.

Para criar uma reserva compartilhada especificando propriedades diretamente e sem incluir flags opcionais, execute o seguinte comando:

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

Substitua:

  • RESERVATION_NAME: o nome da reserva a ser criada.

  • MACHINE_TYPE: um tipo de máquina a ser usado em cada VM. Se você especificar um tipo de máquina A3, inclua a flag --require-specific-reservation. Isso indica que apenas VMs que segmentam especificamente a reserva podem efetivá-la. Para mais informações, consulte Efetivar VMs de uma reserva específica.

  • CONSUMER_PROJECT_IDS: uma lista separada por vírgulas de IDs de projetos que podem consumir essa reserva, por exemplo, project-1,project-2. É possível incluir até 100 projetos pessoais. Esses projetos precisam estar na mesma organização do projeto de proprietário. Não inclua o projeto proprietário. Por padrão, ele já é permitido para consumir a reserva.

  • NUMBER_OF_VMS: o número de VMs a serem reservadas.

  • ZONE: a zona em que os recursos serão reservados.

Por exemplo, para criar uma reserva na zona us-central1-a para dez VMs, cada uma usando um tipo de máquina predefinido N2 com 4 vCPUs, e compartilhar a reserva com os projetos project-1 e project-2, execute o seguinte comando:

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

Também é possível realizar uma ou mais das seguintes ações:

  • Para anexar GPUs às VMs N1 reservadas, inclua a flag --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
    

    Substitua:

  • Para adicionar um ou mais discos SSD locais a cada VM reservada, inclua uma ou mais flags --local-ssd. É possível especificar até 24 discos SSD locais. Cada SSD local tem 375 GB.

    Por exemplo, para especificar dois discos SSD locais ao criar uma reserva compartilhada, inclua duas flags --local-ssd da seguinte maneira:

    gcloud compute reservations create RESERVATION_NAME \
        --local-ssd=size=375,interface=INTERFACE_1 \
        --local-ssd=size=375,interface=INTERFACE_2 \
        --machine-type=MACHINE_TYPE \
        --share-setting=projects \
        --share-with=CONSUMER_PROJECT_IDS \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    

    Substitua INTERFACE_1 e INTERFACE_2 pelo tipo de interface que você quer que cada SSD local use. Especifique um dos seguintes valores:

    • Interfaces de disco NVME: nvme

    • Interfaces de disco SCSI: scsi

    Verifique se o tipo de máquina especificado para as VMs reservadas é compatível com as interfaces de disco escolhidas. Caso contrário, a criação da reserva falhará. Para mais informações, veja como escolher uma interface de disco.

  • Para que as VMs reservadas usem uma plataforma mínima de CPU específica, em vez da plataforma de CPU padrão da zona, inclua a 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
    

    Substitua MIN_CPU_PLATFORM por uma plataforma de CPU mínima. Para garantir que uma plataforma de CPU esteja disponível na zona em que você está reservando recursos, confira as plataformas de CPU disponíveis por zona.

  • Para especificar que apenas VMs que segmentam especificamente esta reserva podem consumi-la, inclua a 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
    
  • Para permitir que uma reserva de VMs de GPU seja consumida por jobs de treinamento personalizado ou jobs de previsão na Vertex AI, use o comando gcloud beta compute reservations create com a flag --reservation-sharing-policy=ALLOW_ALL.

    gcloud beta 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
    
  • Para permitir que o Compute Engine exclua automaticamente a reserva, selecione um dos seguintes métodos:

    • Para excluir a reserva em uma data e hora específicas, use o comando gcloud beta compute reservations create com a 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
      

      Substitua DELETE_AT_TIME por uma data e hora formatadas como um carimbo de data/hora RFC 3339, que precisa ser o seguinte:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Substitua:

      • YYYY-MM-DD: uma data formatada como um ano de quatro dígitos, um mês de dois dígitos e um dia de dois dígitos, separados por hífens (-).

      • HH:MM:SS: um horário formatado como uma hora de dois dígitos usando um horário de 24 horas, minutos de dois dígitos e segundos de dois dígitos, separados por dois pontos (:).

      • OFFSET: o fuso horário formatado como um ajuste de Tempo Universal Coordenado (UTC). Por exemplo, para usar o horário padrão do Pacífico (PST), especifique -08:00. Outra possibilidade é não usar ajuste: especifique Z.

    • Para excluir a reserva após uma duração específica, use o comando gcloud beta compute reservations create com a 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
      

      Substitua DELETE_AFTER_DURATION por uma duração em dias, horas, minutos ou segundos. Por exemplo, especifique 30m para 30 minutos ou 1d2h3m4s para 1 dia, 2 horas, 3 minutos e 4 segundos.

Terraform

Para criar uma reserva, use o recurso google_compute_reservation do Terraform. Para especificar uma reserva compartilhada, defina o bloco share_settings:

  • Defina o campo share_type como SPECIFIC_PROJECTS
  • No bloco project_map, especifique os IDs dos projetos com que você quer compartilhar essa reserva.

Para mais informações sobre como usar o Terraform, consulte Como usar o Terraform com o Google Cloud.

REST

Para criar uma reserva compartilhada, faça uma solicitação POST para o método reservations.insert. No corpo da solicitação, inclua o seguinte:

  • O campo projectMap.

  • O campo shareType definido como SPECIFIC_PROJECTS.

Por exemplo, para criar uma reserva compartilhada sem campos opcionais e compartilhar a reserva com dois projetos de consumidor, faça a seguinte solicitação POST:

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"
    }
  }
}

Substitua:

  • PROJECT_ID: o ID do projeto em que você quer reservar recursos.

  • ZONE: a zona em que os recursos serão reservados.

  • RESERVATION_NAME: o nome da reserva a ser criada.

  • CONSUMER_PROJECT_ID_1 e CONSUMER_PROJECT_ID_2: os IDs do projeto que podem consumir essa reserva. É possível incluir até 100 projetos pessoais. Esses projetos precisam estar na mesma organização do projeto de proprietário. Não inclua o projeto proprietário. Por padrão, ele já pode consumir a reserva.

  • NUMBER_OF_VMS: o número de VMs a serem reservadas.

  • MACHINE_TYPE: um tipo de máquina a ser usado em cada VM. Se você especificar um tipo de máquina A3, inclua o campo specificReservationRequired no corpo da solicitação e defina-o como true. Isso indica que apenas VMs que segmentam especificamente a reserva podem consumi-la.

Por exemplo, para criar uma reserva especificando um modelo de instância global na zona us-central1-a, compartilhe a reserva com os projetos project-1 e project-2 e reserve dez VMs que usam um tipo de máquina predefinido N2 com quatro vCPUs, faça a seguinte solicitação POST:

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",
    }
  }
}

Também é possível realizar uma ou mais das seguintes ações:

  • Para anexar GPUs às VMs N1 reservadas, inclua o campo guestAccelerators no corpo da solicitação.

    Por exemplo, para criar uma reserva compartilhada com dois projetos de consumidor e anexar GPUs a qualquer VM N1 reservada, faça uma solicitação da seguinte maneira:

    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"
        }
      }
    }
    

    Substitua:

  • Para adicionar um ou mais discos SSD locais a cada VM reservada, inclua o campo localSsds no corpo da solicitação. É possível especificar até 24 discos SSD locais. Cada SSD local tem 375 GB.

    Por exemplo, para criar uma reserva compartilhada especificando dois discos SSD locais e dois projetos de consumidor, faça uma solicitação da seguinte maneira:

    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_1"
            },
            {
              "diskSizeGb": "375",
              "interface": "INTERFACE_2"
            }
          ],
          "machineType": "MACHINE_TYPE"
        }
      }
    }
    

    Substitua INTERFACE_1 e INTERFACE_2 pelo tipo de interface que você quer que cada SSD local use. Especifique um dos seguintes valores:

    • Interfaces de disco NVME: NVME

    • Interfaces de disco SCSI: SCSI

    Verifique se o tipo de máquina especificado para as VMs reservadas é compatível com as interfaces de disco escolhidas. Caso contrário, a criação da reserva falhará. Para mais informações, veja como escolher uma interface de disco.

  • Para que as VMs reservadas usem uma plataforma mínima de CPU específica, em vez da plataforma de CPU padrão da zona, inclua o campo minCpuPlatform no corpo da solicitação.

    Por exemplo, para criar uma reserva compartilhada especificando uma plataforma de CPU mínima e dois projetos de consumidor, faça uma solicitação da seguinte maneira:

    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"
        }
      }
    }
    

    Substitua MIN_CPU_PLATFORM por uma plataforma de CPU mínima. Para garantir que uma plataforma de CPU esteja disponível na zona em que você está reservando recursos, confira as plataformas de CPU disponíveis por zona.

  • Para especificar que apenas VMs que segmentam especificamente esta reserva possam consumi-la, inclua o campo specificReservationRequired no corpo da solicitação e defina-o como true.

    Por exemplo, para criar uma reserva específica e compartilhá-la com dois projetos de consumidor, faça uma solicitação desta forma:

    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
    }
    
  • Para permitir que uma reserva de VMs de GPU seja consumida por jobs de treinamento personalizado ou jobs de previsão na Vertex AI, faça uma solicitação POST para o método beta.reservations.insert. No corpo da solicitação, inclua o campo serviceShareType e defina-o como ALLOW_ALL.

    POST https://compute.googleapis.com/compute/beta/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"
        }
      }
    }
    
  • Para permitir que o Compute Engine exclua automaticamente a reserva, selecione um dos seguintes métodos:

    • Para excluir a reserva em uma data e hora específicas, faça uma solicitação POST para o método beta.reservations.insert. No corpo da solicitação, inclua o campo deleteAtTime.

      Por exemplo, para criar uma reserva especificando uma data e hora para excluir uma reserva e compartilhar a reserva com dois projetos de consumidor, faça uma solicitação da seguinte maneira:

      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"
          }
        }
      }
      

      Substitua DELETE_AT_TIME por uma data e hora formatadas como um carimbo de data/hora RFC 3339, que precisa ser o seguinte:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Substitua:

      • YYYY-MM-DD: uma data formatada como um ano de quatro dígitos, um mês de dois dígitos e um dia de dois dígitos, separados por hífens (-).

      • HH:MM:SS: um horário formatado como uma hora de dois dígitos usando um horário de 24 horas, minutos de dois dígitos e segundos de dois dígitos, separados por dois pontos (:).

      • OFFSET: o fuso horário formatado como um ajuste de Tempo Universal Coordenado (UTC). Por exemplo, para usar o horário padrão do Pacífico (PST), especifique -08:00. Outra possibilidade é não usar ajuste: especifique Z.

    • Para excluir a reserva após uma duração específica, faça uma solicitação POST para o método beta.reservations.insert. No corpo da solicitação, inclua o campo deleteAfterDuration.

      Por exemplo, para criar uma reserva que o Compute Engine exclui após uma duração específica e compartilhar a reserva com dois projetos de consumidor, faça uma solicitação da seguinte maneira:

      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"
          }
        }
      }
      

      Substitua DELETE_AFTER_DURATION por uma duração em segundos. Por exemplo, especifique 86400 para 86.400 segundos (1 dia).

Solução de problemas

Saiba como resolver problemas de criação de reserva.

A seguir