如何使用 boto3 指定 core-os ec2 实例的根卷大小?

Posted

技术标签:

【中文标题】如何使用 boto3 指定 core-os ec2 实例的根卷大小?【英文标题】:How to specify root volume size of core-os ec2 instance using boto3? 【发布时间】:2015-11-19 20:45:42 【问题描述】:

我无法从documentation 和源代码中弄清楚如何定义根设备的大小。

您可以使用 BlockDeviceMappings 部分指定 N 个额外的块设备,您可以在其中声明它们的大小。但是没有办法设置根卷的大小。所以它总是创建一个根卷大小为 8GB 的​​实例,这是默认值。

【问题讨论】:

AWS 文档:docs.aws.amazon.com/AWSEC2/latest/UserGuide/… 【参考方案1】:

今天我自己遇到了这个问题,可能为原始海报迟到了,但万一其他人后来偶然发现这个问题,我做了以下事情:

import boto3
ec2 = boto3.resource('ec2',
                     region_name='eu-west-1',
                     aws_access_key_id='my-key',
                     aws_secret_access_key='my-secret')
instance = ec2.create_instances(ImageId='my-image-id',
                                BlockDeviceMappings=["DeviceName": "/dev/xvda","Ebs" :  "VolumeSize" : 50 ])

以上内容已被截断(您需要将更多参数传递给 create_instances 以获取其他值、InstanceType 等),但本质上是将根设备(在本例中为 /dev/xvda)作为 BlockDeviceMappings 值的一部分传递给所需的卷大小(上例中为 50GB)。

【讨论】:

对于我的实例,根设备称为/dev/sda1,我必须使用它来代替/dev/xvda,但在EC2 中这对我来说是正确的。 OpsWorks 用户应注意,OpsWorks 的 create_instance() API 与此答案中描述的 EC2 的 create_instances 相似,但有一些区别;您需要将"ROOT_DEVICE" 指定为DeviceName 而不是实际名称,并且每个卷都需要VolumeType(将其设置为"gp2" 以获得默认的通用SSD 卷类型)。是的,这些不一致对亚马逊来说是愚蠢的。 获取与boto3一致的设备名称:imgs = list(ec2.images.filter(ImageIds=['my-image-id'])); device_name = imgs[0].root_device_name 当我执行上述操作时,它可以工作,但 lsblk 显示 /dev/svda 仍为 8Gb,因此它不采用提供的值。 进一步的研究表明,这会创建一个额外的 40gb 卷,它没有分区。根卷保持在 8Gb。 我不能用 create_instances 设置它似乎很奇怪。我发现这里的答案只是添加了另一个 EBS 而不是更改根。对我来说,解决方法是生成一个具有所需初始根大小的 AMI(这是默认设置,因此在创建新实例时很好)。然后可以使用 boto3 卷大小修改和后续分区扩展来调整实例的大小。有点痛苦但可行。【参考方案2】:

正如 Steve Jeffereies 所提到的,命名 DeviceName 是关键。我能够使用您通常在 AWS 控制台上看到的 /dev/sda1。以下是使用磁性的工作示例,

BlockDeviceMappings=[
    
        'DeviceName': '/dev/sda1',
        'Ebs': 
            'VolumeSize': 30,
            'VolumeType': 'standard'
        
    
]

【讨论】:

您是否在create_instance 中按特定顺序运行此程序?因为我最终拥有两个 EBS,一个具有默认大小,另一个具有指定大小。另外,因为他们同时拥有/dev/sda1,所以实例会立即自行停止……知道吗?编辑 - 格式化【参考方案3】:

以下是必须设置根设备大小的最少必填字段:

import boto3
ec2_resource = boto3.resource('ec2')
    reservations = ec2_resource.create_instances(

        ImageId= "ami-xyz",
        MinCount=1,
        MaxCount=1,
        InstanceType='xyz',
        KeyName='key-pair',
        TagSpecifications=[
            
                'ResourceType': 'instance',
                'Tags': [
                     'Key': 'Name',
                    'Value': 'xyz-machine'
                ]
            
        ],
        IamInstanceProfile=
        'Name':'xyz-role'
        ,
        BlockDeviceMappings=[
            
                'DeviceName': '/dev/sda1',
                'Ebs': 
                    'VolumeSize': 30,
                    'VolumeType': 'standard'
                
            
        ]
    )

【讨论】:

【参考方案4】:

见***: How to launch EC2 instance with Boto, specifying size of EBS?

另外,AWS Command-Line Interface (CLI) 提供了一种方法:

aws ec2 run-instances --image-id ami-xxxxxxxx --instance-type m1.xlarge --block-device-mappings '"DeviceName": "/dev/sda1","Ebs" :  "VolumeSize" : 50 '

【讨论】:

-1;您的链接(关于 Boto)和命令行咒语(针对命令行客户端)都没有回答关于 Boto 3 的问题。

以上是关于如何使用 boto3 指定 core-os ec2 实例的根卷大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 boto3 在 EC2 中 SSH 和运行命令?

我们如何使用 python boto3 获取挂载到 EC2 实例的所有文件系统(EFS)的列表?

在 Boto3 中获取具有特定标签和值的 EC2 实例列表

boto3如何获取单个ec2实例的所有标签并附加新标签

如何使用 boto3 从连接到 ECS 任务的网络接口获取公共 IP

使用 BOTO3 检索 EC2 实例的公共 dns