我在EC2中有自動縮放組,並且我想在它終止時檢測實例的狀態,以便我可以在它終止之前開始導出日誌文件。如何從內部檢測aws實例的狀態?
我知道一個方法來做到這一點是使用自動調節生命週期掛鉤,但從我的理解,我將不得不使用外部監視器,然後必須ssh到實例並執行日誌文件的導出。理想情況下,我想找到如何從內部檢測實例狀態的方法(當自動縮放組發送命令終止它時),以便它自己執行導出而不與任何其他實例通信。任何人都會知道是否可以這樣做,如果是的話,我可以從哪裏開始?
我在EC2中有自動縮放組,並且我想在它終止時檢測實例的狀態,以便我可以在它終止之前開始導出日誌文件。如何從內部檢測aws實例的狀態?
我知道一個方法來做到這一點是使用自動調節生命週期掛鉤,但從我的理解,我將不得不使用外部監視器,然後必須ssh到實例並執行日誌文件的導出。理想情況下,我想找到如何從內部檢測實例狀態的方法(當自動縮放組發送命令終止它時),以便它自己執行導出而不與任何其他實例通信。任何人都會知道是否可以這樣做,如果是的話,我可以從哪裏開始?
我還沒有嘗試過,但是這可能工作...
生命週期掛鉤可以發送通知給SNS。然後,這可能會向HTTP端點發送消息,該端點可能是您在服務器上運行的Web應用程序。然後,應用程序可以執行您希望的關閉活動。
這將使用「外部」方式來解決我的問題。我試圖避免。我想出了一個想法,從內部檢測我的實例的狀態,然後導出日誌文件。還沒有測試過,但會看到它如何去.. – Tomas
這裏有一個解決方案,你的檢查狀態的想法啓發......
獲得實例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
總的來說,上述步驟應該允許一個實例檢測它自己的狀態並表明它自己的準備就緒被終止。 (雖然,準確地說,'信號'實際上是'不存在'信號繼續運行。
在我花了一些時間後,我意識到我可以通過使用'aws ec2 describe-instance-status --instance-id XXXX'來檢測實例的狀態,但這會檢測實例的實際狀態,而不是自動縮放生命週期掛鉤狀態,我希望。所以我採用了John推薦的路徑,並將SNS通知用於lambda和lambda我將調用實例。 – Tomas