24

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

注意:我正在使用 Boto 库。

对此的任何解决方案将不胜感激!

4

4 回答 4

25

更新

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

这很丑陋,但它有效。令人沮丧的是,EC2 没有提供更好的设施来从实例内部发出状态信号。

标签

一种可能的方法是让实例的用户数据脚本在完成时向实例添加一个附加标签。您可以使用过滤器轮询实例update或执行 describe-instances,该过滤器仅包含带有您用来指定用户数据已更新的标签的节点。

这要求您在发送用户数据脚本时包含有限的 API 密钥和机密。不要使用您的常规 api 密钥和秘密,使用非常有限的 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 元数据服务发送附加请求,以设置特殊实例标签或自定义额外状态字段。

于 2013-05-16T03:23:29.100 回答
2

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

于 2016-10-18T13:19:42.413 回答
1

您使用 EC2 API 工具并记录用户数据输出或只是检查ec2-get-console-output. 参考这篇文章:http ://alestic.com/2010/12/ec2-user-data-output

抱歉,不确定 Boto

在您的用户数据脚本中,您将结果记录到日志文件中。启动实例后,您检查文件。

于 2012-07-26T09:36:11.043 回答
0

如果您使用的是 Amazon Linux,则可以使用带有指令的chkconfig脚本:/etc/init.dRequired-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 启动实例时才执行此操作。

于 2015-12-07T03:25:10.053 回答