トラブルシューティングするために、異常のある Amazon EC2 インスタンスの Auto Scaling の終了を遅らせる方法を教えてください。

最終更新日: 2020 年 11 月 18 日

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスが異常としてマークされ、「Auto Scaling を終了しています」状態になりました。そして Amazon EC2 インスタンスは問題の原因を特定する前に終了してしまいました。この問題を解決するには、どうすればよいですか?

簡単な説明

AWS Auto Scaling グループにライフサイクルフックを追加して、インスタンスの状態が [終了中] から [終了中:待機] に変わるようにします。この状態では、インスタンスが終了する前にインスタンスにアクセスしてから、異常としてマークされた原因のトラブルシューティングを行うことができます。

デフォルトでは、インスタンスは 3600 秒 (1 時間) にわたり [終了中:待機] 状態になります。この時間を長くするには、put-lifecycle-hook API コールで heartbeat-timeout (ハートビートタイムアウト) パラメータを使用します。インスタンスを [終了中:待機] 状態に保つことができる最大時間は、48 時間またはハートビートのタイムアウトの 100 倍の、どちらか小さい方です。

解決方法

注: AWS コマンドラインインターフェイス (AWS CLI) のコマンド実行時にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください

AWS CLI を使用してライフサイクルフックを設定するには、次の手順に従います。次に、必要な Amazon Simple Notification Service (Amazon SNS) トピックと AWS Identity and Access Management (IAM) アクセス許可を作成します。

または、AWS マネジメントコンソールを使用してライフサイクルフックを設定できます。次に、コンソールで Amazon SNS トピックと IAM アクセス許可を管理するには、以下を参照してください。

Amazon SNS トピックの作成

1.    AWS Auto Scaling がライフサイクル通知を送信できるトピックを作成します。次の例では、create-topic コマンドを呼び出して ASNotifications トピックを作成します。

$ aws sns create-topic --name ASNotifications

次のような Amazon リソースネーム (ARN) が返されます。

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

2.    トピックへのサブスクリプションを作成します。サブスクリプションは、保留状態のハートビートタイムアウトを延長するか、またはライフサイクルアクションを完了するために必要な ifecycleAction トークンを受け取るために必須です。次の例では、subscribe コマンドを使用して、エンドポイント E メールアドレス (user@amazon.com) を使った E メールプロトコル (SMTP) を使用するサブスクリプションを作成します。

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

IAM アクセス許可の設定

IAM のアクセス許可を設定するには、AWS Auto Scaling サービスアクセス許可を付与して SNS トピックへのメッセージを送信する IAM ロールを作成します。このタスクを完了するには、適切なポリシーを含むテキストファイルを作成します。次に、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 からの 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"
       ]
     }
   ]
}

ライフサイクルフックの設定

次に、put-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 に置き換えてください。

このコマンドで以下を行います。

  • ライフサイクルフックに名前を付けます (AStroubleshoot)
  • ライフサイクルフックに関連付けられている AWS Auto Scaling グループを識別します (MyASGroup)
  • インスタンス終了のライフサイクルステージ用のフックを設定します (EC2_INSTANCE_TERMINATING)
  • SNS トピックの ARN を指定します (arn:aws:sns:us-west-2:123456789012:ASNotifications)
  • IAM ロールの ARN を指定します (arn:aws:iam::123456789012:role/AS-Lifecycle-Hook-Role)

ライフサイクルフックのテスト

ライフサイクルフックをテストするには、インスタンスを選択してから、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

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?