ライフサイクルフックの通知ターゲットの設定 - Amazon EC2 Auto Scaling (日本語)

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

ライフサイクルフックを Auto Scaling グループに追加して、インスタンスが待機状態になったときにカスタムアクションを実行できます。希望する開発アプローチに応じて、さまざまな Amazon Web Services を使用してこれらのアクションを実行するように通知ターゲットを設定できます。

最初のアプローチでは、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 では、対象となるサービスのオプションが増え、サーバーレス アーキテクチャを使用してイベントを処理しやすくなりました。

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

起動するときにユーザー データ スクリプトまたは cloud-init directives でインスタンスの設定をしている場合は、ライフサイクルアクションが発生したときに通知を受け取る必要はありません。

重要

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

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

EventBridge を使用してライフサイクルアクションが発生したときに、Lambda 関数を呼び出すことができます。ライフサイクルアクションが発生したときに発行される EventBridge イベントについては、Auto Scaling イベントを参照してください。起動イベントを理解し、CloudWatch Logs のログに書き出すシンプルな Lambda 関数の作成方法を示す入門チュートリアルスタイルのガイドについては、チュートリアル:Lambda 関数を呼び出すライフサイクルフックの設定を参照してください。

Lambda 関数を EventBridge ルールのターゲットとして使用するには

  1. [Lambda コンソール] を使用して Lambda 関数を作成し、Amazon リソースネーム (ARN) を書き留めておきます。例えば、 。arn:aws:lambda:region:123456789012:function:my-functionEventBridge ターゲットを作成するには ARN が必要です。

    詳細については、[AWS Lambdaデベロッパーガイド] の [Lambda の開始方法] を参照してください。

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

    注記

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

    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. ライフサイクルアクションが発生したとき、次の [put-targets] コマンドを使用して Lambda 関数を呼び出すターゲットを作成します。

    aws events put-targets --rule my-rule --targets Id=1,Arn=arn:aws:lambda:region:123456789012:function:my-function
  4. 次の [追加の許可] のコマンドを使用して、Lambda 関数を呼び出すためのアクセス許可をルールに付与します。このコマンドは、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
  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. ナビゲーションペインで [ロール]、[ロールの作成] の順に選択します。

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

    4. [このロールを使用するサービスを選択] で、リストから [EC2 Auto Scaling] を選択します。

    5. [ユースケースの選択] で、[EC2 Auto Scaling Notification Access (EC2 Auto Scaling 通知アクセス)]、[Next:Permissions (次のステップ: アクセス許可)] の順に選択します。

    6. [Next:Tags (次へ: タグ)] を選択します。オプションで、タグをキーバリュー ペアとしてアタッチして、メタデータをロールに追加できます。続いて、[Next: Review (次へ: レビュー)] を選択します。

    7. [Review (レビュー)] ページで、ロールの名前 (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:region: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. ナビゲーションペインで [ロール]、[ロールの作成] の順に選択します。

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

    4. [このロールを使用するサービスを選択] で、リストから [EC2 Auto Scaling] を選択します。

    5. [ユースケースの選択] で、[EC2 Auto Scaling Notification Access (EC2 Auto Scaling 通知アクセス)]、[Next:Permissions (次のステップ: アクセス許可)] の順に選択します。

    6. [Next:Tags (次へ: タグ)] を選択します。オプションで、タグをキーバリュー ペアとしてアタッチして、メタデータをロールに追加できます。続いて、[Next: Review (次へ: レビュー)] を選択します。

    7. [Review (レビュー)] ページで、ロールの名前 (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 - Amazon Web Services アカウント 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 に配信されるイベントの例については、Auto Scaling イベントを参照してください。