如何仅为 运行 个实例在 Boto3 中拍摄 EBS 快照?

How to take EBS snapshot in Boto3 only for running instances?

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

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

实例状态代码 16 指的是 运行 EC2 实例。我是 Boto3 的新手,我到处搜索,我能找到的最接近的是拍摄附加卷的快照,但这还不够好,因为尽管 EBS 卷上没有任何更改,停止的实例仍将每晚拍摄快照。

使用 boto3,您可以创建 a filter for the ec2 resource, where you get only the running instances. From the resulting list of instances, iterate over each of them, and check their 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'))

这没有回答您的 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 命令!