我正在尝试使用用户数据启动 aws 实例。我的用户数据是一个服务器安装过程,我必须检查用户数据脚本是否正确执行。是否有任何选项可以检查用户数据的状态是否已完成?我需要知道状态,因为从那个启动的实例中我正在拍摄另一张图像。现在,我明确使用 time.sleep(90) 来完成我的流程。
笔记:
我正在使用 Boto 库。
对此的任何解决方案将不胜感激!
请您参考如下方法:
更新
我所做的是在用户数据运行结束时创建一个标记文件。我让节点 Controller 为每个 ec2 节点生成一个 ssh session ,并在另一端运行一个简单的忙等待循环作为命令,因此它仅在创建文件时返回。然后我只是 wait() 让所有 ssh session 退出或直到发生等待超时。
这很丑陋,但它有效。令人沮丧的是,EC2 没有提供更好的设施来从实例内部发出状态信号。
标签
一种可能的方法是让实例的用户数据脚本在完成时向实例添加一个附加标签。您可以使用 update
轮询实例或使用仅包含带有您用来指定用户数据已更新的标签的节点的过滤器执行 describe-instances。
这要求您在发送用户数据脚本时包含有限的 API key 和 secret 。不要使用您的常规 api key 和 secret ,使用非常有限的 IAM 权限。此外,用户数据脚本可能希望在完成后删除其自身。
SNS/SQS
我也考虑过为此使用简单通知服务和/或 SQS,但这似乎有点矫枉过正。
与设置标签一样,它要求实例拥有自己的 EC2 凭证。
SNS 是仅推送的,因此您必须有一个 EC2 可以访问的端点。那是一种痛苦。 SQS 是拉式的,但没有消息路由,因此您需要为每组节点创建一个队列。您必须将唯一的队列名称传递给实例,或者让实例使用 EC2 凭证从标签中查询它,然后让实例使用该特定队列。
所以,是的,很痛苦。
安慰
获取控制台输出将不起作用,EC2 在实例转换为“运行”状态后不久停止更新。
似乎没有任何方法,实例或客户端,可以强制更新。
标记文件
当 cloud-init 脚本完成时,它可以 touch
普通用户可以在 shell 中访问的标记文件。这有点烦人,因为它需要 ssh 进入每个节点,然后轮询创建标记文件。轮询的痛苦可以通过使用如下循环来减轻:
while ! test -e 'cloud-init-complete'
do
inotifywait -qq -t 2 -e create -e moved_to . ||true
done
在安装 inotify-tools 包之后。如果您不将 inotify-tools 刻录到您的 AMI 中,您需要替换
inotifywait
用一个简单的
sleep
并接受额外的延迟,或者执行:
while ! test -e 'cloud-init-complete'
do
if test -x /usr/bin/inotifywait; then
inotifywait -qq -t 2 -e create -e moved_to . ||true
else
sleep 2
fi
done
但是,这仍然需要到每个服务器的 ssh 连接,而且监控和轮询很麻烦。
更聪明的东西?
我梦寐以求的解决方案是能够向 EC2 元数据服务发送附加请求,以设置特殊实例标签或自定义额外状态字段。