如何在aws中启动实例时检查用户数据状态

Nav*_*ani 23 amazon-ec2 boto

我正在尝试使用用户数据启动aws实例.我的用户数据是服务器安装过程,我必须检查用户数据脚本是否正确执行.有没有选项可以检查用户数据的状态是否已完成?我需要知道自从启动的实例以来我正在拍摄另一张图片的状态.现在,我明确地使用time.sleep(90)来完成我的流程.

注意:我正在使用Boto库.

任何解决方案都将非常感谢!

Cra*_*ger 20

UPDATE

我所做的是在用户数据运行结束时创建一个标记文件.我让节点控制器为每个ec2节点生成一个ssh会话,并在另一端运行一个简单的忙等待循环作为命令,因此它只在创建文件时返回.然后我等待()等待所有ssh会话退出或直到等待超时发生.

这很难看,但它确实有效.令人非常沮丧的是,EC2没有为实例内的信令状态提供更好的设施.

标签

一种可能的方法是让实例的用户数据脚本在完成时为实例添加一个额外的标签.您可以update使用过滤器轮询实例,也可以使用过滤器轮询实例,该过滤器仅包含带有用于指定用户数据已更新的标记的节点.

这要求您在发送用户数据脚本时在其中包含有限的API密钥和密钥.不要使用常规api密钥和秘密,使IAM权限非常有限.此外,用户数据脚本可能希望在完成后删除其自身.

SNS/SQS

我也考虑过使用简单通知服务和/或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
Run Code Online (Sandbox Code Playgroud)

安装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
Run Code Online (Sandbox Code Playgroud)

但是,这仍然需要与每个服务器进行ssh连接,这对于监视和轮询来说是一种痛苦.

更聪明的东西?

我的梦想解决方案是能够向EC2元数据服务发送附加请求,以设置特殊实例标签或自定义额外状态字段.