Manju による
トラブルシューティングの目的による
EC2 の終了遅延を実行する方法の説明

Manju_DUB_0518

Amazon EC2 インスタンスが異常とマークされて、Auto Scaling の Terminating 状態に移行し、最終的には問題の原因を見つけられる前に終了します。

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

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

ライフサイクルフックは AWS CLI と API を使用してのみ設定できます。以下の手順では、AWS CLI を使用した必要な SNS トピックと IAM のアクセス権限の作成など、ライフサイクルフックを設定するプロセスについて説明します。コンソールを使用して IAM と SNS を管理する場合、IAM については「ロールの作成」、SNS については「トピックの作成」を参照してください。

1.    ライフサイクル通知の送信先となる Auto Scaling の SNS トピックを作成します。以下の CLI の例では、SNS create-topic コマンドを呼び出して、SNS トピック ASNotifications を作成します。

$ aws sns create-topic --name ASNotifications

2.    返される Amazon Resource Name (ARN) を保存します。以下のような ARN が返されます。

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

3.     SNS トピックへのサブスクリプションを作成します。これは、保留状態のハートビートタイムアウトを延長するか、またはライフサイクルアクションを完了するために必要な ifecycleAction トークンを受け取るために必須となります。次の例では、aws sns サブスクライブコマンドを使用して、エンドポイント 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 のアクセス権限を設定するには、Auto Scaling サービスアクセス権限を付与して SNS トピックへのメッセージを送信する IAM ロールを作成します。これを実行するには、適切なポリシーを含むテキストファイルを作成し、aws 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.    ライフサイクルフックイベントが発生したときに Auto Scaling からの SNS 通知の送信を許可するためのアクセス権限をそのロールに追加します。以下の例では、aws iam 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 autoscaling 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

このコマンドは以下のタスクを実行します。

  • ライフサイクルフックに名前を付けます (AStroubleshoot)。
  • ライフサイクルフックが関連付けられている 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)。

環境内でこのコマンドを実行する前に、実際の Auto Scaling グループ名、SNS ターゲット ARN、IAM ロール ARN を必ず置き換えることを確認します。

ライフサイクルフックをテストするには、インスタンスを選択し、terminate-instance-in-auto-scaling group を使用してインスタンスを終了します。これで、インスタンスが異常になった場合と同じように、Auto Scaling がインスタンスを終了します。インスタンスが Terminating:Wait (終了中:待機) 状態に移行したら、record-lifecycle-action-heartbeat を使用してインスタンスの Terminating:Wait (終了中:待機) 状態を保留するか、あるいは 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

このページは役に立ちましたか? はい | いいえ

AWS サポート ナレッジ センターに戻る

サポートが必要ですか? AWS サポートセンターをご覧ください。

公開日: 2015 年 08 月 04 日

更新: 2017 年 08 月 25 日