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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

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

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

  • ライフサイクルアクションが完了したときに Amazon EC2 Auto Scaling に通知するには、CompleteLifecycleActionAPI コールをスクリプトに追加し、Auto Scaling インスタンスがこの API を呼び出すことを許可するポリシーを使用して IAM ロールを手動で作成する必要があります。起動テンプレートまたは起動設定では、起動時に Amazon EC2 インスタンスにアタッチされる IAM インスタンスプロファイルを使用して、このロールを指定する必要があります。詳細については、「Auto Scaling グループでライフサイクルアクションを完了する」および「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 グループに追加して、インスタンスが待機状態になったときにカスタムアクションを実行できます。希望する開発アプローチに応じてターゲットサービスを選択し、これらのアクションを実行できます。

最初のアプローチでは EventBridge 、Amazon を使用して、目的のアクションを実行する 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 グループを作成したリージョンと同じリージョンに存在する必要があります。

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

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

注記

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

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

- または -

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

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 で入力する必要があります。

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

  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. これらの指示に従った後、次のステップとして「Auto Scaling グループにライフサイクルフックを追加する」に進みます。

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 イベントリファレンス