gpt4 book ai didi

python - 用于创建 AMI 的 Boto3 create_image - 仅保 stub 卷

转载 作者:太空狗 更新时间:2023-10-29 23:57:06 31 4
gpt4 key购买 nike

我正在编写脚本来创建实例的 AMI 镜像。

我的目标是只保 stub 卷。

我正在使用 boto3。

我的测试实例附加了 2 个 EBS 卷。我只想用 AMI 保 stub 卷。

我的代码是这样工作的:

  1. 收集实例列表
  2. 分析每个实例以仅识别根设备,收集其映射数据
  3. 执行 boto3 的 instance.create_image 来触发,并为根设备传递 ONLY BlockDeviceMappings

预期结果: AMI 只有我在 create_image 调用中定义的 block 设备。

实际结果:AMI 具有所有附加到源实例的 block 设备,无论在 create_image 期间定义的显式 BlockDeviceMappings p>

在我下面的代码中,我编写了一个函数,它在别处获取已经收集的源实例数据。我只定义了根卷信息,BlockDeviceMappings 没有声明附加到源卷的任何其他设备。

def create_image(inst, instance, inst_dict):
nowtime = datetime.datetime.now().strftime('%Y-%m-%d')
try:
image = instance.create_image(
BlockDeviceMappings=[
{
'DeviceName': inst_dict[inst]['root_dev_name'],
'Ebs': {
'Encrypted': inst_dict[inst]['vol_encr'],
'DeleteOnTermination': inst_dict[inst]['vol_del_rule'],
'VolumeSize': inst_dict[inst]['vol_size'],
'VolumeType': inst_dict[inst]['root_dev_type']
},
},
],
Description=inst_dict[inst]['inst_name'] + " " + str(nowtime),
DryRun=False,
Name=inst_dict[inst]['inst_name'] + " " + str(nowtime),
NoReboot=True
)
except Exception, e:
logging.error("Failed to create image! Instance: " + inst_dict[inst]['inst_name'])
return 1

我确实看到 boto3 有一个 'NoDevice': 'string' 参数可以添加到 BlockDeviceMapping 对象。但它附加到映射本身 - 这让我感到困惑,你为什么要声明 block 设备映射,只是为了“排除”它。我不确定如何或为什么要使用此 NoDevice 值。

另外:一个具体的问题:

  • 如果 boto3 的 create_image 将创建所有 block 设备,而不管 BlockDeviceMappings 中放入了什么,那么为什么 BlockDeviceMappings 甚至存在,如果它只是复制源实例 block 设备?

感谢您的帮助。

编辑/更新:

我试图为我不想要的卷声明设备映射。然后使用 NoDevice 参数:

    BlockDeviceMappings=[
{
'DeviceName': inst_dict[inst]['root_dev_name'],
'Ebs': {
'Encrypted': inst_dict[inst]['vol_encr'],
'DeleteOnTermination': inst_dict[inst]['vol_del_rule'],
'VolumeSize': inst_dict[inst]['vol_size'],
'VolumeType': inst_dict[inst]['root_dev_type']
},
},
{
'DeviceName': '/dev/sdf',
'Ebs': {
'Encrypted': True,
'DeleteOnTermination': False,
'VolumeSize': 24,
'VolumeType': 'gp2'
},
'NoDevice': '',
},
],

我唯一能看到的是为 NoDevice 值设置一个空字符串。将它设置为 bool 或其他任何东西都会出错。我试过了“NoDevice”:“true”“NoDevice”:“false”“NoDevice”:True“NoDevice”: False'NoDevice': '/dev/sdf' 它们都会出错。唯一接受的是 'NoDevice': '' 但结果是一样的,两个设备都连接到 AMI。

最佳答案

好的,明白了。

诀窍是如果您想使用 NoDevice

省略它,则不要在映射中定义 DeviceName 以外的任何内容

现在可以使用了,向映射添加任何更多信息将使 NoDevice 无效并被忽略。

希望将来能帮助别人:

{
'DeviceName': '/dev/sdf',
'NoDevice': ''
},

关于python - 用于创建 AMI 的 Boto3 create_image - 仅保 stub 卷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46980189/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com