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

Tom*_*mas 6 amazon-ec2 amazon-web-services

我在 EC2 中有 Auto Scaling 组,我想检测实例终止时的状态,以便我可以在终止之前开始导出日志文件。

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

Joh*_*ein 6

这是一个解决方案,灵感来自您检查状态的想法......

获取实例 ID

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

获取实例的生命周期状态

aws autoscaling describe-auto-scaling-instances --instance-ids <instance-id>
Run Code Online (Sandbox Code Playgroud)

它返回如下内容:

{
  "AutoScalingInstances": [
      {
          "InstanceId": "i-4ba0837f",
          "HealthStatus": "HEALTHY",
          "AvailabilityZone": "us-west-2c",
          "AutoScalingGroupName": "my-auto-scaling-group",
          "LifecycleState": "InService"
      }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如果 Lifecycle Hooks 被激活,该LifecycleState字段将Pending:Wait在它被终止时。这将是您的应用程序关闭、导出日志文件等的信号。

信号准备终止

一旦应用程序完成了它的终止活动,它就可以发出它准备终止的信号。这可以通过:

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

心跳调用将是:

aws autoscaling record-lifecycle-action-heartbeat --lifecycle-hook-name my-lifecycle-hook --instance-id my-instance
Run Code Online (Sandbox Code Playgroud)

总的来说,上述步骤应该允许一个实例检测到它自己的状态并发出它自己准备终止的信号。(虽然,准确地说,“信号”实际上是“没有”继​​续运行的信号。

  • @NorseGaud 同意。秘密永远不应该存储在实例上。相反,**为实例分配 IAM 角色**,这将自动提供使用 AWS CLI 所需的凭证,而不在实例上存储任何机密。 (2认同)

Joh*_*ein 0

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

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