Criar uma AMI a partir de uma instância com armazenamento de instâncias - Amazon Elastic Compute Cloud

Criar uma AMI a partir de uma instância com armazenamento de instâncias

Os procedimentos a seguir são para criar uma AMI com armazenamento de instâncias com base na instância com armazenamento de instâncias. Antes de começar, certifique-se de que você leu os Pré-requisitos.

Criar uma AMI a partir de uma instância do Amazon Linux com armazenamento de instâncias

Esta seção descreve a criação da AMI a partir de uma instância do Amazon Linux. Os procedimentos a seguir podem não funcionar para instâncias que executam outras distribuições do Linux. Para procedimentos específicos do Ubuntu, consulte Criar uma AMI a partir de uma instância em Ubuntu com armazenamento de instâncias.

Para se preparar para usar as ferramentas da AMI (somente instâncias do HVM)
  1. As ferramentas de AMI exigem GRUB Legacy para inicializarem corretamente. Use o comando a seguir para instalar o GRUB:

    [ec2-user ~]$ sudo yum install -y grub
  2. Instale os pacotes de gerenciamento de partição com o seguinte comando:

    [ec2-user ~]$ sudo yum install -y gdisk kpartx parted
Para criar uma AMI a partir de uma instância de Amazon Linux com armazenamento de instâncias

Este procedimento pressupõe que você atendeu aos pré-requisitos de Pré-requisitos.

Nos comandos a seguir, substitua cada espaço reservado para entrada do usuário por suas próprias informações.

  1. Carregue suas credenciais para sua instância. Usamos essas credenciais para garantir que só você e o Amazon EC2 possam acessar sua AMI.

    1. Crie um diretório temporário na sua instância para suas credenciais, da seguinte forma:

      [ec2-user ~]$ mkdir /tmp/cert

      Isso permite que você exclua suas credenciais da imagem criada.

    2. Copie o certificado X.509 e a chave privada correspondente do seu computador para o diretório /tmp/cert na sua instância usando uma ferramenta de cópia segura, como scp. A opção -i my-private-key.pem no comando scp é a chave privada que você usa para se conectar à sua instância com o SSH, não a chave privada X.509. Por exemplo:

      you@your_computer:~ $ scp -i my-private-key.pem /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem /path/to/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem ec2-user@ec2-203-0-113-25.compute-1.amazonaws.com:/tmp/cert/ pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem 100% 717 0.7KB/s 00:00 cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem 100% 685 0.7KB/s 00:00

    Como alternativa, por serem arquivos de texto simples, é possível abrir o certificado e a chave em um editor de texto e copiar o conteúdo para novos arquivos em /tmp/cert.

  2. Prepare o pacote para carregar para o Amazon S3 executando o comando ec2-bundle-vol em sua instância. Não se esqueça de especificar a opção -e para de excluir o diretório onde suas credenciais estão armazenadas. Por padrão, o processo de colocação em pacotes exclui arquivos que possam conter informações confidenciais. Esses arquivos incluem *.sw, *.swo, *.swp, *.pem, *.priv, *id_rsa*, *id_dsa* *.gpg, *.jks, */.ssh/authorized_keys e */.bash_history. Para incluir todos os arquivos, use a opção --no-filter. Para incluir alguns dos arquivos, use a opção --include.

    Importante

    Por padrão, o processo de empacotamento da AMI cria um conjunto de arquivos compactados e criptografados no diretório /tmp que representa o volume raiz. Se você não tem o espaço em disco suficiente em /tmp para armazenar o pacote, precisa especificar um local diferente para o pacote ser armazenado com a opção -d /path/to/bundle/storage. Algumas instâncias têm armazenamento temporário montado em /mnt ou /media/ephemeral0 que você pode usar, ou você pode também criar, associar e montar um novo volume do Amazon EBS para armazenar o pacote. Para obter mais informações, consulte Criar um volume do Amazon EBS no Guia do usuário do Amazon EC2.

    1. Execute o comando ec2-bundle-vol como raiz. Na maioria dos comandos, é possível usar sudo para ganhar permissões elevadas, mas neste caso, é necessário executar sudo -E su para manter as variáveis do ambiente.

      [ec2-user ~]$ sudo -E su

      Observe que prompt bash agora identifica você como usuário raiz, e o cifrão foi substituído por uma hashtag, sinalizando que você está em um shell raiz:

      [root ec2-user]#
    2. Para criar o pacote de AMIs, execute o comando ec2-bundle-vol da seguinte forma:

      [root ec2-user]# ec2-bundle-vol -k /tmp/cert/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -c /tmp/cert/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -u 123456789012 -r x86_64 -e /tmp/cert --partition gpt
      nota

      Para as regiões China (Pequim) e AWS GovCloud (US-West), use o parâmetro --ec2cert e especifique os certificados de acordo com os pré-requisitos.

      Pode demorar alguns minutos para criar a imagem. Quando esse comando for concluído, o diretório /tmp (ou não padrão) conterá o pacote (image.manifest.xml, além de vários arquivos image.part.xx).

    3. Saída do shell raiz.

      [root ec2-user]# exit
  3. (Opcional) Para adicionar mais volumes de armazenamento de instâncias, edite os mapeamentos de dispositivos de blocos no arquivo image.manifest.xml para sua AMI. Para obter mais informações, consulte Mapeamentos de dispositivos de blocos.

    1. Crie um backup do seu arquivo image.manifest.xml.

      [ec2-user ~]$ sudo cp /tmp/image.manifest.xml /tmp/image.manifest.xml.bak
    2. Reformate o arquivo image.manifest.xml para que seja mais fácil ler e editar.

      [ec2-user ~]$ sudo xmllint --format /tmp/image.manifest.xml.bak > /tmp/image.manifest.xml
    3. Edite os mapeamentos de dispositivos de blocos em image.manifest.xml com um editor de texto. O exemplo abaixo mostra uma nova entrada para o volume do armazenamento de instâncias ephemeral1.

      nota

      Para obter uma lista dos arquivos excluídos, consulte ec2-bundle-vol.

      <block_device_mapping> <mapping> <virtual>ami</virtual> <device>sda</device> </mapping> <mapping> <virtual>ephemeral0</virtual> <device>sdb</device> </mapping> <mapping> <virtual>ephemeral1</virtual> <device>sdc</device> </mapping> <mapping> <virtual>root</virtual> <device>/dev/sda1</device> </mapping> </block_device_mapping>
    4. Salve o arquivo image.manifest.xml e saia do seu editor de texto.

  4. Para fazer upload do pacote para o Amazon S3, execute o comando ec2-upload-bundle da seguinte forma.

    [ec2-user ~]$ ec2-upload-bundle -b DOC-EXAMPLE-BUCKET/bundle_folder/bundle_name -m /tmp/image.manifest.xml -a your_access_key_id -s your_secret_access_key
    Importante

    Para registrar a AMI em uma região diferente de US East (N. Virginia), é preciso especificar tanto a região de destino com a opção --region quanto um caminho do bucket que já exista na região de destino, ou um caminho de bucket exclusivo que possa ser criado na região de destino.

  5. (Opcional) Depois de o pacote ser carregado para o Amazon S3, é possível removê-lo do diretório /tmp na instância usando o comando rm a seguir:

    [ec2-user ~]$ sudo rm /tmp/image.manifest.xml /tmp/image.part.* /tmp/image
    Importante

    Se você tiver especificado um caminho com a opção -d /path/to/bundle/storage em Passo 2, use esse caminho em vez de /tmp.

  6. Para registrar a AMI, execute o comando register-image da seguinte maneira.

    [ec2-user ~]$ aws ec2 register-image --image-location DOC-EXAMPLE-BUCKET/bundle_folder/bundle_name/image.manifest.xml --name AMI_name --virtualization-type hvm
    Importante

    Se você tiver especificado previamente uma região para o comando ec2-upload-bundle, especifique essa região novamente para esse comando.

Criar uma AMI a partir de uma instância em Ubuntu com armazenamento de instâncias

Esta seção descreve a criação de uma AMI a partir de uma instância Ubuntu Linux com um volume de armazenamento de instâncias como o volume raiz. Os procedimentos a seguir podem não funcionar para instâncias que executam outras distribuições do Linux. Para obter procedimentos específicos para o Amazon Linux, consulte Criar uma AMI a partir de uma instância do Amazon Linux com armazenamento de instâncias.

Para se preparar para usar as ferramentas da AMI (somente instâncias do HVM)

As ferramentas de AMI exigem GRUB Legacy para inicializarem corretamente. Contudo, o Ubuntu está configurado para usar GRUB 2. É necessário verificar se sua instância usa GRUB Legacy e, caso negativo, é preciso instalá-lo e configurá-lo.

As instâncias de HVM também exigem a instalação de ferramentas de particionamento para as ferramentas de AMI funcionarem corretamente.

  1. O GRUB Legacy (versão 0.9x ou anterior) deve estar instalado na sua instância. Verifique se o GRUB Legacy está presente e instale-o, se necessário.

    1. Verifique a versão da sua instalação do GRUB.

      ubuntu:~$ grub-install --version grub-install (GRUB) 1.99-21ubuntu3.10

      Neste exemplo, a versão do GRUB é posterior à 0.9x, de modo que é necessário instalar o GRUB Legacy. Vá para Passo 2. Se o GRUB Legacy já estiver presente, vá direto para Passo 2.

    2. Instale o pacote grub usando o comando a seguir.

      ubuntu:~$ sudo apt-get install -y grub
  2. Instale os pacotes de gerenciamento de partição a seguir usando o gerenciador de pacotes para sua distribuição.

    • gdisk (algumas distribuições podem acessar o pacote gptfdisk em seu lugar)

    • kpartx

    • parted

    Use o seguinte comando.

    ubuntu:~$ sudo apt-get install -y gdisk kpartx parted
  3. Verifique os parâmetros do kernel para sua instância.

    ubuntu:~$ cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-3.2.0-54-virtual root=UUID=4f392932-ed93-4f8f-aee7-72bc5bb6ca9d ro console=ttyS0 xen_emul_unplug=unnecessary

    Observe as opções após o kernel e os parâmetros do dispositivo raiz: ro, console=ttyS0 e xen_emul_unplug=unnecessary. Suas opções podem diferir.

  4. Verifique as entradas do kernel em /boot/grub/menu.lst.

    ubuntu:~$ grep ^kernel /boot/grub/menu.lst kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro console=hvc0 kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro single kernel /boot/memtest86+.bin

    Observe se o parâmetro console está apontando para hvc0 em vez de ttyS0 e se o parâmetro xen_emul_unplug=unnecessary está ausente. Mais uma vez, suas opções podem diferir.

  5. Edite o arquivo /boot/grub/menu.lst com seu editor de texto favorito (como o vim ou o nano) para alterar o console e adicionar os parâmetros identificados anteriormente às entradas de inicialização.

    title Ubuntu 12.04.3 LTS, kernel 3.2.0-54-virtual root (hd0) kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro console=ttyS0 xen_emul_unplug=unnecessary initrd /boot/initrd.img-3.2.0-54-virtual title Ubuntu 12.04.3 LTS, kernel 3.2.0-54-virtual (recovery mode) root (hd0) kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro single console=ttyS0 xen_emul_unplug=unnecessary initrd /boot/initrd.img-3.2.0-54-virtual title Ubuntu 12.04.3 LTS, memtest86+ root (hd0) kernel /boot/memtest86+.bin
  6. Verifique se suas entradas de kernel agora contêm os parâmetros corretos.

    ubuntu:~$ grep ^kernel /boot/grub/menu.lst kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro console=ttyS0 xen_emul_unplug=unnecessary kernel /boot/vmlinuz-3.2.0-54-virtual root=LABEL=cloudimg-rootfs ro single console=ttyS0 xen_emul_unplug=unnecessary kernel /boot/memtest86+.bin
  7. [Somente para Ubuntu 14.04 e mais recentes] Começando pelo Ubuntu 14.04, AMIs do Ubuntu compatíveis com o armazenamento de instâncias usam uma tabela de partição de GPT e uma partição de EFI separado montados em /boot/efi. O comando ec2-bundle-vol não empacotará essa partição de inicialização, portanto você precisa comentar a entrada /etc/fstab para a partição EFI, conforme exibido no exemplo a seguir.

    LABEL=cloudimg-rootfs / ext4 defaults 0 0 #LABEL=UEFI /boot/efi vfat defaults 0 0 /dev/xvdb /mnt auto defaults,nobootwait,comment=cloudconfig 0 2
Para criar uma AMI a partir de uma instância em Ubuntu com armazenamento de instâncias

Este procedimento pressupõe que você atendeu aos pré-requisitos de Pré-requisitos.

Nos comandos a seguir, substitua cada espaço reservado para entrada do usuário por suas próprias informações.

  1. Carregue suas credenciais para sua instância. Usamos essas credenciais para garantir que só você e o Amazon EC2 possam acessar sua AMI.

    1. Crie um diretório temporário na sua instância para suas credenciais, da seguinte forma:

      ubuntu:~$ mkdir /tmp/cert

      Isso permite que você exclua suas credenciais da imagem criada.

    2. Copie a chave privada e o certificado X.509 do seu computador para o diretório /tmp/cert na sua instância usando uma ferramenta de cópia segura, como a scp. A opção -i my-private-key.pem no comando scp é a chave privada que você usa para se conectar à sua instância com o SSH, não a chave privada X.509. Por exemplo:

      you@your_computer:~ $ scp -i my-private-key.pem /path/to/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem /path/to/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem ec2-user@ec2-203-0-113-25.compute-1.amazonaws.com:/tmp/cert/ pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem 100% 717 0.7KB/s 00:00 cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem 100% 685 0.7KB/s 00:00

    Como alternativa, por serem arquivos de texto simples, é possível abrir o certificado e a chave em um editor de texto e copiar o conteúdo para novos arquivos em /tmp/cert.

  2. Prepare o pacote para fazer upload para o Amazon S3 executando o comando ec2-bundle-vol a partir de sua instância. Não se esqueça de especificar a opção -e para de excluir o diretório onde suas credenciais estão armazenadas. Por padrão, o processo de colocação em pacotes exclui arquivos que possam conter informações confidenciais. Esses arquivos incluem *.sw, *.swo, *.swp, *.pem, *.priv, *id_rsa*, *id_dsa* *.gpg, *.jks, */.ssh/authorized_keys e */.bash_history. Para incluir todos os arquivos, use a opção --no-filter. Para incluir alguns dos arquivos, use a opção --include.

    Importante

    Por padrão, o processo de empacotamento da AMI cria um conjunto de arquivos compactados e criptografados no diretório /tmp que representa o volume raiz. Se você não tem o espaço em disco suficiente em /tmp para armazenar o pacote, precisa especificar um local diferente para o pacote ser armazenado com a opção -d /path/to/bundle/storage. Algumas instâncias têm armazenamento temporário montado em /mnt ou /media/ephemeral0 que você pode usar, ou você pode também criar, associar e montar um novo volume do Amazon EBS para armazenar o pacote. Para obter mais informações, consulte Criar um volume do Amazon EBS no Guia do usuário do Amazon EC2.

    1. Execute o comando ec2-bundle-vol como raiz. Na maioria dos comandos, é possível usar sudo para ganhar permissões elevadas, mas neste caso, é necessário executar sudo -E su para manter as variáveis do ambiente.

      ubuntu:~$ sudo -E su

      Observe que prompt bash agora identifica você como usuário raiz, e o cifrão foi substituído por uma hashtag, sinalizando que você está em um shell raiz:

      root@ubuntu:#
    2. Para criar o pacote de AMIs, execute o comando ec2-bundle-vol da seguinte forma.

      root@ubuntu:# ec2-bundle-vol -k /tmp/cert/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -c /tmp/cert/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBEXAMPLE.pem -u your_aws_account_id -r x86_64 -e /tmp/cert --partition gpt
      Importante

      Para Ubuntu 14.04 e as instâncias HVM posteriores, adicione o marcador --partition mbr para empacotar as instruções de inicialização corretamente; caso contrário, sua AMI recém-criada não inicializará.

      Pode demorar alguns minutos para criar a imagem. Quando esse comando for concluído, o diretório tmp conterá o pacote (image.manifest.xml, além de vários arquivos image.part.xx).

    3. Saída do shell raiz.

      root@ubuntu:# exit
  3. (Opcional) Para adicionar mais volumes de armazenamento de instâncias, edite os mapeamentos de dispositivos de blocos no arquivo image.manifest.xml para sua AMI. Para obter mais informações, consulte Mapeamentos de dispositivos de blocos.

    1. Crie um backup do seu arquivo image.manifest.xml.

      ubuntu:~$ sudo cp /tmp/image.manifest.xml /tmp/image.manifest.xml.bak
    2. Reformate o arquivo image.manifest.xml para que seja mais fácil ler e editar.

      ubuntu:~$ sudo xmllint --format /tmp/image.manifest.xml.bak > /tmp/image.manifest.xml
    3. Edite os mapeamentos de dispositivos de blocos em image.manifest.xml com um editor de texto. O exemplo abaixo mostra uma nova entrada para o volume do armazenamento de instâncias ephemeral1.

      <block_device_mapping> <mapping> <virtual>ami</virtual> <device>sda</device> </mapping> <mapping> <virtual>ephemeral0</virtual> <device>sdb</device> </mapping> <mapping> <virtual>ephemeral1</virtual> <device>sdc</device> </mapping> <mapping> <virtual>root</virtual> <device>/dev/sda1</device> </mapping> </block_device_mapping>
    4. Salve o arquivo image.manifest.xml e saia do seu editor de texto.

  4. Para fazer upload do pacote para o Amazon S3, execute o comando ec2-upload-bundle da seguinte forma.

    ubuntu:~$ ec2-upload-bundle -b DOC-EXAMPLE-BUCKET/bundle_folder/bundle_name -m /tmp/image.manifest.xml -a your_access_key_id -s your_secret_access_key
    Importante

    Se você pretende registrar a AMI em uma região diferente de US East (N. Virginia), é preciso especificar tanto a região de destino com a opção --region quanto um caminho do bucket que já exista na região de destino, ou um caminho de bucket exclusivo que possa ser criado na região de destino.

  5. (Opcional) Depois de o pacote ser carregado para o Amazon S3, é possível removê-lo do diretório /tmp na instância usando o comando rm a seguir:

    ubuntu:~$ sudo rm /tmp/image.manifest.xml /tmp/image.part.* /tmp/image
    Importante

    Se você tiver especificado um caminho com a opção -d /path/to/bundle/storage em Passo 2, use o mesmo caminho abaixo, em vez de /tmp.

  6. Para registrar a AMI, execute o comando register-image da AWS CLI da seguinte maneira.

    ubuntu:~$ aws ec2 register-image --image-location DOC-EXAMPLE-BUCKET/bundle_folder/bundle_name/image.manifest.xml --name AMI_name --virtualization-type hvm
    Importante

    Se você tiver especificado previamente uma região para o comando ec2-upload-bundle, especifique essa região novamente para esse comando.

  7. [Ubuntu 14.04 e posterior] Retire a entrada EFI em /etc/fstab; caso contrário, sua instância em execução não conseguirá reinicializar.