如何使用Boto启动EC2实例并指定EBS的大小?

27

我正在使用boto/python启动一个从EBS卷引导的新EC2实例。在启动实例的同时,我想覆盖引导EBS卷的默认大小。

我没有找到任何适用于我的启动代码的boto方法或参数。

ec2 = boto.connect_ec2( ACCESS_KEY, SECRET_KEY, region=region )

reservation = ec2.run_instances( image_id=AMI_ID, 
                                 key_name=EC2_KEY_HANDLE, 
                                 instance_type=INSTANCE_TYPE,
                                 security_groups = [ SECGROUP_HANDLE, ] )

这个网页展示了如何使用命令行工具增加运行中的EC2实例的EBS卷大小,但我希望在指定EC2实例时使用boto:

3个回答

44

您需要先创建一个块设备映射:

dev_sda1 = boto.ec2.blockdevicemapping.EBSBlockDeviceType()
dev_sda1.size = 50 # size in Gigabytes
bdm = boto.ec2.blockdevicemapping.BlockDeviceMapping()
bdm['/dev/sda1'] = dev_sda1 

在此之后,您可以在run_instances调用中提供块设备映射:

reservation = ec2.run_instances( image_id=AMI_ID, 
                                 key_name=EC2_KEY_HANDLE, 
                                 instance_type=INSTANCE_TYPE,
                                 security_groups = [ SECGROUP_HANDLE, ],
                                 block_device_mappings = [bdm])

很不幸,这个问题没有得到很好的记录,但是可以在源代码中找到示例


2
这个可行!谢谢!对于像我这样的新手,有一个警告:我以为自己很聪明,把“/dev/sda1”改成“/dev/xvda1”,因为在我运行的Ubuntu实例中,根据“df -h”命令,那是引导卷的名称。但出现了“无效的设备名称/dev/xvda1”的错误消息。所以我把它改回了“/dev/sda1”,一切都很顺利。 - Iron Pillow
2
一个晚点的评论,但或许有用。你可以使用 boto.ec2.image.Image 对象中 'block_device_mapping' 的值,修改它,并将其直接作为 boto.ec2.image.Image.run()run_instances() 方法的 block_device_map 参数使用。 - EmmEff
6
重要提示:在 Boto 中,默认情况下 delete_on_termination=False。然而,在 Web 控制台中,“删除实例时删除存储卷”复选框默认为选中状态。 - trss
4
在较新版本的Boto中,run_instances()方法中的参数block_device_mappings已更名为block_device_map,类型应为BlockDeviceMapping而不是其数组。请注意,这并不改变原始意义。 - nmurthy
在我的情况下,block_device_mappings必须更改为# block_device_map = bdm。 - shantanuo
显示剩余2条评论

0
这是使用boto3“万物皆资源”的方法的代码版本。还请注意如何避免硬编码磁盘名称:
import boto3

ec2 = boto3.resource('ec2')


def ec2_one_by_key_and_value(collection: str, key: str, value: str):
    handler = getattr(ec2, collection)
    return list(handler.filter(Filters=[{'Name': key, 'Values': [value]}]))[0]


image = ec2_one_by_key_and_value('images', 'name', 'ubuntu/images/hvm-ssd/...')
root_disk = None
for block_device in image.block_device_mappings:
    if block_device['DeviceName'] == image.root_device_name:
        root_disk = block_device
        assert root_disk['Ebs']
        root_disk['Ebs']['VolumeSize'] = 16 # New disk 
        break
assert root_disk
instances = ec2.create_instances(MinCount=1, ..., ImageId=image.id,
                                 BlockDeviceMappings=image.block_device_mappings)


0

您还可以使用CloudFormation,用于记录和自动化您的环境。 您可以在以下链接中检查ESB定义的模板:https://s3.amazonaws.com/cloudformation-templates-us-east-1/EC2WithEBSSample.template

 "Resources" : {
    "Ec2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "AvailabilityZone" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "TestAz" ]},
        "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
        "KeyName" : { "Ref" : "KeyName" },
        "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]},
        "Volumes" : [ 
          { "VolumeId" : { "Ref" : "NewVolume" },
            "Device" : "/dev/sdk"
          }
        ]
      }
    },

    ...

    "NewVolume" : {
      "Type" : "AWS::EC2::Volume",
      "Properties" : {
        "Size" : "100",
        "AvailabilityZone" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "TestAz" ]}
      }
    }

然后,您可以使用Boto CloudFormation API来部署您的环境。


谢谢,伙计。CloudFormation 看起来非常有趣,我最终会仔细研究一下。 - Michel Feldheim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接