Exportar uma imagem personalizada para o Cloud Storage


Se você precisar mover os dados do disco de inicialização do Compute Engine para fora do projeto do Compute Engine, exporte uma imagem desse disco para o Cloud Storage como um arquivo tar.gz. Caso precise criar uma imagem de disco permanente para usar durante a criação de novos discos permanentes no Compute Engine, leia Como criar uma imagem personalizada.

É possível fazer backup ou compartilhar uma imagem personalizada exportando a imagem para o Cloud Storage. Esse método é ideal para compartilhar imagens individuais com projetos que não têm acesso às suas imagens. Outra alternativa é compartilhar imagens concedendo o papel de usuário de imagens do Compute Engine na imagem ou no projeto que a contém.

O diagrama a seguir mostra alguns fluxos de trabalho típicos para a criação e reutilização de uma imagem personalizada.

Como criar e reutilizar imagens personalizadas.
Figura 1. Exemplos de criação e reutilização de imagens personalizadas

Antes de começar

Limitações e restrições

Para projetos protegidos com o VPC Service Controls, use um dos seguintes métodos:

  • Exportar do mesmo projeto em que a imagem reside
  • Exportar a imagem manualmente

Como exportar uma imagem com um comando

Exportar uma imagem para o Cloud Storage

Exporte as imagens usando o Console do Google Cloud, a Google Cloud CLI ou a API Cloud Build.

Console

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

    Acessar "Imagens"

  2. Clique no nome da imagem que você quer exportar para acessar a página de detalhes dela. Não é possível exportar imagens públicas fornecidas pelo Google. Somente é possível exportar imagens que você já criou ou importou anteriormente.

  3. Na página de detalhes da imagem, clique em Exportar para abrir a página Exportar imagem.

  4. Na página Exportar imagem, escolha o Formato de exportação dela.

  5. Escolha o local do Cloud Storage para exportar a imagem clicando em Procurar.

  6. Escolha um local do Cloud Storage atual para exportar a imagem. Se preferir, siga as instruções para criar um novo intervalo do Cloud Storage e insira um nome para esse bucket.

  7. Depois de escolher um Cloud Storage, escolha um nome de arquivo para a imagem exportada. É possível usar o nome de arquivo padrão ou escolher o próprio nome de arquivo.

  8. Depois de escolher um Cloud Storage e digitar um nome de arquivo para a imagem, clique em Selecionar.

  9. Na página Exportar imagem, clique em Exportar. Depois de escolher Exportar, o console do Google Cloud exibe o Histórico de exportação de imagens, em que é possível ver o processo de exportação de imagem. Para mais detalhes sobre o processo de exportação de imagem, clique no ID do Cloud Build para acessar a página Detalhes de exportação da imagem, em que é possível ver e fazer o download do registro de exportação de imagem.

  10. Entre na página Armazenamento para acessar a imagem exportada.

    Acessar o Storage

gcloud

A maneira preferencial de exportar uma imagem para o Cloud Storage é usar o comando gcloud compute images export. Esse comando usa o Daisy para encadear as várias etapas obrigatórias para exportar uma imagem. Partimos do princípio que você já criou uma imagem, por exemplo, com o comando gcloud compute images create.

Usando a Google Cloud CLI, execute:

gcloud compute images export \
    --destination-uri DESTINATION_URI \
    --image IMAGE_NAME

Substitua:

  • DESTINATION_URI: o destino de URI do Cloud Storage para o arquivo de imagem exportado.
  • IMAGE_NAME: o nome da imagem de disco a ser exportada.

Por padrão, as imagens são exportadas no formato do Compute Engine, que é um arquivo disk.raw em formato tar e compactado. Para exportar imagens em outros formatos compatíveis com o utilitário de imagem de disco QEMU, use a sinalização --export-format. Os formatos válidos incluem vmdk, vhdx, vpc, vdi e qcow2.

Exemplo

Por exemplo, o comando a seguir exporta uma imagem chamada my-image de my-project para um bucket do Cloud Storage chamado my-bucket. Por padrão, a imagem é exportada como um disk.raw file e é compactada no formato de arquivo tar.gz.

gcloud compute images export \
    --destination-uri gs://my-bucket/my-image.tar.gz \
    --image my-image \
    --project my-project

Para sinalizações, consulte a documentação de referência gcloud compute images export.

API

Na API, crie uma solicitação POST para a API Cloud Build.

POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
{
  "timeout": "7200s",
  "steps":[
    {
      "args":[
        "-timeout=7000s",
        "-source_image=SOURCE_IMAGE",
        "-client_id=api",
        "-format=IMAGE_FORMAT",
        "-destination_uri=DESTINATION_URI"
      ],
      "name":"gcr.io/compute-image-tools/gce_vm_image_export:release",
      "env":[
        "BUILD_ID=$BUILD_ID"
      ]
    }
  ],
  "tags":[
    "gce-daisy",
    "gce-daisy-image-export"
  ]
}

Substitua:

  • PROJECT_ID: o código do projeto que contém a imagem que você quer exportar.
  • SOURCE_IMAGE: o nome da imagem a ser importada.
  • IMAGE_FORMAT: o formato da imagem exportada. Os formatos válidos incluem vmdk, vhdx, vpc, vdi e qcow2.
  • DESTINATION_URI: o local do URI do Cloud Storage para onde você quer exportar o arquivo de imagem. Por exemplo, gs://my-bucket/my-exported-image.vmdk.

Para outros valores args que podem ser fornecidos, consulte a seção de sinalizações opcionais da página do GitHub sobre exportação de imagens de VM.

Exemplo de resposta

A resposta de amostra a seguir é parecida com a resposta retornada:

{
"name": "operations/build/myproject-12345/operation-1578608233418",
"metadata": {
 "@type": "type.googleapis.com/google.devtools.cloudbuild.v1.BuildOperationMetadata",
 "build": {
  "id": "3a2055bc-ccbd-4101-9434-d376b88b8940",
  "status": "QUEUED",
  "createTime": "2019-10-02T18:59:13.393492020Z",
  "steps": [
   {
    "name": "gcr.io/compute-image-tools/gce_vm_image_export:release",
    "env": [
     "BUILD_ID=3a2055bc-ccbd-4101-9434-d376b88b8940"
    ],
    "args": [
     "-timeout=7056s",
     "-source_image=my-image",
     "-client_id=api",
     "-format=vmdk",
     "-destination_uri=gs://my-bucket/my-exported-image.vmdk"
    ]
   }
  ],
  "timeout": "7200s",
  "projectId": "myproject-12345",
  "logsBucket": "gs://123456.cloudbuild-logs.googleusercontent.com",
  "options": {
   "logging": "LEGACY"
  },
  "logUrl": "https://console.cloud.google.com/cloud-build/builds/3a2055bc-ccbd-4101-9434-d376b88b8940?project=123456"
 }
 }

Há algumas maneiras de monitorar seu build:

  • Execute uma solicitação projects.builds.get usando o build-id retornado.
  • Revise os registros hospedados no logUrl fornecido.

Como exportar uma imagem de um projeto usando uma conta de serviço personalizada do Compute Engine

Durante uma exportação de imagem, uma instância de máquina virtual (VM) temporária é criada no seu projeto. A ferramenta de exportação de imagens nesta VM temporária precisa ser autenticada.

Uma conta de serviço é uma identidade anexada a uma VM. Os tokens de acesso da conta de serviço podem ser acessados pelo servidor de metadados de instância e usados para autenticar a ferramenta de exportação de imagens na VM.

Por padrão, o processo de exportação usa o Agente de serviço padrão do Compute Engine do projeto. No entanto, se a conta de serviço padrão do Compute Engine estiver desativada no projeto ou se você quiser usar uma conta de serviço personalizada do Compute Engine, crie uma conta de serviço e especifique-a para o processo de exportação.

Exporte as imagens usando a Google Cloud CLI ou a API Cloud Build.

gcloud

  1. Crie uma conta de serviço e atribua o mínimo de papéis. Para mais informações sobre como criar contas de serviço, consulte Como criar e gerenciar contas de serviço.

    A conta de serviço do Compute Engine especificada precisa ter, no mínimo, os seguintes papéis atribuídos:

    • roles/compute.storageAdmin
    • roles/storage.objectAdmin

    Saiba mais em Conceder os papéis necessários à conta de serviço do Compute Engine.

  2. Use o comando gcloud compute images export para exportar a imagem.

    gcloud compute images export \
        --destination-uri DESTINATION_URI \
        --image IMAGE_NAME \
        --compute-service-account SERVICE_ACCOUNT_EMAIL

    Substitua:

    • DESTINATION_URI: o destino de URI do Cloud Storage para o arquivo de imagem exportado.
    • IMAGE_NAME: o nome da imagem de disco a ser exportada.
    • SERVICE_ACCOUNT_EMAIL: o endereço de e-mail associado à conta de serviço do Compute Engine criada na etapa anterior.

Exemplo

Por exemplo, o comando a seguir exporta uma imagem chamada my-image de my-project para um bucket do Cloud Storage chamado my-bucket com uma conta de serviço que tenha o e-mail image-export-service-account@proj-12345.iam.gserviceaccount.com. Por padrão, a imagem é exportada como um arquivo disk.raw e é compactada no formato de arquivo tar.gz.

gcloud compute images export \
    --destination-uri gs://my-bucket/my-image.tar.gz \
    --image my-image \
    --project my-project \
    --compute-service-account image-export-service-account@proj-12345.iam.gserviceaccount.com
    

Para sinalizações, consulte a documentação de referência gcloud compute images export.

API

  1. Crie uma conta de serviço e atribua o mínimo de papéis. Para mais informações sobre como criar contas de serviço, consulte Como criar e gerenciar contas de serviço.

    A conta de serviço do Compute Engine especificada precisa ter, no mínimo, os seguintes papéis atribuídos:

    • roles/compute.storageAdmin
    • roles/storage.objectAdmin

    Saiba mais em Conceder os papéis necessários à conta de serviço do Compute Engine.

  2. Na API, crie uma solicitação POST para a API Cloud Build.

    POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
    {
      "timeout": "7200s",
      "steps":[
        {
          "args":[
            "-timeout=7000s",
            "-source_image=SOURCE_IMAGE",
            "-client_id=api",
            "-format=IMAGE_FORMAT",
            "-destination_uri=DESTINATION_URI",
            "-compute_service_account=SERVICE_ACCOUNT_EMAIL"
          ],
          "name":"gcr.io/compute-image-tools/gce_vm_image_export:release",
          "env":[
            "BUILD_ID=$BUILD_ID"
          ]
        }
      ],
      "tags":[
        "gce-daisy",
        "gce-daisy-image-export"
      ]
    }
    

    Substitua:

    • PROJECT_ID: o código do projeto que contém a imagem que você quer exportar.
    • SOURCE_IMAGE: o nome da imagem a ser importada.
    • IMAGE_FORMAT: o for da imagem exportada. Os formatos válidos incluem vmdk, vhdx, vpc, vdi e qcow2.
    • DESTINATION_URI: o local do URI do Cloud Storage para onde você quer exportar o arquivo de imagem. Por exemplo, gs://my-bucket/my-exported-image.vmdk.
    • SERVICE_ACCOUNT_EMAIL: o endereço de e-mail associado à conta de serviço do Compute Engine criada na etapa anterior.

Para outros valores args que podem ser fornecidos, consulte a seção de sinalizações opcionais da página do GitHub sobre exportação de imagens de VM.

Exportar uma imagem usando a VPC compartilhada

Antes de exportar uma imagem que usa uma VPC compartilhada, adicione o papel compute.networkUser à conta de serviço do Cloud Build. Saiba mais em Conceder os papéis necessários à conta de serviço do Cloud Build.

Exporte a imagem usando a Google Cloud CLI ou a API Cloud Build.

gcloud

Use o comando gcloud compute images export para exportar a imagem.

gcloud compute images export \
    --image IMAGE_NAME \
    --destination-uri DESTINATION_URI \
    --project PROJECT_ID \
    --network NETWORK \
    [--subnet SUBNET \]
    [--zone ZONE]

Substitua:

  • IMAGE_NAME: o nome da imagem a ser exportada.
  • DESTINATION_URI: o local do URI do Cloud Storage para onde você quer exportar o arquivo de imagem.
  • PROJECT_ID: ID do projeto em que a imagem está localizada.
  • NETWORK: o caminho completo de uma rede VPC compartilhada. Por exemplo, projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME.
  • SUBNET: o caminho completo de uma sub-rede VPC compartilhada. Por exemplo, projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME.

    A especificação desse modo depende do modo de rede VPC.

    • Se a rede VPC usar o modo legado, não especifique uma sub-rede.
    • Se a rede VPC usar o modo automático, especificar a sub-rede será opcional.
    • Se a rede VPC usar o modo personalizado, este campo precisará ser especificado.
  • ZONE: a zona a ser usada para a exportação. Essa zona precisa corresponder à região da sub-rede. Por exemplo, se SUBNET estiver na região us-west1, a zona de exportação precisará ser uma das seguintes: us-west1-a, us-west1-b ou us-west1-c.

    Na maioria dos casos, especificar uma zona é opcional. Se SUBNET for especificado, a zona precisará ser especificada.

Por exemplo, o comando a seguir exporta uma imagem chamada example-image de my-project para um bucket do Cloud Storage chamado my-bucket. Neste exemplo, a rede de nuvem privada virtual (my-shared-vp) usa uma sub-rede personalizada (my-custom-subnet). Por padrão, a imagem é exportada como um arquivo disk.raw e é compactado no formato de arquivo tar.gz.

Comando de amostra

gcloud compute images export \
    --image example-image \
    --destination-uri gs://my-bucket/my-image.tar.gz \
    --project my-project \
    --network projects/my-vpc-project/global/networks/my-shared-vpc \
    --subnet projects/my-vpc-project/regions/us-west1/subnetworks/my-custom-subnet \
    --zone us-west1-c
 

API

  1. Adicione a imagem ao Cloud Storage.

  2. Na API, crie uma solicitação POST para a API Cloud Build.

    POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
    {
      "timeout": "7200s",
      "steps":[
        {
          "args":[
            "-timeout=7000s",
            "-source_image=SOURCE_IMAGE",
            "-client_id=api",
            "-format=IMAGE_FORMAT",
            "-destination_uri=DESTINATION_URI",
            "-network=NETWORK",
            "-subnet=SUBNET",
            "-zone=ZONE"
          ],
          "name":"gcr.io/compute-image-tools/gce_vm_image_export:release",
          "env":[
            "BUILD_ID=$BUILD_ID"
          ]
        }
      ],
      "tags":[
        "gce-daisy",
        "gce-daisy-image-export"
      ]
    }
    

    Substitua:

    • PROJECT_ID: o código do projeto que contém a imagem que você quer exportar.
    • SOURCE_IMAGE: o nome da imagem a ser importada.
    • IMAGE_FORMAT: o formato da imagem exportada. Os formatos válidos incluem vmdk, vhdx, vpc, vdi e qcow2.
    • DESTINATION_URI: o local do URI do Cloud Storage para onde você quer exportar o arquivo de imagem. Por exemplo, gs://my-bucket/my-exported-image.vmdk.
    • NETWORK: caminho completo de uma rede VPC compartilhada. Por exemplo, projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME.
    • SUBNET: o caminho completo de uma sub-rede VPC compartilhada. Por exemplo, projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME.

      A especificação desse modo depende do modo de rede VPC.

      • Se a rede VPC usar o modo legado, não especifique uma sub-rede.
      • Se a rede VPC usar o modo automático, especificar a sub-rede será opcional.
      • Se a rede VPC usar o modo personalizado, este campo precisará ser especificado.
    • ZONE: a zona a ser usada para a exportação. Essa zona precisa corresponder à região da sub-rede. Por exemplo, se SUBNET estiver na região us-west1, a zona de exportação precisará ser uma das seguintes: us-west1-a, us-west1-b ou us-west1-c.

      Na maioria dos casos, especificar uma zona é opcional. Se SUBNET for especificado, a zona precisará ser especificada.

    Para outros valores args que podem ser fornecidos, consulte a seção de sinalizações opcionais da página do GitHub sobre exportação de imagens de VM.

Criar e exportar uma imagem manualmente

Se os comandos gcloud compute images create e gcloud compute images export não atenderem aos requisitos, crie e exporte uma imagem manualmente a partir de uma instância do Compute Engine. Esse processo tem etapas distintas para primeiro criar uma imagem e depois exportá-la.

No exemplo a seguir, observe que o disco criado se chama image-disk.

Para criar e exportar uma imagem:

  1. Como opção, interrompa a instância em que o disco está anexado antes de criar a captura de tela. Isso garante a integridade do conteúdo do disco. Substitua DISK_NAME pelo nome do disco que você quer usar para criar o snapshot.

  2. Crie um snapshot do disco. Nomeie o snapshot como image-snapshot.

    gcloud compute disks snapshot DISK_NAME \
        --snapshot-names image-snapshot
  3. Use o snapshot image-snapshot para criar um novo disco chamado image-disk executando o seguinte comando:

    gcloud compute disks create image-disk \
        --source-snapshot image-snapshot
  4. Crie um disco temporário chamado temporary-disk para reter o arquivo tar e especifique que o SIZE do disco seja pelo menos 50% maior do que o disco de imagem.

    É possível desanexar e excluir o disco depois.

    gcloud compute disks create temporary-disk \
        --size SIZE

    em que SIZE é o tamanho em Gigabytes ou Terabytes do disco temporário. Por exemplo, especifique 100GB para criar um disco de 100 gigabytes.

  5. Crie uma instância e ative o escopo storage-rw nela. Além disso, anexe image-disk e temporary-disk à instância como discos secundários com atributos device-name específicos. Substitua VM_NAME pelo nome da instância a ser criada.

    gcloud compute instances create VM_NAME \
        --scopes storage-rw \
        --disk name=image-disk,device-name=image-disk \
        --disk name=temporary-disk,device-name=temporary-disk

    Observe que você está transferindo os escopos da conta de serviço para poder fazer upload do arquivo para o Cloud Storage nas etapas posteriores.

    Se necessário, analise os detalhes de como iniciar uma nova instância.

  6. Conecte-se à instância. Substitua VM_NAME pelo nome da instância a ser conectada.

    gcloud compute ssh VM_NAME
  7. Formate e ative o disco temporário. A formatação do disco exclui o conteúdo do disco temporário.

    sudo mkdir /mnt/tmp
    sudo mkfs.ext4 -F /dev/disk/by-id/google-temporary-disk
    sudo mount -o discard,defaults /dev/disk/by-id/google-temporary-disk /mnt/tmp
  8. Opcional: ative o disco de imagem e faça outras alterações antes de criar o arquivo tar. Por exemplo, exclua os arquivos atuais do diretório /home se não quiser que eles façam parte da imagem. Ative as partições do disco que precisam ser modificadas, altere os arquivos necessários e desative o disco quando terminar.

    1. Crie o diretório em que será ativado o disco ou a partição.

      sudo mkdir /mnt/image-disk
    2. Use o comando ls para determinar o disco ou a partição de disco que você precisa ativar.

      ls /dev/disk/by-id/

      O comando imprime uma lista de IDs e partições de disco. Por exemplo, o disco a seguir tem uma tabela de partições com uma partição. O ID google-image-disk aponta para o disco completo a partir de que você quer criar uma imagem. O ID google-image-disk-part1 aponta para a primeira partição nesse disco. Ative a partição caso seja necessário fazer alterações no disco e crie a imagem do disco completo.

      google-image-disk
      google-image-disk-part1
      
    3. Ative o disco ou a partição. Se o disco tiver uma tabela de partições, ative as partições individuais. Por exemplo, ative google-image-disk-part1.

      sudo mount /dev/disk/by-id/google-image-disk-part1 /mnt/image-disk

      Como alternativa, se o disco estiver com formatação bruta sem nenhuma tabela de partições, ative o disco google-image-disk completo.

      sudo mount /dev/disk/by-id/google-image-disk /mnt/image-disk
    4. Modifique os arquivos no diretório /mnt/image-disk para configurar os arquivos no disco. Por exemplo, é possível remover o arquivo /mnt/image-disk/home/[USER]/.ssh/authorized_keys para impedir que as chaves SSH sejam compartilhadas.

    5. Quando terminar de modificar os arquivos, desative o disco.

      sudo umount /mnt/image-disk/
  9. Crie um arquivo tar da imagem.

    Após personalizar os arquivos no disco de imagens, crie um arquivo do disco bruto no disco temporário. O nome da imagem do disco bruto precisa ser "disk.raw":

     sudo dd if=/dev/disk/by-id/google-image-disk of=/mnt/tmp/disk.raw bs=4096

    Em seguida, crie o arquivo tar.gz:

    cd /mnt/tmp

    sudo tar czvf myimage.tar.gz disk.raw

    Este comando cria uma imagem da instância no seguinte local:

    /mnt/tmp/myimage.tar.gz

  10. Faça upload da imagem para o Cloud Storage.

    Para fazer upload do arquivo tar para o Cloud Storage, use a ferramenta de linha de comando gsutil que vem pré-instalada na instância.

    1. Crie um bucket usando gsutil.

      Verifique as diretrizes de nomenclatura de bucket e objeto antes de criar o bucket. Em seguida, crie o bucket usando o seguinte comando: Substitua BUCKET_NAME pelo nome do bucket a ser criado.

      me@example-instance:~$ 
      gsutil mb gs://BUCKET_NAME
    2. Copie o arquivo no novo bucket. Substitua BUCKET_NAME pelo nome do bucket onde o arquivo será copiado.

      me@example-instance:~$ 
      gsutil cp /mnt/tmp/myimage.tar.gz gs://BUCKET_NAME

Você exportou seu arquivo para o Cloud Storage. Agora é possível compartilhar a imagem com outras pessoas ou usar o arquivo tar para adicionar uma nova imagem a um projeto no Console do Google Cloud.

A seguir