如何延遲 Auto Scaling 終止運作狀態不佳的 Amazon EC2 執行個體,以便對其進行疑難排解?

3 分的閱讀內容
0

我的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體遭標記為運作狀態不佳,並移至「Auto Scaling 正在終止」狀態。然後,在我確定問題的原因之前,我的 Amazon EC2 執行個體終止了。

簡短描述

將 lifecycle hook 新增至 AWS Auto Scaling 群組,以將處於正在終止狀態的執行個體移至正在終止:等待狀態。在此狀態下,您可以在執行個體終止之前進行存取,然後對執行個體遭標記為運作狀態不佳的原因進行疑難排解。

依預設,執行個體將保留在正在終止:等待狀態達 3,600 秒 (1 小時)。若要增加此時間,請在 put-lifecycle-hook API 呼叫中使用 heartbeat-timeout 參數。您可以將執行個體保持在正在終止:等待狀態的最長時間為 48 小時或活動訊號逾時的 100 倍 (以較小者為準)。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確保您使用的是最新版本的 AWS CLI

使用下列步驟,利用 AWS CLI 來設定 lifecycle hook。然後,建立必要的 Amazon Simple Notification Service (Amazon SNS) 主題和 AWS Identity and Access Management (IAM) 許可。

或者,您可以使用 AWS 管理主控台設定 lifecycle hook。然後,請參閱下列內容,在主控台中管理 Amazon SNS 主題和 IAM 許可:

建立 Amazon SNS 主題

1.    建立 AWS Auto Scaling 可以在其中傳送生命週期通知的主題。下列範例會呼叫 create-topic 命令來建立 ASNotifications 主題:

$ aws sns create-topic --name ASNotifications

傳回類似下列內容的 Amazon Resource Name (ARN):

"TopicArn": "arn:aws:sns:us-west-2:123456789012:ASNotifications"

2.    建立該主題的訂閱。您必須已訂閱才能接收延長待定狀態的活動訊號逾時或完成生命週期動作所需的 LifecycleActionToken。下列範例使用 subscribe 命令建立使用電子郵件協定 (SMTP) 與端點電子郵件地址 user@amazon.com 的訂閱。

$ aws sns subscribe --topic-arn arn:aws:sns:us-west-2:123456789012:ASNotifications --protocol email --notification-endpoint user@amazon.com

設定 IAM 許可

IAM 許可透過建立 IAM 角色予以設定,該角色授予 AWS Auto Scaling 服務傳送至 SNS 主題的許可。若要完成此任務,請建立包含適當政策的文字檔。然後,在 create-role 命令中參照該檔案。

1.    使用文字編輯器 (例如 vi) 來建立文字檔:

$ sudo vi assume-role.txt

2.    將下列內容貼至文字檔中,然後儲存檔案。

{
  "Version": "2012-10-17",
  "Statement": [{
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "autoscaling.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

3.    使用 aws iam create-role 命令,透過儲存至 assume-role.txt 的政策建立 IAM 角色 AS-Lifecycle-Hook-Role

$ aws iam create-role --role-name AS-Lifecycle-Hook-Role --assume-role-policy-document file://assume-role.txt

輸出包含角色的 ARN。請務必同時儲存 IAM 角色ARNSNS 主題

4.    為角色新增許可,以允許 AWS Auto Scaling 在發生 lifecycle hook 事件時傳送 SNS 通知。下列範例使用 attach-role-policy 命令,將受管政策 AutoScalingNotificationAccessRole 連接至 IAM 角色 AS-Lifecycle-Hook-Role

$ aws iam attach-role-policy --role-name AS-Lifecycle-Hook-Role --policy-arn arn:aws:iam::aws:policy/service-role/AutoScalingNotificationAccessRole

此受管政策授予下列許可:

{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect": "Allow",
      "Resource": "*",
      "Action": [
        "sqs:SendMessage",
        "sqs:GetQueueUrl",
        "sns:Publish"
      ]
    }
  ]
}

**重要:**AWS 受管政策 AutoScalingNotificationAccessRole 允許 AWS Auto Scaling 服務呼叫所有 SNS 主題和佇列。若要將 AWS Auto Scaling 限制僅存取特定 SNS 主題或佇列,請使用下列範例政策。

{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect": "Allow",
      "Resource": "arn:aws:sns:us-west-2:123456789012:ASNotifications",
       "Action": [
         "sqs:SendMessage",
         "sqs:GetQueueUrl",
         "sns:Publish"
       ]
     }
   ]
}

設定 lifecycle hook

接下來,使用 put-lifecycle-hook 命令來設定 lifecycle hook:

aws autoscaling put-lifecycle-hook --lifecycle-hook-name AStroublshoot --auto-scaling-group-name MyASGroup
        --lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING
        --notification-target-arn arn:aws:sns:us-west-2:123456789012:ASNotifications
        --role-arn arn:aws:iam::123456789012:role/AS-Lifecycle-Hook-Role 

在執行此命令之前,務必取代您自己的 AWS Auto Scaling 群組名稱、SNS 目標 ARN 和 IAM 角色 ARN。

此命令:

  • 命名 lifecycle hook (AStroubleshoot)
  • 識別與 lifecycle hook (MyASGroup) 關聯的 AWS Auto Scaling 群組
  • 設定執行個體終止生命週期階段的勾點 (EC2_INSTANCE_TERMINATING)
  • 指定 SNS 主題的 ARN (arn:aws:sns:us-west-2:123456789012:ASNotifications)
  • 指定 IAM 角色的 ARN (arn:aws:iam::123456789012:role/AS-Lifecycle-Hook-Role)

測試 lifecycle hook

若要測試 lifecycle hook,請選擇執行個體,然後使用 terminate-instance-in-auto-scaling group 來終止執行個體。這會強制 AWS Auto Scaling 終止執行個體,類似於執行個體變得運作狀態不佳的情況。在執行個體移至 正在終止:等待狀態之後,您可以使用 record-lifecycle-action-heartbeat 將執行個體保持在此狀態。或者,使用 complete-lifecycle-action 來允許終止完成。

aws autoscaling complete-lifecycle-action --lifecycle-hook-name my-lifecycle-hook
        --auto-scaling-group-name MyASGroup --lifecycle-action-result CONTINUE
        --instance-id i-0e7380909ffaab747

相關資訊

Amazon EC2 Auto Scaling lifecycle hook

AWS 官方
AWS 官方已更新 3 年前