如何从内部检测aws实例的状态?

时间:2016-03-10 10:36:31

标签: amazon-web-services amazon-ec2

我在EC2中有自动缩放组,我想在终止时检测实例的状态,这样我就可以在终止之前开始导出日志文件。

我知道一种方法是使用自动缩放生命周期钩子但是从我的理解我将不得不使用外部监视器,然后必须ssh到实例并执行日志文件的导出。理想情况下,我想找到一种方法来检测如何从内部检测实例状态(当自动缩放组发送命令以终止它时),因此它将自己进行导出,而不与任何其他实例通信。任何人都知道是否有可能这样做,如果是这样我可以从哪里开始?

2 个答案:

答案 0 :(得分:4)

这是一个解决方案,受到您检查状态的想法的启发......

获取实例ID

http://169.254.169.254/latest/meta-data/instance-id

获取实例的生命周期状态

aws autoscaling describe-auto-scaling-instances --instance-ids <instance-id>

它返回类似:

{
  "AutoScalingInstances": [
      {
          "InstanceId": "i-4ba0837f",
          "HealthStatus": "HEALTHY",
          "AvailabilityZone": "us-west-2c",
          "AutoScalingGroupName": "my-auto-scaling-group",
          "LifecycleState": "InService"
      }
  ]
}

如果激活了生命周期挂钩,LifecycleState字段在终止时将为Pending:Wait。这将是您的应用程序关闭,导出日志文件等的信号。

信号准备终止

一旦申请完成终止活动,就可以发出终止准备的信号。这可以通过以下方式完成:

  • 在创建生命周期挂钩时定义心跳值,然后实例自动终止
  • 在关机过程中延长心跳(见下文)
  • 准备好关机时,停止发送心跳

心跳呼叫将是:

aws autoscaling record-lifecycle-action-heartbeat --lifecycle-hook-name my-lifecycle-hook --instance-id my-instance

总的来说,上述步骤应该允许实例检测自己的状态并发出自己的准备就绪的信号。 (虽然,准确地说,'信号'实际上是'缺少'信号以继续运行。

答案 1 :(得分:1)

我还没试过,但这可能有用......

生命周期挂钩可以向 SNS 发送通知。然后,这可以向 HTTP端点发送消息,该端点可能是您在服务器上运行的Web应用程序。然后,应用程序可以执行您需要的关闭活动。