Como 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

Ativar a API Cloud Build

A ferramenta de exportação do dispositivo virtual usa o Cloud Build.

Na maioria dos casos, gcloud compute images export tenta conceder essas permissões à conta de serviço do Cloud Build. No entanto, é possível concedê-las manualmente para garantir que as permissões necessárias estejam válidas.

Console

  1. Ative a API Cloud Build no Console do Google Cloud.

    Ativar a API Cloud Build

    Quando você ativa a API Cloud Build a partir do Console, o Compute Engine concede à conta de serviço do Cloud Build os papéis a seguir para que o serviço possa exportar instâncias a partir do Compute Engine:

    • roles/iam.serviceAccountTokenCreator
    • roles/compute.admin
    • roles/iam.serviceAccountUser

    A ferramenta de exportação também usa a conta de serviço padrão do Compute Engine. Por padrão, a conta de serviço do Compute Engine tem o papel de editor de projetos do IAM. Se esse papel for removido, o processo de exportação poderá falhar. Para adicionar o papel novamente à conta de serviço, consulte Como conceder acesso. Para mais informações sobre a conta de serviço padrão do Compute Engine, consulte Conta de serviço padrão do Compute Engine.

gcloud

Para configurar o serviço Cloud Build usando a ferramenta de linha de comando gcloud, siga estas etapas:

  1. Use a ferramenta de linha de comando gcloud e ative o Cloud Build.

    gcloud services enable cloudbuild.googleapis.com

    A ferramenta de exportação também usa a conta de serviço padrão do Compute Engine. Por padrão, a conta de serviço do Compute Engine tem o papel de editor de projetos do IAM. Se esse papel for removido, o processo de exportação poderá falhar. Para adicionar o papel novamente à conta de serviço, consulte Como conceder acesso. Para mais informações sobre a conta de serviço padrão do Compute Engine, consulte Conta de serviço padrão do Compute Engine.

  2. Adicione o papel compute.admin à conta de serviço da API Cloud Build.

    gcloud projects add-iam-policy-binding project-id \
       --member serviceAccount:project-num@cloudbuild.gserviceaccount.com \
       --role roles/compute.admin
    
  3. Adicione o papel iam.serviceAccountUser à conta de serviço da API Cloud Build.

    gcloud projects add-iam-policy-binding project-id \
       --member serviceAccount:project-num@cloudbuild.gserviceaccount.com \
       --role roles/iam.serviceAccountUser
    
  4. Adicione o papel iam.serviceAccountTokenCreator à conta de serviço da API Cloud Build.

    gcloud projects add-iam-policy-binding project-id \
       --member serviceAccount:project-num@cloudbuild.gserviceaccount.com \
       --role roles/iam.serviceAccountTokenCreator
    

    Substitua:

Como exportar uma imagem com um comando

Console

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

    Acessar a página 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 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 a página Armazenamento

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.

Na ferramenta de linha de comando gcloud, 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 disco virtual exportado.
  • image-name: o nome da imagem de disco a ser exportada.

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

Para ver uma lista de todas as sinalizações disponíveis, consulte a documentação de referência de 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":"timeout",
  "steps":[
    {
      "args":[
        "-timeout=timeout",
        "-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.
  • timeout: o tempo máximo de duração de uma versão antes de falhar com uma mensagem TIMEOUT. Na API, esse período precisa ser especificado em segundos. O valor 7200s funciona na maioria dos cenários.
  • source-image: nome da imagem a ser exportada.
  • image-format: 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 o qual você quer exportar o arquivo do disco virtual. 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/gcr/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 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 o snapshot. 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 instance-name pelo nome da instância a ser criada.

    gcloud compute instances create instance-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 instance-name pelo nome da instância a ser conectada.

    gcloud compute ssh instance-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. Como opção, ative o disco de imagens 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 arquivos .tar e .gzip desse arquivo:

    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