【问题标题】:How to check User Data status while launching the instance in aws如何在 aws 中启动实例时检查用户数据状态
【发布时间】:2012-06-30 00:22:03
【问题描述】:

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

注意: 我正在使用 Boto 库。

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

【问题讨论】:

  • 如何定义“正确执行”?您只是想知道初始化脚本何时完成吗?什么过程在做检查?它是在同一个实例上运行还是在其他地方运行?
  • 也许写一个日志来表明一个检查点。
  • ec2conn.run_instances(ami,instance_type=instance_type,placement=placement,user_data=script,security_groups=security_groups)
  • where script="我要执行的后端用户脚本"
  • 我需要用状态码检查我的用户脚本是否完成。(成功或失败)

标签: amazon-ec2 boto


【解决方案1】:

更新

我开始做的是在用户数据运行结束时创建一个标记文件。我让节点控制器为每个 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 元数据服务发送额外请求,以设置特殊实例标签或自定义额外状态字段。

【讨论】:

【解决方案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

【讨论】:

  • 等待实例状态检查正常并不能保证用户数据脚本已经完成。
【解决方案3】:

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

抱歉,不清楚博托

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

【讨论】:

  • 不幸的是,ec2-get-console-output 不会成功。 EC2 在实例进入“运行状态”后不久停止更新控制台输出,并且在实例更改状态之前不会再次更新。
  • 只需将您的用户数据结果记录到日志文件中。
  • 这不会让远程工具在没有 ssh'ing 和轮询实例上的日志文件的情况下看到状态,这在凭据管理、安全性、自动化等方面是一个痛苦。跨度>
  • 这不是痛苦。您必须将您的公钥部署到您的 AMI。之后,只需ssh [your-instance-address] cat /var/log/user-data.log > /tmp/user-data.log
  • 本地轮询 cloud-init 日志不能满足我在易于扩展到更大的实例数、自动化等方面的需求。无论如何,我在评论您的原始答案,这将不起作用,不是编辑后的建议。
【解决方案4】:

如果您使用的是 Amazon Linux,则可以在 /etc/init.d 中使用带有 Required-Start 指令的 chkconfig 脚本:

#!/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 启动实例时执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    相关资源
    最近更新 更多