2017-08-09 61 views
1

我目前正在将自动EBS快照从Bash脚本迁移到Python Boto3。在原来的Bash shell,脚本低于只是一条线:如何仅将Boto3中的EBS快照用于运行实例?

ec2-describe-instances --filter "instance-state-code=16" | grep "vol-" | awk '{print $3}' | xargs -n 1 -t ec2-create-snapshot -d "automated daily backup" 

实例状态码16指运行EC2实例。我是Boto3的新手,我已经在最接近的地方搜索了所能找到的最接近卷的快照,但这还不够好,因为尽管EBS卷上没有任何更改,但停止的实例仍然是每晚快照。

+0

*“尽管EBS卷上没有任何更改,但停止的实例仍然是每晚的快照”。*请注意:值得注意的是:如果已经存储了快照,未使用卷的快照也不会增加任何额外的费用。对未更改的卷进行连续快照不会存储任何新的快照数据,因为在存储之前对同一卷的快照进行了重复数据消除。出于同样的原因,您还会发现这些快照也会很快完成。 –

回答

2

使用boto3,您可以为ec2资源创建a filter,其中只有运行实例。从结果列表中,遍历每个实例,并检查它们的block_device_mappings

您可以从上面的字典获得卷ID。现在,你需要做的是create a snapshot

一个粗略的代码如下:

ec2 = boto3.resource('ec2') 
for instance in ec2.instances.filter(
    Filters=[{ 
     'Name': "instance-state-name", 
     'Values': ["running"] 
    }] 
): 
    for device in instance.block_device_mappings: 
     ec2.create_snapshot(VolumeId=device.get('Ebs').get('VolumeId')) 
0

这不回答你的博托的问题,但我注意到您使用的是旧式的命令行界面。现在,建议使用AWS Command-Line Interface (CLI),它具有很强的功能。

例如,该命令将列出连接到实例的所有EBS卷,卷ID:

aws ec2 describe-instances --query Reservations[*].Instances[*].BlockDeviceMappings[*].Ebs.VolumeId --output text 

然后,您可以添加过滤器,只显示运行实例:

aws ec2 describe-instances --query Reservations[*].Instances[*].BlockDeviceMappings[*].Ebs.VolumeId --filter Name=instance-state-name,Values=running --output text 

那么你可以把它另一个命令快照卷运行实例:

aws ec2 create-snapshot --volume-id `aws ec2 describe-instances --query Reservations[*].Instances[*].BlockDeviceMappings[*].Ebs.VolumeId --filter Name=instance-state-name,Values=running --output text` 

不需要奇怪的awk/grep命令!

相关问题