ライフサイクルフックを Auto Scaling グループに追加するための準備 - Amazon EC2 Auto Scaling

ライフサイクルフックを Auto Scaling グループに追加するための準備

Auto Scaling グループにライフサイクルフックを追加する前に、ユーザーデータスクリプト、または通知ターゲットまたはが正しく設定されていることを確認するようにしてください。

  • インスタンスの起動中にユーザーデータスクリプトを実行してインスタンスでカスタムアクションを使用するために、通知ターゲットを設定する必要はありません。ただし、ユーザーデータスクリプトを指定する起動テンプレートまたは起動設定を作成し、Auto Scaling グループに関連付けておく必要があります。ユーザーデータスクリプトの詳細については、Linux インスタンス用 Amazon EC2 ユーザーガイド起動時に Linux インスタンスでコマンドを実行するを参照してください。

  • ライフサイクルアクションの完了時に Amazon EC2 Auto Scaling に通知を行うには、スクリプトに CompleteLifecycleAction API コールを追加し、Auto Scaling インスタンスがこの API を呼び出すことを許可するポリシーを持つ IAM ロールを手動で作成する必要があります。起動テンプレートまたは起動設定では、起動時に Amazon EC2 インスタンスにアタッチされる IAM インスタンスプロファイルを使用して、このロールを指定する必要があります。詳細については、「ライフサイクルアクションを完了する」および「Amazon EC2 インスタンスで実行中のアプリケーション用の IAM ロール」を参照してください。

  • Lambda などのサービスを使用してカスタムアクションを実行するには、すでに EventBridge ルールが作成されており、そのターゲットとして Lambda 関数が指定されている必要があります。詳細については、「ライフサイクル通知の通知ターゲットを設定する」を参照してください。

  • ライフサイクルアクション完了時に Lambda に Amazon EC2 Auto Scaling への通知を許可するには、CompleteLifecycleAction API コールを関数コードに追加する必要があります。関数の実行ロールに、ライフサイクルフックを完了する許可を Lambda に付与する IAM ポリシーをアタッチする必要もあります。詳細については、「チュートリアル:Lambda 関数を呼び出すライフサイクルフックの設定」を参照してください。

  • Amazon SNS や Amazon SQS などのサービスを使用してカスタムアクションを実行するには、SNS トピックまたは SQS キューを作成し、その Amazon リソースネーム (ARN) を準備しておく必要があります。また、SNS トピックまたは SQS ターゲットへの Amazon EC2 Auto Scaling アクセスを許可する IAM ロールを作成し、その ARN を準備しておく必要があります。詳細については、「ライフサイクル通知の通知ターゲットを設定する」を参照してください。

    注記

    デフォルトでは、コンソールでライフサイクルフックを追加すると、Amazon EC2 Auto Scaling は Amazon EventBridge にライフサイクルイベント通知を送信します。EventBridge またはユーザーデータスクリプトの使用は、推奨されるベストプラクティスです。Amazon SNS または Amazon SQS に直接通知を送信するライフサイクルフックを作成するには、AWS CLI、AWS CloudFormation、または SDK を使用してライフサイクルフックを追加します。

ライフサイクル通知の通知ターゲットを設定する

ライフサイクルフックを Auto Scaling グループに追加して、インスタンスが待機状態になったときにカスタムアクションを実行できます。希望する開発アプローチに応じてターゲットサービスを選択し、これらのアクションを実行できます。

最初のアプローチでは、Amazon EventBridge を使用して、必要なアクションを実行する Lambda 関数を呼び出します。2 つ目のアプローチでは、通知が発行される Amazon Simple Notification Service (Amazon SNS) トピックを作成することです。クライアントは SNS トピックに登録し、サポートされているプロトコルを使用して公開されたメッセージを受信できます。最後のアプローチでは、Amazon Simple Queue Service (Amazon SQS) を使用します。これは、ポーリングモデルを介してメッセージを交換するために、分散アプリケーションで使用されるメッセージングシステムです。

ベストプラクティスとして、 EventBridge を使用することをお勧めします。Amazon SNS および Amazon SQS に送信される通知には、Amazon EC2 Auto Scaling が EventBridge に送信する通知と同じ情報が含まれています。EventBridge 以前は、SNS または SQS に通知を送信し、別のサービスを SNS または SQS に統合してプログラムによるアクションを実行するのがスタンダードな方法でした。今日、EventBridge では、対象となるサービスのオプションが増え、サーバーレス アーキテクチャを使用してイベントを処理しやすくなりました。

次の手順では、通知ターゲットの設定方法について説明します。

起動テンプレートまたは起動設定に、起動時にインスタンスを設定するユーザーデータスクリプトがある場合は、インスタンスでカスタムアクションを実行するための通知を受け取る必要はありません。

重要

ライフサイクルフックで使用する EventBridge ルール、Lambda 関数、Amazon SNS トピック、および Amazon SQS キューは、常に Auto Scaling グループを作成したのと同じリージョンに存在する必要があります。

EventBridge を使用して通知を Lambda にルーティングする

EventBridge ルールを設定して、インスタンスが待機状態になったときに Lambda 関数を呼び出すことができます。Amazon EC2 Auto Scaling は、起動または終了するインスタンスとライフサイクルアクションを制御するために使用するトークンに関して、EventBridge にライフサイクルイベント通知を送信します。これらのイベントの例については、Amazon EC2 Auto Scaling イベントリファレンス を参照してください。

注記

AWS Management Consoleを使用してイベントルールを作成すると、EventBridge に Lambda 関数を呼び出す許可を付与するために必要な IAM アクセス許可がコンソールによって自動的に追加されます。AWS CLI を使用してイベントルールを作成する場合は、この権限を明示的に付与する必要があります。

EventBridge コンソールでイベントルールを作成する方法の詳細については、「Amazon EventBridge ユーザーガイド」の「イベントに反応する Amazon EventBridge ルールの作成」を参照してください。

- または -

コンソールユーザー向けの初歩的なチュートリアルについては、「チュートリアル:Lambda 関数を呼び出すライフサイクルフックの設定」を参照してください。このチュートリアルは、起動イベントをリッスンし、CloudWatch Logs のログにそれらを書き込むシンプルな Lambda 関数を作成する方法を説明します。

Lambda 関数を呼び出す EventBridge ルールを作成するには
  1. [Lambda コンソール] を使用して Lambda 関数を作成し、Amazon リソースネーム (ARN) を書き留めておきます。例えば、arn:aws:lambda:region:123456789012:function:my-function です。EventBridge ターゲットを作成するには ARN が必要です。詳細については、[AWS Lambdaデベロッパーガイド] の [Lambda の開始方法] を参照してください。

  2. インスタンス起動のイベントに一致するルールを作成するには、次の put-rule コマンドを使用します。

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

    次の例は、インスタンス起動ライフサイクルアクションの pattern.json を示しています。イタリック体のテキストは、Auto Scaling グループの名前に置き換えてください。

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

    コマンドが正常に実行された場合は、ルールの ARN を使用して EventBridge が応答します。この ARN をメモします。これは、ステップ 4 で入力する必要があります。

    他のイベントに一致するルールを作成するには、イベントパターンを変更します。詳細については、「Auto Scaling イベントの処理に EventBridge を使用する」を参照してください。

  3. ルールのターゲットとして使用する Lambda 関数を指定するには、次のput-argetコマンドを実行します。

    aws events put-targets --rule my-rule --targets Id=1,Arn=arn:aws:lambda:region:123456789012:function:my-function

    上記のコマンドで、my-rule はステップ 2 でルールに指定した名前になり、Arn パラメータの値はステップ 1 で作成した関数の ARN になります。

  4. ルールが Lambda 関数を呼び出せるようにする許可を追加するには、以下の Lambda add-permission コマンドを使用します。このコマンドは、EventBridge サービスのプリンシパル (events.amazonaws.com) 信頼し、指定のルールに許可を適用します。

    aws lambda add-permission --function-name my-function --statement-id my-unique-id \ --action 'lambda:InvokeFunction' --principal events.amazonaws.com --source-arn arn:aws:events:region:123456789012:rule/my-rule

    上記のコマンドでは:

    • my-functionは、ルールがターゲットとして使用する Lambda 関数の名前です。

    • my-unique-id は、Lambda 関数ポリシーのステートメントを記述するためにユーザーが定義する一意の識別子です。

    • source-arnは EventBridge ルールの ARN です。

    コマンドが正常に実行された場合は、次のような出力が表示されます。

    { "Statement": "{\"Sid\":\"my-unique-id\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"events.amazonaws.com\"}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-west-2:123456789012:function:my-function\", \"Condition\": {\"ArnLike\": {\"AWS:SourceArn\": \"arn:aws:events:us-west-2:123456789012:rule/my-rule\"}}}" }

    Statement 値は、Lambda 関数ポリシーに追加されたステートメントの JSON 文字列バージョンです。

  5. これらの指示に従った後、次のステップとして「ライフサイクルフックを追加する」に進みます。

Amazon SNS を使用した通知の受信

Amazon SNS を使用して、ライフサイクルアクションが発生したときに、通知を受け取るよう、通知ターゲット (SNS トピック) をセットアップできます。次に、Amazon SNS は登録された受信者に通知を送信します。登録が確認されるまで、トピックに対して発行された通知は受信者に送信されません。

Amazon SNS を使用して通知をセットアップするには
  1. Amazon SNS トピックを作成するには、[Amazon SNS コンソール] または次の [トピックの作成] のコマンドを使用します。このトピックが、使用している Auto Scaling グループと同じリージョンにあることを確認します。詳細については、[Amazon Simple 通知サービスデベロッパーガイド] の [Amazon SNS の使用開始] を参照してください。

    aws sns create-topic --name my-sns-topic
  2. その Amazon リソースネーム (ARN) をメモします、例えば、 arn:aws:sns:region:123456789012:my-sns-topic。ライフサイクルフックを作成するには、それが必要です。

  3. IAM サービスロールを作成して、Amazon EC2 Auto Scaling に Amazon SNS 通知ターゲットへのアクセス権を付与します。

    SNS トピックへの Amazon EC2 Auto Scaling のアクセス権を付与するには

    1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

    2. 左側のナビゲーションペインで、[Roles] を選択します。

    3. [ロールの作成] を選択します。

    4. [Select trusted entity] (信頼されたエンティティの選択) で、[AWS のサービス] を選択します。

    5. ユースケースでは、[他の AWS サービスのユースケース] で [EC2 Auto Scaling]、[EC2 Auto Scaling Notification Access] の順に選択します。

    6. [Next] (次へ) を 2 回選択して、[Name, review, and create] (名前、確認、および作成) ページに進みます。

    7. [Role name] (ロール名) にロールの名前 (my-notification-role など) を入力して、[Create role] (ロールを作成) を選択します。

    8. [Roles (ロール)] ページで作成したロールを選択して、[Summary (概要)] ページを開きます。ロールの [ARN] をメモします。例えば、arn:aws:iam::123456789012:role/my-notification-role です。ライフサイクルフックを作成するには、それが必要です。

  4. これらの指示に従った後、次のステップとして「ライフサイクルフックを追加する (AWS CLI)」に進みます。

Amazon SQS を使用した通知の受信

ライフサイクルアクションが発生したときにメッセージを受け取るよう、Amazon SQS を使用して通知ターゲットをセットアップできます。キューコンシューマーは、SQS キューをポーリングしてこれらの通知を処理する必要があります。

重要

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

Amazon SQS を使用して通知をセットアップするには
  1. [Amazon SQS コンソール] を使用して、Amazon SQS キューを作成します。キューが,使用している Auto Scaling グループと同じリージョンにあることを確認します。詳細については、[Amazon Simple キューサービス デベロッパーガイド] の [Amazon SQS の使用開始] を参照してください。

  2. キューの ARN をメモします。例えば、arn:aws:sqs:us-west-2:123456789012:my-sqs-queue。ライフサイクルフックを作成するには、それが必要です。

  3. IAM サービスロールを作成して、Amazon EC2 Auto Scaling に Amazon SQS 通知ターゲットへのアクセス権を付与します。

    SQS キューへ Amazon EC2 Auto Scaling のアクセス権を付与するには

    1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

    2. 左側のナビゲーションペインで、[Roles] を選択します。

    3. [ロールの作成] を選択します。

    4. [Select trusted entity] (信頼されたエンティティの選択) で、[AWS のサービス] を選択します。

    5. ユースケースでは、[他の AWS サービスのユースケース] で [EC2 Auto Scaling]、[EC2 Auto Scaling Notification Access] の順に選択します。

    6. [Next] (次へ) を 2 回選択して、[Name, review, and create] (名前、確認、および作成) ページに進みます。

    7. [Role name] (ロール名) にロールの名前 (my-notification-role など) を入力して、[Create role] (ロールを作成) を選択します。

    8. [Roles (ロール)] ページで作成したロールを選択して、[Summary (概要)] ページを開きます。ロールの [ARN] をメモします。例えば、arn:aws:iam::123456789012:role/my-notification-role です。ライフサイクルフックを作成するには、それが必要です。

  4. これらの指示に従った後、次のステップとして「ライフサイクルフックを追加する (AWS CLI)」に進みます。

Amazon SNS と Amazon SQS の通知メッセージの例

インスタンスが待機状態のときに、Amazon SNSまたはAmazon SQSの通知ターゲットにメッセージが発行されます。メッセージには、次に示す情報が含まれます。

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

  • AccountId — AWS アカウント ID。

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

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

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

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

  • NotificationMetadata — 通知メタデータ。

通知メッセージの例を次に示します。

Service: AWS Auto Scaling Time: 2021-01-19T00:36:26.533Z 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: hook message metadata

テスト通知メッセージの例

最初にライフサイクルフックを追加すると、テスト通知メッセージが通知ターゲットに発行されます。テスト通知メッセージの例を次に示します。

Service: AWS Auto Scaling Time: 2021-01-19T00:35:52.359Z RequestId: 18b2ec17-3e9b-4c15-8024-ff2e8ce8786a Event: autoscaling:TEST_NOTIFICATION AccountId: 123456789012 AutoScalingGroupName: my-asg AutoScalingGroupARN: arn:aws:autoscaling:us-west-2:123456789012:autoScalingGroup:042cba90-ad2f-431c-9b4d-6d9055bcc9fb:autoScalingGroupName/my-asg
注記

Amazon EC2 Auto Scaling から EventBridge に配信されるイベントの例については、Amazon EC2 Auto Scaling イベントリファレンスを参照してください。