Я хотел бы запустить экземпляр 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?
Невозможно запустить новый экземпляр EC2 с подключенным существующим томом EBS.
Вместо этого подключите существующий том EBS после запуска нового экземпляра EC2. У вас есть два варианта:
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html
Изменить: добавлены дополнительные сведения на основе комментариев.
Все 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 верна, если есть несоответствие.
В отличие от Мэтта, вполне возможно присоединить существующие тома 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\"
}"
Все это легко настраивается и программируется.