我一直在使用fabric和boto来启动新的ec2主机进行一些临时处理,但我一直很难知道何时可以连接到主机。问题是我可以问ec2什么时候准备就绪,但它从来没有准备好。
这是我注意到最好的过程(虽然它仍然很糟糕):
public_dns_name
但有时它会在它知道我与之关联的ssh密钥对之前接受连接,然后要求输入密码。
有没有更好的方法来决定何时可以在启动后开始连接我的ec2主机?有没有人写过一个能够很好又有效地完成这项工作的图书馆?
答案 0 :(得分:4)
我为#1和#2做同样的事情,但对于#3,我有一个代码循环试图与ssh端口(22)进行简单的TCP连接,并且超时很短并重试。当它最终成功时,它等待五秒钟然后再运行ssh命令。
启动sshd并将公共ssh密钥添加到.ssh / authorized_keys的时间和顺序可能会因您运行的AMI而异。
注意:我建议您直接使用公共IP地址而不是DNS名称。 IP地址以DNS名称编码,因此将DNS查找添加到流程中没有任何好处。
答案 1 :(得分:0)
EC2本身无法知道您的实例何时可以接受SSH连接;它的运作水平远低于此。
执行此操作的最佳方法是更新您的AMI以获得某种健康servlet。它可以非常简单 - 只需几行web.py脚本 - 在启动的后期运行,并且只将状态代码200返回给任何HTTP请求。当servlet响应请求时,其他所有内容都应该启动,因此您可以使用该URL上的指数退避来检查您的实例。
如果您将实例放在负载均衡器(具有其自身优势)之后,则无论如何都需要此运行状况servlet,并且由于任何原因,在实例发生故障时告知负载均衡器还有额外的好处。这只是EC2的一般最佳实践。