3

我一直在使用fabric 和boto 来启动新的ec2 主机以进行一些临时处理,但我一直无法知道何时可以连接到主机。问题是我可以询问 ec2 什么时候准备好,但它从来没有真正准备好。

这是我注意到效果最好的过程(尽管它仍然很烂):

  1. 轮询 ec2,直到它说它“活动”的主机
  2. 轮询 ec2 直到它有一个public_dns_name
  3. 尝试循环连接到新主机,直到它接受连接

但有时它似乎在知道我与之关联的 ssh 密钥对之前就接受了连接,然后要求输入密码。

有没有更好的方法来决定在我的 ec2 主机启动后何时可以开始连接它们?有没有人写过一个库可以很好地有效地做到这一点?

4

2 回答 2

4

我对#1 和#2 做同样的事情,但是对于#3,我有一个代码循环,它试图通过短暂的超时和重试与 ssh 端口 (22) 建立一个简单的 TCP 连接。当它最终成功时,它会再等待五秒钟,然后运行 ​​ssh 命令。

启动 sshd 并将公共 ssh 密钥添加到 .ssh/authorized_keys 的时间和顺序可能因您运行的 AMI 而异。

注意:我温和地建议直接使用公共 IP 地址而不是 DNS 名称。IP 地址在 DNS 名称中编码,因此将 DNS 查找添加到过程中没有任何好处。

于 2011-09-13T21:14:39.207 回答
0

EC2 本身无法知道您的实例何时准备好接受 SSH 连接;它的运作水平远低于此水平。

最好的方法是更新您的 AMI 以拥有某种健康 servlet。它可以非常简单——只需几行web.py脚本——在启动的后期运行,并且只向任何 HTTP 请求返回状态码 200。当 servlet 响应请求时,其他一切都应该启动,因此您可以使用该 URL 上的指数退避来检查您的实例。

如果您曾经将您的实例放在负载均衡器后面(这有其自身的好处),那么无论如何都需要这个运行状况 servlet,并且还有一个额外的好处是可以在实例出于任何原因出现故障时告诉负载均衡器。这只是 EC2 上的一般最佳实践。

于 2011-09-13T18:40:38.310 回答