【问题标题】:what's the proper way to check if terminating AWS EC2 instance is successful using boto3?使用 boto3 检查终止 AWS EC2 实例是否成功的正确方法是什么?
【发布时间】:2023-03-29 11:09:01
【问题描述】:

我使用以下代码终止 aws EC2 实例。检查终止是否成功的正确方法是什么?

s = boto3.Session(profile_name='dev')
ec2 = s.resource('ec2', region_name='us-east-1')
ins = ec2.Instance(instance_id)
res = ins.terminate()

我应该检查是否

res['TerminatingInstances'][0]['CurrentState']['Name']=='shutting-down'

还是忽略res,重新描述实例进行检查?

【问题讨论】:

  • 这里的文档并不理想,但我怀疑如果您要终止单个实例,那么没有异常就足够了。
  • 我使用网络服务器来调用这个终止代码。你知道terminate() 会抛出什么异常吗?
  • 针对终止(或其他线程中的服务员)可能引发哪些异常/错误的问题,不幸的是,我认为没有一个好的答案。在我看来,这是 Python 尤其是 boto3 的主要弱点之一——缺乏关于错误处理的良好文档,而且 Python 本身的性质使其无法确定。

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


【解决方案1】:

最好的方法是使用the EC2.Waiter.InstanceTerminated waiter

它每 15 秒轮询一次EC2.Client.describe_instances(),直到达到成功状态。检查失败 40 次后返回错误。

import boto3

client = boto3.client('ec2')
waiter = client.get_waiter('instance_terminated')

client.terminate_instances(InstanceIds=['i-0974da9ff5318c395'])
waiter.wait(InstanceIds=['i-0974da9ff5318c395'])

一旦实例处于终止状态,程序就退出。

【讨论】:

  • 您介意展示一个工作示例并演示要捕获的错误吗?非常感谢~
  • 已添加代码。最后一行只是等待(挂起)直到实例终止。
  • 谢谢约翰。我还有一个问题:在我的服务器中,我定义了自己的BadRequestError 并统一处理它们,这样用户就不会看到 500 错误。你知道waiter 会抛出什么错误吗?
  • 这是来自您的网络服务器的响应吗?如果是这样,它不适用于waiter,因为服务员只是调用 AWS API 来确定实例状态,这与您的 Web 服务器无关。
  • 在我的网络应用程序中,用户单击一个按钮来终止实例。在后台,网络应用程序调用 boto3,最终可能会出错。也许我只是抓住了waiter.wait的一切
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 2018-11-07
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
相关资源
最近更新 更多