gpt4 book ai didi

python - AWS boto - 实例状态/快照状态不会更新 Python While Loop

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:34 24 4
gpt4 key购买 nike

因此,我正在使用 boto 创建一个 Python 脚本,以允许用户准备扩展他们的 Linux 根卷和分区。在脚本的第一部分,我想要一个 While 循环或类似的东西来使脚本不继续,直到:

a) 实例已经完全停止

b) 快照创建完成。


以下是这两者的代码片段:

实例:

ins_prog = conn.get_all_instances(instance_ids=src_ins, filters={"instance-state":"stopped"})
while ins_prog == "[]":
print src_ins + " is still shutting down..."
time.sleep(2)
if ins_prog != "[]":
break

快照:

snap_prog = conn.get_all_snapshots(snapshot_ids=snap_id, filters={"progress":"100"})
while snap_prog == "[]":
print snap.update
time.sleep(2)
if snap_prog != "[]":
print "done!"
break

因此,当调用 conn.get_all_instancesconn.get_all_snapshots 时,如果过滤器不显示任何内容,它们将返回一个空列表,其格式类似于 []。问题是 While 循环甚至不运行。就好像它没有将 [] 识别为 get_all 函数生成的字符串。

如果有更简单的方法,请告诉我我现在不知所措 ):

谢谢!

编辑:根据 garnaat 的帮助,这里是后续问题。

snap_prog = conn.get_all_snapshots(snapshot_ids=snap.id)[0]
print snap_prog
print snap_prog.id
print snap_prog.volume_id
print snap_prog.status
print snap_prog.progress
print snap_prog.start_time
print snap_prog.owner_id
print snap_prog.owner_alias
print snap_prog.volume_size
print snap_prog.description
print snap_prog.encrypted

结果:

Snapshot:snap-xxx
snap-xxx
vol-xxx
pending

2015-02-12T21:55:40.000Z
xxxx
None
50
Created by expandDong.py at 2015-02-12 21:55:39
False

请注意 snap_prog.progress 如何返回 null,但 snap_prog.status 在被置于 While 循环中时保持为“待处理”。

已解决:

我和我的同事发现了如何让快照循环正常工作。

snap = conn.create_snapshot(src_vol)

while snap.status != 'completed':
snap.update()
print snap.status
time.sleep(5)
if snap.status == 'completed':
print snap.id + ' is complete.'
break

snap.update() 调用纯粹更新变量 snap 以返回最新信息,其中 snap.status 输出“待定” "| “完全的”。我还遇到了 snap.status 未根据控制台显示快照的正确状态的问题。显然,控制台和 SDK 调用之间存在明显的滞后时间。当快照在控制台中完成时,我不得不等待大约 4 分钟,状态才能更新为“已完成”。

最佳答案

如果我想检查特定实例的状态并等待该实例达到某个状态,我会这样做:

import time    
import boto.ec2
conn = boto.ec2.connect_to_region('us-west-2') # or whatever region you want
instance = conn.get_all_instances(instance_ids=['i-12345678'])[0].instances[0]
while instance.state != 'stopped':
time.sleep(2)
instance.update()

get_all_instances 调用的有趣之处是必要的,因为该调用返回一个 Reservation 对象,而该对象又具有一个 instances 属性是所有匹配实例的列表。因此,我们将获取列表中的第一个(也是唯一一个)Reservation,然后获取预订中的第一个(也是唯一一个)Instance。您可能应该对此进行一些错误检查。

快照可以用类似的方式处理。

snapshot = conn.get_all_snapshots(snapshot_ids=['snap-12345678'])[0]
while snapshot.status != 'completed':
time.sleep(2)
snapshot.update()

两个对象的 update() 方法向 EC2 查询对象的最新状态,并用该状态更新本地对象。

关于python - AWS boto - 实例状态/快照状态不会更新 Python While Loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28483685/

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