Amazon EC2 Auto Scaling (日本語)
ユーザーガイド

Amazon EC2 Auto Scaling ライフサイクルフック

ライフサイクルフックを使用すると、Auto Scaling グループによるインスタンスの起動時または削除時にインスタンスを一時停止してカスタムアクションを実行できます。たとえば、新しく起動したインスタンスの停止中に、そのインスタンスにソフトウェアをインストールまたは設定できます。

各 Auto Scaling グループは、複数のライフサイクルフックを保持できます。ただし、Auto Scaling グループごとにフックの数の制限があります。詳細については、「Amazon EC2 Auto Scaling の制限」を参照してください。

ライフサイクルフックの動作

Auto Scaling グループにライフサイクルフックを追加すると、次のように機能します。

  1. スケールアウトイベントにはインスタンスを起動して、スケールインイベントにはインスタンスを終了して応答します。

  2. インスタンスを待機状態にします (Pending:Wait または Terminating:Wait)。処理を続行するように指示するまで、またはタイムアウト期間終了まで、インスタンスは一時停止されたままです。

  3. 1 つ以上の次のオプションを使用して、カスタムアクションを実行できます。

    • ライフサイクルアクションが発生したときに、Lambda 関数を呼び出す CloudWatch イベント ターゲットを定義します。Amazon EC2 Auto Scaling がライフサイクルアクションのイベントを CloudWatch イベント に送信したときに、Lambda 関数が呼び出されます。イベントには、起動または終了されるインスタンスに関する情報と、ライフサイクルアクションをコントロールするために使用できるトークンが含まれています。

    • ライフサイクルフック用の通知ターゲットを定義します。Amazon EC2 Auto Scaling はその通知ターゲットへメッセージを送信します。メッセージには、起動または終了されるインスタンスに関する情報と、ライフサイクルアクションをコントロールするために使用できるトークンが含まれています。

    • インスタンスが起動されると、インスタンスで実行されるスクリプトが作成されます。このスクリプトは、それが実行されているインスタンスの ID を使用してライフサイクルアクションを制御できます。

  4. デフォルトでは、インスタンスは 1 時間にわたり待機状態になった後、Auto Scaling グループは起動処理または削除処理を継続します (Pending:Proceed または Terminating:Proceed)。さらに時間が必要な場合は、ハートビートを記録することにより、タイムアウト期間を再開できます。タイムアウト期間が終了する前に終了した場合、起動処理または削除処理を継続するライフサイクルアクションを完了できます。

次の図は、このプロセスのインスタンス状態の遷移を示しています。


                    ライフサイクルフックを使用するインスタンスのライフサイクル。

Auto Scaling グループのインスタンスの詳細なライフサイクルについては、「Auto Scaling ライフサイクル」を参照してください。

ライフサイクルフックを使用する際の考慮事項

Auto Scaling グループにライフサイクルフックを追加することで、インスタンスの起動と終了の方法をより詳細にコントロールすることができます。Auto Scaling グループにライフサイクルフックを追加した場合に、グループが引き続き想定どおりに実行できるようにするための考慮事項を以下に示します。

インスタンスを待機状態に維持する

インスタンスは一定期間、待機状態に維持できます。デフォルト値は 1 時間 (3600 秒) です。この時間は以下の方法で調整できます。

  • ライフサイクルフックを作成するときに、ライフサイクルフックのハートビートタイムアウトを設定します。put-lifecycle-hook コマンドで --heartbeat-timeout パラメータを使用します。PutLifecycleHook オペレーションで、HeartbeatTimeout パラメータを使用します。

  • タイムアウト期間が終了する前に終了したときに次の状態に移るには、complete-lifecycle-action コマンド、または CompleteLifecycleAction オペレーションを使用します。

  • ハートビートを記録することにより、タイムアウト期間を再開する場合は、record-lifecycle-action-heartbeat コマンド、または RecordLifecycleActionHeartbeat オペレーションを使用します。これにより、ライフサイクルフックを作成したときに指定されたタイムアウト値によって、ハートビートタイムアウトが増加します。たとえば、タイムアウト値が 1 時間に設定されている場合、30 分後にこのコマンドを呼び出すと、追加した時間に応じてインスタンスが待機状態のままになります(合計 90 分)。

インスタンスを待機状態に保つことができる最大時間は、48 時間またはハートビートのタイムアウトの 100 倍の、どちらか小さい方です。

クールダウンおよびカスタムアクション

簡易スケーリングポリシーによって Auto Scaling グループがインスタンスを起動または終了した場合、クールダウンが実施されます。クールダウン期間によって、Auto Scaling グループは必要な数を上回るインスタンスを起動または終了しなくなります。

インスタンスの起動でカスタムアクションをサポートするライフサイクルフックのある Auto Scaling グループについて考えてみましょう。アプリケーションで需要が増加すると、グループは容量を追加するためにインスタンスを起動します。ライフサイクルフックがあるため、インスタンスは Pending:Wait 状態になり、トラフィックの処理にまだ使用できないことが示されます。インスタンスが待機状態になると、簡易スケーリングポリシーによるスケーリングアクションは一時停止されます。インスタンスが InService 状態になると、クールダウン期間が開始します。クールダウン期間が過ぎると、一時停止されていたスケーリングアクションが再開します。

ヘルスチェックの猶予期間

ライフサイクルフックを追加した場合、ヘルスチェックの猶予期間が始まるのは、ライフサイクルフックアクションが完了してインスタンスが InService 状態になってからになります。

ライフサイクルアクションの結果

ライフサイクルフックの終了時、結果は ABANDON または CONTINUE のどちらかです。

インスタンスを起動しているとき、CONTINUE はアクションが成功し、インスタンスをサービスに配置できることを示します。それ以外の場合、ABANDON はカスタムアクションが失敗し、インスタンスを終了できることを示します。

インスタンスの削除処理中の場合、ABANDON および CONTINUE の両方はインスタンスが終了するようにします。ただし、CONTINUE は他のライフサイクルフックを完了するのを待ちますが、ABANDON は残りのアクション (他のライフサイクルフックなど) を停止します。

スポットインスタンス

ライフサイクルフックはスポットインスタンスと共に使用できます。ただし、ライフサイクルフックを使用しても、スポット料金の変更 (不特定の時点で発生する可能性があります) が原因でインスタンスが削除されるのを回避することはできません。また、スポットインスタンスを削除するときは、ライフサイクルアクションも終了させる必要があります (complete-lifecycle-action コマンドまたは CompleteLifecycleAction オペレーションを使用)。

通知の準備

インスタンスが待機状態になったときにオプションで通知を設定できます。通知により、カスタムアクションを実行できます。通知を受信するために、Amazon CloudWatch Events、Amazon SNS、または Amazon SQS を使用できます。目的のオプションを選択します。

または、起動するときにインスタンスを設定するスクリプトがある場合は、ライフサイクルアクションが発生したときに通知を受け取る必要はありません。まだそうしていない場合は、インスタンスメタデータからインスタンスのインスタンス ID を取得するためのスクリプトを更新します。詳細については、「インスタンスメタデータの取得」を参照してください。

CloudWatch イベント を使用した通知の受け取り

CloudWatch イベント を使用して、ライフサイクルアクションが発生したときに Lambda 関数を呼び出すターゲットを設定できます。

CloudWatch イベント を使用して通知を設定するには

  1. Lambda 関数の作成 の手順を使用して Lambda 関数を作成し、Amazon Resource Name (ARN) を書き留めておきます。たとえば、arn:aws:lambda:us-west-2:123456789012:function:my-function と指定します。

  2. 次の put-rule コマンドを使用して、ライフサイクルアクションと一致する CloudWatch イベント ルールを作成します。

    aws events put-rule --name my-rule --event-pattern file://pattern.json --state ENABLED

    インスタンス起動のライフサイクルアクションのための pattern.json:

    { "source": [ "aws.autoscaling" ], "detail-type": [ "EC2 Instance-launch Lifecycle Action" ] }

    インスタンス終了のライフサイクルアクションのための pattern.json:

    { "source": [ "aws.autoscaling" ], "detail-type": [ "EC2 Instance-terminate Lifecycle Action" ] }
  3. 次の add-permission コマンドを使用して、Lambda 関数を呼び出すためのアクセス許可をルールに付与します。このコマンドは、CloudWatch イベント サービスのプリンシパル (events.amazonaws.com) および範囲に関するアクセス許可を指定のルールに付与します。

    aws lambda add-permission --function-name LogScheduledEvent --statement-id my-scheduled-event --action 'lambda:InvokeFunction' --principal events.amazonaws.com --source-arn arn:aws:events:us-east-1:123456789012:rule/my-scheduled-rule
  4. 次の put-targets コマンドを使用して、ライフサイクルアクションが発生したときに Lambda 関数を呼び出すターゲットを作成します。

    aws events put-targets --rule my-rule --targets Id=1,Arn=arn:aws:lambda:us-west-2:123456789012:function:my-function
  5. Auto Scaling グループがスケールアウトまたはスケールインイベントに応答する場合、インスタンスを待機状態にします。インスタンスが待機状態にあるときに、Lambda 関数が呼び出されます。イベントデータの詳細については、「Auto Scaling イベント」を参照してください。

Amazon SNS を使用した通知の受け取り

ライフサイクルアクションが発生したときに通知を受け取るよう、Amazon SNS を使用して通知ターゲットをセットアップできます。

Amazon SNS を使用して通知をセットアップするには

  1. Amazon SNS を使用してターゲットを作成します。詳細については、『Amazon Simple Notification Service 開発者ガイド』の「トピックの作成」を参照してください。ターゲットの ARN に注意してください (たとえば、arn:aws:sns:us-west-2:123456789012:my-sns-topic など)。

  2. IAM ユーザーガイド』の「AWS サービスにアクセス許可を委任するロールの作成」にあるステップを使用して、通知ターゲットへのアクセス許可を Amazon EC2 Auto Scaling に付与する IAM ロールを作成します。ロールタイプの選択を求められたら、[AWS Service Roles]、[AutoScaling Notification Access] を選択します。ロールの ARN 情報を書き留めます。たとえば、arn:aws:iam::123456789012:role/my-notification-role と指定します。

  3. Auto Scaling グループがスケールアウトまたはスケールインイベントに応答する場合、インスタンスを待機状態にします。インスタンスが待機状態のときに、通知ターゲットにメッセージが発行されます。メッセージには、次に示すイベントデータが含まれます。

    • LifecycleActionToken — ライフサイクルアクショントークン。

    • AccountId — AWS アカウント ID。

    • AutoScalingGroupName — Auto Scaling グループの名前。

    • LifecycleHookName — ライフサイクルフックの名前。

    • EC2InstanceId — EC2 インスタンスの ID。

    • LifecycleTransition — ライフサイクルフックタイプ。

    例:

    Service: AWS Auto Scaling Time: 2016-09-30T20:42:11.305Z RequestId: 18b2ec17-3e9b-4c15-8024-ff2e8ce8786a LifecycleActionToken: 71514b9d-6a40-4b26-8523-05e7ee35fa40 AccountId: 123456789012 AutoScalingGroupName: my-asg LifecycleHookName: my-hook EC2InstanceId: i-0598c7d356eba48d7 LifecycleTransition: autoscaling:EC2_INSTANCE_LAUNCHING NotificationMetadata: null

Amazon SQS を使用した通知の受け取り

ライフサイクルアクションが発生したときに通知を受け取るよう、Amazon SQS を使用して通知ターゲットをセットアップできます。

重要

FIFO キューはライフサイクルフックとの互換性がありません。

Amazon SQS を使用して通知をセットアップするには

  1. Amazon SQS を使用してターゲットを作成します。詳細については、『Amazon Simple Queue Service 開発者ガイド』の「Amazon SQS の開始方法」を参照してください。ターゲットの ARN を記録します。

  2. IAM ユーザーガイド』の「AWS サービスにアクセス許可を委任するロールの作成」にあるステップを使用して、 Amazon EC2 Auto Scaling に通知ターゲットへのアクセス許可を付与する IAM ロールを作成します。ロールタイプの選択を求められたら、[AWS Service Roles]、[AutoScaling Notification Access] を選択します。ロールの ARN 情報を書き留めます。たとえば、arn:aws:iam::123456789012:role/my-notification-role と指定します。

  3. Auto Scaling グループがスケールアウトまたはスケールインイベントに応答する場合、インスタンスを待機状態にします。インスタンスが待機状態のときに、通知ターゲットにメッセージが発行されます。

ライフサイクルフックの追加

put-lifecycle-hook コマンドを使用して、ライフサイクルフックを作成できます。

スケールアウトでアクションを実行するには、次のコマンドを使用します。

aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-hook --auto-scaling-group-name my-asg --lifecycle-transition autoscaling:EC2_INSTANCE_LAUNCHING

スケールインでアクションを実行するには、次のコマンドを使用します。

aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-hook --auto-scaling-group-name my-asg --lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING

(オプション) Amazon SNS または Amazon SQS を使用して通知を受け取るための追加のオプションがあります。たとえば、通知ターゲットとして SNS トピックを指定するには、次のオプションを追加します。

--notification-target-arn arn:aws:sns:us-west-2:123456789012:my-sns-topic --role-arn arn:aws:iam::123456789012:role/my-notification-role

トピックは、次のキーと値のペアをもつテスト通知を受け取ります。

"Event": "autoscaling:TEST_NOTIFICATION"

ライフサイクルフックの完了

Auto Scaling グループがスケールアウトまたはスケールインイベントに応答する場合、はインスタンスを待機状態にして通知を送信します。ライフサイクルフックの完了後に、プロセスの起動または削除を続行します。

ライフサイクルフックを完了するには

  1. インスタンスが待機状態にあるときに、カスタムアクションを実行できます。詳細については、「通知の準備」を参照してください。

  2. カスタムアクション完了までにさらに時間が必要な場合は、record-lifecycle-action-heartbeat コマンドを使用してタイムアウト時間を再開し、インスタンスを待機状態に維持します。次のコマンドに示すように、前のステップで受け取ったライフサイクルアクショントークンを指定できます。

    aws autoscaling record-lifecycle-action-heartbeat --lifecycle-action-token bcd2f1b8-9a78-44d3-8a7a-4dd07d7cf635 --lifecycle-hook-name my-launch-hook --auto-scaling-group-name my-asg

    または、次のコマンドに示すように、前のステップで受け取ったインスタンスの ID を指定できます。

    aws autoscaling record-lifecycle-action-heartbeat --instance-id i-1a2b3c4d --lifecycle-hook-name my-launch-hook --auto-scaling-group-name my-asg
  3. complete-lifecycle-action コマンドを使用してタイムアウト期間が終了する前にカスタムアクションを終了すると、Auto Scaling グループは起動を継続するか、インスタンスを削除することができます。次のコマンドに示すように、ライフサイクルアクショントークンを指定できます。

    aws autoscaling complete-lifecycle-action --lifecycle-action-result CONTINUE --lifecycle-action-token bcd2f1b8-9a78-44d3-8a7a-4dd07d7cf635 --lifecycle-hook-name my-launch-hook --auto-scaling-group-name my-asg

    または、次のコマンドに示すように、インスタンスの ID を指定できます。

    aws autoscaling complete-lifecycle-action --lifecycle-action-result CONTINUE --instance-id i-1a2b3c4d --lifecycle-hook-name my-launch-hook --auto-scaling-group-name my-asg

通知のテスト

起動イベントの通知を生成するには、Auto Scaling グループの希望容量を 1 増やして Auto Scaling グループを更新します。インスタンスを起動してから数分以内に通知を受け取ります。

コンソールを使用して希望容量を変更するには

  1. https://console.aws.amazon.com/ec2/) にある Amazon EC2 コンソールを開きます。

  2. ナビゲーションペインの [Auto Scaling] で、[Auto Scaling グループ] を選択します。

  3. Auto Scaling グループを選択します。

  4. [Details] タブで、[Edit] を選択します。

  5. [Desired] で、現在の値を 1 増やします。この値が [Max] を超えた場合、[Max] の値も 1 増やす必要があります。

  6. [Save] を選択します。

  7. 数分後、イベントの通知が届きます。このテスト用に起動した追加のインスタンスが必要なくなった場合は、[Desired] を 1 減らすことができます。数分後、イベントの通知が届きます。