Lançar nova instância do EC2 com um volume especificado do EBS anexado

3

Eu gostaria de lançar uma instância EC2 usando a biblioteca boto python, com um volume EBS criado anteriormente (além do volume raiz).

Após a conexão, eu procuro o volume pelo tag de nome e tento criar uma lista de dispositivos de bloco contendo o volume. Eu estava recebendo todos os tipos de erros, mas finalmente criei o seguinte código que, pelo menos, consegue lançar uma instância.

volumes=conn.get_all_volumes(filters={'tag:Name':'TestVolume'})
vol=volumes[0]
print repr(vol)

disks=ec2.blockdevicemapping.BlockDeviceMapping()
xvdf=ec2.blockdevicemapping.BlockDeviceType(volume_id=vol.id,
    size=vol.size,volume_type=vol.type)
disks['/dev/xvdf']=xvdf

base_image="ami-9a562df2" #ubuntu 14.04
reservation=conn.run_instances(
    base_image,
    instance_type="t2.micro",
    block_device_map=disks)

A declaração de impressão mostra que foi capaz de pesquisar o volume e reportar o id de volume correto. No entanto, quando a instância inicia, um novo volume não formatado de 32 GB é criado e anexado ao volume.

Estou com dificuldades para encontrar documentação que deixe isso claro. Qual é a maneira correta de adicionar um Volume EBS específico ao block_device_map?

    
por confuzzled 01.04.2015 / 08:23

2 respostas

4

Não é possível iniciar uma nova instância do EC2 com um volume existente do EBS anexado.

Em vez disso, anexe seu volume do EBS existente após o lançamento da nova instância do EC2. Você tem duas opções:

  1. Anexe seu volume do EBS existente durante a sequência inicial de inicialização da sua instância. Usando o cloud init, você tem uma execução de script inicial que anexa o volume.

link

  1. Depois de lançar sua nova instância do EC2, aguarde que ela termine de ser iniciada e, em seguida, anexe o volume existente do EBS de dentro do seu script Python.

Editar: adicionou mais detalhes com base nos comentários.

Todos os vários SDKs de idiomas chamam a API de base da AWS. Veja a documentação básica da API da AWS para RunInstances :

link

Nesse comando, há um parâmetro BlockDeviceMapping de forma que, se você seguir sua estrutura de dados, não incluirá uma propriedade de ID de volume.

Não estou familiarizado com o SDK do Python, mas é possível que o SDK esteja sobrecarregando a classe BlockDeviceMapping para representar uma especificação para ativação (que não permite o ID do volume) e um mapeamento para uma instância em execução (que pode incluir um ID de volume).

Eu costumo trabalhar com o AWS SDK for .NET e raramente me refiro à documentação específica para isso. Eu normalmente me refiro aos documentos de base da API (como referi acima), então eu "encontro" os métodos apropriados para usar no .NET SDK. Mas considero os documentos da API de base como corretos se houver uma discrepância.

    
por 01.04.2015 / 14:48
1

Ao contrário do Matt, é perfeitamente possível anexar volumes existentes do EBS à AMI durante sua criação.

Em primeiro lugar você deve ter o instantâneo do seu volume, isso pode ser feito através de console e aws-cli.

Em seguida, você cria uma AMI com base nesse instantâneo do EBS:

#!/bin/bash

aws --region=sa-east-1 ec2 \
register-image \
--name "image" \
--description "new_image" \
--architecture x86_64 \
--kernel-id aki-912fbcfd \
--root-device-name "/dev/xvda" \
--block-device-mappings "[
{
 \"DeviceName\": \"/dev/xvda\",
 \"Ebs\": {
 \"SnapshotId\": \"snap-0dfgkhdfjkhg77\",
 \"DeleteOnTermination\": false
  }
}
]"

Em seguida, você inicia a instância com base na AMI acima. Aqui deixo de lado a amostra da criação de instância spot, mas a criação da instância On-Demand é ainda mais simples:

#!/bin/bash
AWS_DEFAULT_OUTPUT="text"
ami="ami-xxxxxxx"
price="0.0022"
region="sa-east-1"
sgroup="sg-54654765"
zone="sa-east-1b"
key="key"

aws ec2 request-spot-instances  \
    --region $region \
    --spot-price $price  \
    --type "persistent" \
    --instance-interruption-behavior "stop" \
    --launch-specification \
    "{ \"KeyName\": \"$key\", 
       \"ImageId\": \"$ami\" , 
       \"InstanceType\": \"t1.micro\"
     }"

Tudo isso é facilmente programável e programável.

    
por 25.04.2018 / 15:10