Запустите новый экземпляр EC2 с указанным присоединенным объемом EBS

Я хотел бы запустить экземпляр EC2 с помощью Python boto библиотека с ранее созданным присоединенным объемом EBS (в дополнение к корневому объему).

После соединения я ищу объем его бейджем и пытаюсь создать список блочного устройства, содержащий объем. Я получал все виды ошибок, но в конечном счете создал следующий код, который, по крайней мере, преуспевает в том, чтобы запустить экземпляр.

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)

Оператор печати показывает, что смог к поиску объем и сообщает о корректном идентификаторе объема. Однако, когда экземпляр запускается, новый бесформатный объем на 32 ГБ создается и присоединяется к объему вместо этого.

Я испытываю затруднения при нахождении документации, которая ясно дает понять это. Что корректный путь состоит в том, чтобы добавить определенный Объем EBS к block_device_map?

3
задан 1 April 2015 в 09:23
2 ответа

Невозможно запустить новый экземпляр EC2 с подключенным существующим томом EBS.

Вместо этого подключите существующий том EBS после запуска нового экземпляра EC2. У вас есть два варианта:

  1. Подключить существующий том EBS во время начальной загрузки вашего экземпляра. Используя cloud init, у вас есть начальный запуск сценария, который присоединяет том.

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html

  1. После запуска вашего нового EC2 Например, подождите, пока он завершит запуск, а затем прикрепите существующий том EBS из своего скрипта Python.

Изменить: добавлены дополнительные сведения на основе комментариев.

Все SDK для различных языков вызывают базовый API AWS. См. Базовую документацию API AWS для RunInstances :

http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html

Для этой команды есть Параметр BlockDeviceMapping , который, если вы следуете его структуре данных, не включает свойство идентификатора тома.

Я не знаком с Python SDK, но возможно, что SDK перегружает класс BlockDeviceMapping , чтобы представить как спецификацию для запуска (которая не разрешает идентификатор тома), так и отображение для запущенный экземпляр (который может включать идентификатор тома).

Обычно я работаю с AWS SDK для .NET и редко обращаюсь к документации, посвященной этому. Обычно я обращаюсь к документации по базовому API (как я упоминал выше), а затем «нахожу» подходящие методы для использования в .NET SDK. Но я считаю, что базовая документация API верна, если есть несоответствие.

5
ответ дан 3 December 2019 в 05:24

В отличие от Мэтта, вполне возможно присоединить существующие тома EBS к AMI во время его создания.

Во-первых, у вас должен быть моментальный снимок вашего тома,это можно сделать как через консоль, так и через aws-cli.

Затем вы создаете AMI на основе этого снимка 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
  }
}
]"

Затем вы запускаете экземпляр на основе указанного выше AMI. Здесь я опускаю пример создания спотового экземпляра, но создание экземпляра по требованию еще проще:

#!/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\"
     }"

Все это легко скрипт и программирование.

1
ответ дан 3 December 2019 в 05:24

Теги

Похожие вопросы