Criar instâncias do Compute Engine a partir de imagens de máquina


Depois de criar uma imagem de máquina, você poderá usá-la para fazer cópias da instância de computação de origem. Para obter mais informações sobre os usos de imagens de máquina, consulte quando usar uma imagem de máquina .

Uma imagem de máquina contém a maioria das informações e dados necessários para clonar uma instância.

Uma imagem de máquina é imutável. No entanto, você pode substituir quase todas as propriedades da imagem de máquina ao criar uma instância a partir da imagem de máquina.

Você pode criar instâncias a partir de imagens de máquina usando o console do Google Cloud , a CLI do Google Cloud ou REST .

Antes de começar

  • Se ainda não o fez, configure a autenticação. Autenticação é o processo pelo qual sua identidade é verificada para acesso a Google Cloud serviços e APIs. Para executar códigos ou amostras em um ambiente de desenvolvimento local, você pode se autenticar 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. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.
    3. REST

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

        After installing the Google Cloud CLI, initialize it by running the following command:

        gcloud init

        If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

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

Funções obrigatórias

Para obter as permissões necessárias para criar instâncias do Compute Engine a partir de imagens de máquina, peça ao administrador para conceder a você o papel do IAM Administrador de instância do Compute (v1) ( roles/compute.instanceAdmin.v1 ) na instância de computação ou no projeto. Para obter mais informações sobre a concessão de funções, consulte Gerenciar acesso a projetos, pastas e organizações .

Você também poderá obter as permissões necessárias por meio de funções personalizadas ou outras funções predefinidas .

Restrições

As seguintes restrições se aplicam ao criar instâncias a partir de imagens de máquina:

  • Você pode criar no máximo seis instâncias de uma imagem de máquina de origem em 60 minutos. Se você exceder esse limite, a operação de criação da instância falhará e retornará um erro semelhante a este:

    Operation rate exceeded for resource 'projects/test/global/machineImages/machine-image-1'.
    Too frequent operations from the source resource.
    

    Para criar mais instâncias do que o limite definido (6 instâncias em 60 minutos), crie imagens de máquina adicionais a partir da instância de origem ou crie imagens de máquina de curta duração a partir das novas instâncias. Você pode então criar o número necessário de instâncias a partir das novas imagens de máquina.

  • Não é possível criar instâncias a partir de imagens de máquina com discos regionais anexados usando o console do Google Cloud. Use a Google Cloud CLI ou REST e especifique os parâmetros replicaZones e deviceName para cada disco regional anexado. Para obter mais informações, consulte Criar uma instância a partir de uma imagem de máquina com substituições de propriedades .

Crie uma instância a partir de uma imagem de máquina (sem substituição)

Se você deseja criar uma instância totalmente baseada na imagem da máquina, sem alterações nas propriedades, use este método.

Console

  1. No console do Google Cloud, acesse a página Criar uma instância .

    Vá para Criar uma instância

  2. No menu Criar VM de... , selecione Imagens de máquina .

  3. Na janela Criar VM a partir da imagem da máquina que aparece, faça o seguinte:

    1. Selecione uma imagem de máquina.

    2. Para criar e iniciar a instância, clique em Criar .

gcloud

Use o comando gcloud compute instances create para criar uma instância a partir de uma imagem de máquina.

gcloud compute instances create INSTANCE_NAME \
    --zone=ZONE \
    --source-machine-image=SOURCE_MACHINE_IMAGE_NAME

Substitua o seguinte:

  • INSTANCE_NAME : o nome da instância
  • ZONE : a zona da instância
  • SOURCE_MACHINE_IMAGE_NAME : a imagem da máquina a partir da qual criar a instância

Exemplo

Por exemplo, você pode usar o seguinte comando gcloud para criar uma instância chamada my-instance na zona us-east1-b , a partir de uma imagem de máquina chamada my-machine-image .

gcloud compute instances create my-instance \
    --zone=us-east1-b \
    --source-machine-image=my-machine-image

Depois que a instância for criada, a saída será semelhante a esta:

Created [https://www.googleapis.com/compute/v1/projects/project-12345/zones/us-east1-b/instances/my-instance].
NAME               ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
my-instance        us-east1-b  e2-standard-2               192.0.2.1   203.224.0.113  RUNNING

DESCANSAR

Na API, construa uma solicitação POST para o método instances.insert . No corpo da solicitação, inclua os seguintes parâmetros:

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

{
  "name": "INSTANCE_NAME",
  "sourceMachineImage": "SOURCE_MACHINE_IMAGE_URL"
}

Substitua o seguinte:

  • PROJECT_ID : seu ID do projeto .
  • ZONE : a zona da instância.
  • INSTANCE_NAME : um nome para a instância.
  • SOURCE_MACHINE_IMAGE_URL : o URL completo ou parcial da imagem da máquina que você deseja usar para criar a instância. Por exemplo, se você tiver uma imagem de máquina chamada my-machine-image em um projeto chamado myProject . Os seguintes URLs são válidos:

    • https://www.googleapis.com/compute/v1/projects/myProject/global/machineImages/my-machine-image
    • projects/myProject/global/machineImages/my-machine-image
    • global/machineImages/my-machine-image

Criar uma instância a partir de uma imagem de máquina com substituições de propriedades

Se quiser criar uma instância baseada principalmente na imagem da máquina, mas com algumas alterações, você poderá usar o comportamento de substituição. Para usar o comportamento de substituição, você passa atributos para substituir propriedades de imagem de máquina existentes ao criar a instância.

Ao usar o recurso de substituição, leve em consideração as seguintes observações:

  • Você não pode substituir nenhuma propriedade do disco anexado além do nome do disco ao criar uma instância a partir da imagem da máquina.
  • Você deve especificar o parâmetro replicaZones para cada disco regional conectado junto com o deviceName do disco regional da imagem da máquina.

  • Se a instância de origem (usada para gerar a imagem de máquina) e a nova instância pertencerem ao mesmo projeto e à mesma região, aplica-se o seguinte:

    • A maioria das propriedades da instância de origem e da nova instância são iguais. As propriedades diferentes são aquelas como endereços IP temporários atribuídos automaticamente.
    • Se a instância de origem ainda existir quando você criar uma nova instância, a nova instância não poderá usar o mesmo nome e a mesma zona que a instância de origem.
  • Se a instância de origem usada para gerar a imagem de máquina e a nova instância pertencerem ao mesmo projeto, mas a regiões diferentes, aplica-se o seguinte:

    • Você deve substituir todos os recursos zonais e regionais da nova instância. Por exemplo, se você criar uma instância a partir de uma imagem de máquina cuja instância de origem pertencia a uma região diferente, será necessário substituir recursos regionais, como a sub-rede e as regras de firewall regionais. No entanto, os recursos globais, como balanceadores de carga e contas de serviço, não precisam de substituição, a menos que você queira modificá-los.

Console

  1. No console do Google Cloud, acesse a página Criar uma instância .

    Vá para Criar uma instância

  2. No menu Criar VM de... , selecione Imagens de máquina .

  3. Na janela Criar VM a partir da imagem da máquina que aparece, selecione um modelo e clique em Personalizar .

  4. Opcional: Especifique outras opções de configuração. Para obter mais informações, consulte Opções de configuração durante a criação da instância .

  5. Para criar e iniciar a instância, clique em Criar .

gcloud

Use o comando gcloud compute instances create para criar uma instância a partir de uma imagem de máquina e adicionar as propriedades que você deseja substituir.

Por exemplo, você pode usar o seguinte comando gcloud para criar uma VM chamada my-instance na zona us-east1-b , a partir de uma imagem de máquina chamada my-machine-image . Neste exemplo, as substituições são aplicadas para alterar o tipo de máquina, interromper a política de manutenção do host e configurar um disco permanente regional com o nome regional-disk-0 .

gcloud compute instances create my-instance \
    --zone=us-east1-b \
    --source-machine-image=my-machine-image \
    --machine-type=e2-standard-2 \
    --maintenance-policy=TERMINATE \
    --create-disk=device-name=boot-device-0,boot=true,auto-delete=true \
    --create-disk=device-name=regional-disk-0,\
      replica-zones=^:^us-east1-b:us-east1-c,boot=false

DESCANSAR

Para substituir as propriedades da imagem de máquina durante a criação da instância, crie uma solicitação POST para o método instances.insert . No corpo da solicitação, inclua o parâmetro sourceMachineImage e quaisquer substituições necessárias. Você pode adicionar qualquer propriedade que normalmente definiria durante a criação da instância . Por exemplo, para substituir o tipo de máquina, sua chamada de API incluiria o parâmetro machineType .

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

{
  "name": "INSTANCE_NAME",
  "machineType": "zones/ZONE/machineTypes/NEW_MACHINE_TYPE",
  "sourceMachineImage": "SOURCE_MACHINE_IMAGE_URL"
}

Substitua o seguinte:

  • PROJECT_ID : o ID do projeto .
  • ZONE : a zona da instância.
  • INSTANCE_NAME : um nome para a instância.
  • NEW_MACHINE_TYPE : o tipo de máquina que você deseja usar para a instância.
  • SOURCE_MACHINE_IMAGE_URL : o URL completo ou parcial da imagem da máquina que você deseja usar para criar a instância. Por exemplo, se você tiver uma imagem de máquina chamada my-machine-image em um projeto chamado myProject . Os seguintes URLs são válidos:

    • https://www.googleapis.com/compute/v1/projects/myProject/global/machineImages/my-machine-image
    • projects/myProject/global/machineImages/my-machine-image
    • global/machineImages/my-machine-image

Substituir comportamento

O comportamento de substituição na API Compute Engine segue as regras de patch de mesclagem JSON, descritas pela RFC 7396 . Em resumo, aplicam-se as seguintes regras:

  • Se você substituir um campo básico, o campo básico correspondente na imagem da máquina será substituído pelo valor do campo básico na solicitação. Os campos básicos incluem parâmetros como machineType e name .
  • Se você substituir um campo repetido, todos os valores repetidos dessa propriedade serão substituídos pelos valores correspondentes fornecidos na solicitação. Campos repetidos geralmente são propriedades do tipo list . Por exemplo, disks e networkInterfaces são campos repetidos.
  • Se você substituir um nested object , o objeto na imagem da máquina será mesclado com a especificação de objeto correspondente na solicitação. Observe que se um objeto aninhado estiver dentro de um campo repetido, o campo será tratado de acordo com regras para campos repetidos. Os rótulos são uma exceção a esta regra e são tratados como um campo repetido, mesmo que os rótulos sejam do tipo object .

Por exemplo, se você quiser criar uma VM a partir de uma imagem de máquina e criar discos regionais com a VM, use uma substituição para os discos para poder especificar a opção replicaZones . Como o campo disks é um campo repetido, você deve especificar a configuração de disco para todos os discos conectados e o disco de inicialização, não apenas para os discos regionais.

POST https://compute.googleapis.com/compute/v1/projects/my-proj/zones/us-west1-a/instances
{
  "name": "vm-from-image",
  "sourceMachineImage": "global/machineImages/my-machine-image",
  "disks": [
    {
      "kind": "compute#attachedDisks",
      "boot": true,
      "autoDelete": true,
      "deviceName": "boot-device",
      "initializeParams": {
        "sourceImage": "projects/my-proj/global/images/my-image",
        "diskType": "projects/my-proj/zones/us-west1-a/diskTypes/pd-standard",
      }
    },
    {
      "kind": "compute#attachedDisk",
      "boot": false,
      "autoDelete": true,
      "deviceName": "regional-device-0",
      "initializeParams": {
         "diskType": "projects/my-proj/zones/us-west1-a/diskTypes/pd-standard",
         "replicaZones": [
            "projects/my-proj/zones/us-west1-a",
            "projects/my-proj/zones/us-west1-c"
         ]
      }
    }
  ]
}

Crie uma instância usando uma imagem de máquina de um projeto diferente

Ao criar uma instância usando uma imagem de máquina de um projeto diferente, talvez você não tenha acesso à conta de serviço anexada a esse projeto de origem. Se quiser criar uma instância a partir de uma imagem de máquina localizada em um projeto diferente, você precisará garantir que tem acesso à imagem de máquina e substituir a propriedade da conta de serviço na nova instância.

Se você compartilhar uma imagem de máquina entre projetos que usam uma rede VPC compartilhada, deverá especificar explicitamente os detalhes da VPC compartilhada ao criar uma instância a partir da imagem de máquina. Por exemplo, ao criar uma instância em um projeto não host, forneça os detalhes da VPC compartilhada do projeto host usando os sinalizadores --network , --subnet ou --network-interface .

As seções a seguir descrevem como criar uma instância a partir de uma imagem de máquina localizada em um projeto diferente usando a CLI do Google Cloud.

  1. Conceda acesso à imagem da máquina armazenada em um projeto diferente.

    As permissões podem ser concedidas no projeto de origem ou na imagem da máquina. Use o comando gcloud compute machine-images add-iam-policy-binding para conceder as permissões na imagem da máquina.

    gcloud compute machine-images add-iam-policy-binding MACHINE_IMAGE_NAME \
        --project=MACHINE_IMAGE_PROJECT \
        --member='ACCOUNT_EMAIL' \
        --role='roles/compute.admin'
    

    Substitua o seguinte:

    • MACHINE_IMAGE_PROJECT : o ID do projeto que contém a imagem da máquina de origem.
    • MACHINE_IMAGE_NAME : o nome da imagem da máquina à qual você deseja adicionar a vinculação de permissão.
    • ACCOUNT_EMAIL : o endereço de e-mail da serviceAccount ou user que está criando a instância. Certifique-se de que o e-mail esteja formatado para incluir o prefixo necessário. O prefixo deve ser um dos seguintes:

      • user: especifique isto se o endereço de e-mail estiver associado a uma conta de usuário. Por exemplo, user:user@example.com .
      • serviceAccount: especifique isto se o endereço de e-mail estiver associado a uma conta de serviço. Por exemplo, serviceAccount:123456789000-compute@developer.gserviceaccount.com .

    Exemplo

    Por exemplo, para adicionar uma ligação compute.admin à imagem de máquina chamada my-machine-image à conta de serviço, envie um e-mail para 123456789000-compute@developer.gserviceaccount.com , use o seguinte comando gcloud CLI :

    gcloud compute machine-images add-iam-policy-binding my-machine-image \
        --project=machine-image-project \
        --member='serviceAccount:123456789000-compute@developer.gserviceaccount.com' \
        --role='roles/compute.admin'
    
  2. Conceda ao usuário que executa o comando gcloud compute instances create a função de usuário da conta de serviço ( roles/iam.serviceAccountUser ) na conta de serviço associada à imagem da máquina.

  3. Use o comando gcloud compute instances create para criar uma instância a partir de uma imagem de máquina.

    gcloud compute instances create INSTANCE_NAME \
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE \
        --source-machine-image=projects/MACHINE_IMAGE_PROJECT/global/machineImages/MACHINE_IMAGE_NAME \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --subnet=SUBNET
    

    Substitua o seguinte:

    • INSTANCE_PROJECT_ID : o ID do projeto no qual você deseja criar a instância
    • INSTANCE_NAME : um nome para a instância
    • ZONE : a zona da instância
    • MACHINE_IMAGE_PROJECT : o ID do projeto onde a imagem da máquina está localizada
    • MACHINE_IMAGE_NAME : a imagem da máquina a partir da qual criar a instância
    • SERVICE_ACCOUNT_EMAIL : o endereço de e-mail da conta de serviço que você deseja anexar à sua instância
    • SUBNET : se a sub-rede e a instância estiverem no mesmo projeto, substitua SUBNET pelo nome de uma sub-rede que esteja na mesma região da instância

      Para especificar uma sub-rede em uma rede VPC compartilhada, substitua SUBNET por uma string no seguinte formato:

      projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
      

      Substitua o seguinte:

      • HOST_PROJECT_ID : o ID do projeto host da VPC compartilhada
      • REGION : a região da sub-rede
      • SUBNET_NAME : o nome da sub-rede

      Exemplo

      Por exemplo, o comando a seguir cria uma VM chamada my-instance em vm-project , na zona us-east1-b , a partir de uma imagem de máquina chamada my-machine-image .

      O sinalizador --service-account especifica a conta de serviço que você deseja anexar à VM recém-criada. Se você não fornecer esse sinalizador, a conta de serviço de origem não poderá ser compartilhada entre os dois projetos e a operação falhará.

      gcloud compute instances create my-instance \
       --project=vm-project \
       --zone=us-east1-b \
       --source-machine-image=projects/machine-image-project/global/machineImages/my-machine-image \
       --service-account=000123456789-compute@developer.gserviceaccount.com
      

      Depois que a VM for criada, a saída será semelhante a esta:

      Created [https://www.googleapis.com/compute/v1/projects/project-12345/zones/us-east1-b/instances/my-instance].
      NAME               ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
      my-instance        us-east1-b  e2-standard-2               192.0.2.1   203.224.0.113  RUNNING
      

O que vem a seguir?