トラブルシューティングするために、異常のある Amazon EC2 インスタンスの終了を遅らせるにはどうすればよいですか?

所要時間2分
1

Amazon Elastic Compute Cloud (Amazon EC2) のインスタンスに異常があり、問題の原因を特定する前に終了してしまいました。

簡単な説明

異常のある EC2 インスタンスを終了前にトラブルシューティングするには、Amazon EC2 Auto Scaling ライフサイクルフックを追加して、インスタンスのステータスが [終了中] から **[終了中:お待ち下さい]**に変わるようにします。

デフォルトでは、インスタンスが [終了中:お待ち下さい] 状態を維持する時間は 3600 秒 (1 時間) です。この時間を増やすには、put-lifecycle-hook API コールの heartbeat-timeout パラメーターを使用します。インスタンスを [終了中:お待ち下さい] 状態で維持できる最大時間は、48 時間またはハートビートのタイムアウトを 100 倍した時間のいずれか短い方です。

解決策

AWS コマンドラインインターフェイス (AWS CLI) を使用してライフサイクルフックを設定します。

**注:**AWS CLI のコマンドの実行時にエラーが発生する場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用しているようにしてください。

Amazon SNS トピックを作成する

Amazon Simple Notification Service (Amazon SNS) トピックを作成するには、次の手順を実行します。

  1. EC2 Auto Scaling グループがライフサイクル通知を送信する SNS トピックを作成します。次の例では、create-topic コマンドを実行して ASNotifications トピックを作成します。

    $ aws sns create-topic --name ASNotifications

    次のような ARN が出力で返されます。

    "TopicArn": "arn:aws:sns:us-west-2:123456789012:ASNotifications"
  2. トピックへのサブスクリプションを作成します。保留状態のハートビートタイムアウトを延長したり、ライフサイクルアクションを完了したりするために必要な LifecycleActionToken を受け取るには、サブスクリプションがあることが必要です。次の例では、subscribe コマンドを実行して、user@amazon.com エンドポイントの E メールアドレスが設定されている E メールプロトコル SMTP を使用するサブスクリプションを作成します。

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

IAM 権限の設定

AWS Identity and Access Management (IAM) ロールを設定し、このロールが EC2 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 に保存されているポリシーから、AS-Lifecycle-Hook-Role IAM ロールを作成します。

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

    出力にはロールの ARN が含まれています。IAM ロールと SNS トピックの両方の ARN を書き留めておきます。

  4. ロールに権限を追加して、ライフサイクルフックイベントが発生したときに EC2 Auto Scaling が SNS 通知を送信できるようにします。次の例では、attach-role-policy コマンドを実行して AutoScalingNotificationAccessRole AWS マネージドポリシーを AS-Lifecycle-Hook-Role という IAM ロールにアタッチしています。

    $ 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"
          ]
        }
      ]
    }

    重要: AutoScalingNotificationAccessRole AWS マネージドポリシーにより、EC2 Auto Scaling はすべての SNS トピックとキューを呼び出すことができます。EC2 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 AStroubleshoot
    --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

注: 上記の例の値は、それぞれ実際の EC2 Auto Scaling グループ名、SNS ターゲット ARN、および IAM ロール ARN で置き換えてください。

put-lifecycle-hook コマンドにより、以下の機能を完了できます。

  • ライフサイクルフックに名前を付ける (AStroubleshoot)
  • ライフサイクルフックに関連付けられている EC2 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 コマンドを実行してインスタンスを強制終了します。インスタンスが [終了中:お待ち下さい] 状態に変わった後、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 hooks

AWS のサービスにアクセス許可を委任するロールの作成

Creating an Amazon SNS topic

AWS公式
AWS公式更新しました 1年前
コメントはありません