2017-08-09 60 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命令!

相關問題