我正在尝试使用用户数据启动aws实例。我的用户数据是服务器安装过程,我必须检查用户数据脚本是否正确执行。有没有选项可以检查用户数据的状态是否已完成?我需要知道自从启动的实例以来我正在拍摄另一张图片的状态。现在,我明确地使用time.sleep(90)来完成我的流程。
注意: 我正在使用Boto库。
对此的任何解决方案都将非常感谢!
答案 0 :(得分:18)
我所做的是在用户数据运行结束时创建一个标记文件。我让节点控制器为每个ec2节点生成一个ssh会话,并在另一端运行一个简单的忙等待循环作为命令,因此它只在创建文件时返回。然后我等待()等待所有ssh会话退出或直到等待超时发生。
这很难看,但它确实有效。令人非常沮丧的是,EC2没有为实例内的信令状态提供更好的设施。
一种可能的方法是让实例的用户数据脚本在完成时为实例添加额外的标签。您可以使用update
轮询实例,也可以使用过滤器执行describe-instances,该过滤器仅包含带有用于指定用户数据已更新的标记的节点。
这要求您在发送用户数据脚本时在其中包含有限的API密钥和密钥。 不要使用您的常规api密钥和秘密,使IAM权限非常有限。此外,用户数据脚本可能会在完成后删除其自身。
我也考虑过使用简单通知服务和/或SQS,但这似乎有些过分。
与设置标签一样,它要求实例拥有自己的EC2凭证。
SNS是仅推送的,因此您必须通过EC2可以访问端点。那是一种痛苦。 SQS是pull,但没有消息路由,因此每个节点需要一个队列。您必须将唯一的队列名称传递给实例,或让实例使用EC2凭据从标记中查询它,然后让实例使用该特定队列。
所以,是的,痛苦。
获取控制台输出无效,EC2会在实例转换为“运行”状态后立即停止更新。
强制更新似乎没有任何方式,实例或客户端。
当cloud-init脚本完成后,它可以touch
一个标记文件,可以在普通用户可以访问的地方找到。这有点烦人,因为它需要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元数据服务发送额外请求,以设置特殊实例标记或自定义额外状态字段。
答案 1 :(得分:4)
InstaceStatusOk
Waiter等待UserData脚本完成:
waiter = client.get_waiter('instance_status_ok')
waiter.wait(InstanceIds=['i-12345'])
https://boto3.readthedocs.io/en/latest/reference/services/ec2.html#EC2.Waiter.InstanceStatusOk
答案 2 :(得分:1)
您使用EC2 API工具并记录用户数据输出或只需检查ec2-get-console-output
。请参阅此文:http://alestic.com/2010/12/ec2-user-data-output
抱歉,不确定Boto
在用户数据脚本中,将结果记录到日志文件中。启动实例后,检查文件。
答案 3 :(得分:0)
如果您使用的是亚马逊Linux,则可以在chkconfig
中使用/etc/init.d
脚本并使用Required-Start
指令:
#!/bin/bash
# chkconfig: 345 95 95
# description: Description
### BEGIN INIT INFO
# Provides: userdatainit
# Description: Wait for user data
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Required-Start: cloud-init
# Required-Stop:
### END INIT INFO
case "$1" in
start)
echo "Do work here, will happen -after- UserData script/config."
;;
stop)
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
exit 0
如果您已将其保存为/etc/init.d/afteruserdata
之类的文件,请按以下方式注册:
chown root:root /etc/init.d/afteruserdata
chmod 755 /etc/init.d/afteruserdata
chkconfig --add afteruserdata
chkconfig --level 345 afteruserdata on
然后您可以创建AMI,您的代码将在 UserData
脚本之后运行。
警告:cloud-init
仅在您第一次从AMI启动实例时执行此操作。