如何仅在运行实例时在Boto3中获取EBS快照?

时间:2017-08-09 07:52:54

标签: amazon-web-services amazon-ec2 boto3 snapshot

我目前正在将自动EBS快照从Bash脚本迁移到Python Boto3。在原始的Bash shell中,脚本只是下面的一行:

render()

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

2 个答案:

答案 0 :(得分:2)

使用boto3,您可以为ec2资源创建a filter,其中只获取正在运行的实例。从生成的实例列表中,迭代每个实例,并检查它们的block_device_mappings

您可以从上面的字典中获取volume-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'))

答案 1 :(得分:0)

这并不能解答您的boto问题,但我注意到您使用的是旧式命令行界面。目前,建议使用具有一些强大功能的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命令!