ライフサイクルフックを Auto Scaling グループに追加するための準備
Auto Scaling グループにライフサイクルフックを追加する前に、ユーザーデータスクリプト、または通知ターゲットまたはが正しく設定されていることを確認するようにしてください。
-
インスタンスの起動中にユーザーデータスクリプトを実行してインスタンスでカスタムアクションを使用するために、通知ターゲットを設定する必要はありません。ただし、ユーザーデータスクリプトを指定する起動テンプレートまたは起動設定を作成し、Auto Scaling グループに関連付けておく必要があります。ユーザーデータスクリプトの詳細については、「Amazon EC2 ユーザーガイド」の「起動時に Linux インスタンスでコマンドを実行する」を参照してください。
-
ライフサイクルアクションの完了時に Amazon EC2 Auto Scaling に通知を行うには、スクリプトに CompleteLifecycleAction API コールを追加し、Auto Scaling インスタンスがこの API を呼び出すことを許可するポリシーを持つ IAM ロールを手動で作成する必要があります。起動テンプレートまたは起動設定では、起動時に Amazon EC2 インスタンスにアタッチされる IAM インスタンスプロファイルを使用して、このロールを指定する必要があります。詳細については、「Auto Scaling グループでライフサイクルアクションを完了する」および「Amazon EC2 インスタンスで実行中のアプリケーション用の IAM ロール」を参照してください。
-
ライフサイクルアクション完了時に 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 Lambda に直接通知を送信するライフサイクルフックを作成するには、AWS CLI、AWS CloudFormation、または SDK を使用してライフサイクルフックを追加します。
ライフサイクル通知の通知ターゲットを設定する
ライフサイクルフックを Auto Scaling グループに追加して、インスタンスが待機状態になったときにカスタムアクションを実行できます。希望する開発アプローチに応じてターゲットサービスを選択し、これらのアクションを実行できます。
ライフサイクルフックの通知ターゲットを実装するには、次の 4 つの異なるアプローチがあります。
-
Amazon EventBridge: 通知を受け取り、必要なアクションを実行します。
-
Amazon Simple Notification Service (Amazon SNS): 通知を発行するためのトピックを作成します。クライアントは SNS トピックに登録し、サポートされているプロトコルを使用して公開されたメッセージを受信できます。
-
Amazon Simple Queue Service (Amazon SQS): ポーリングモデルを介してメッセージを交換します。
-
AWS Lambda: 必要なアクションを実行する Lambda 関数を呼び出します。
ベストプラクティスとして、 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 マネジメントコンソールを使用してイベントルールを作成すると、EventBridge に Lambda 関数を呼び出す許可を付与するために必要な IAM アクセス許可がコンソールによって自動的に追加されます。AWS CLI を使用してイベントルールを作成する場合は、この権限を明示的に付与する必要があります。
EventBridge コンソールでイベントルールを作成する方法の詳細については、「Amazon EventBridge ユーザーガイド」の「Creating Amazon EventBridge rules that react to events」を参照してください。
- または -
コンソールユーザー向けの初歩的なチュートリアルについては、「チュートリアル:Lambda 関数を呼び出すライフサイクルフックの設定」を参照してください。このチュートリアルは、起動イベントをリッスンし、CloudWatch Logs のログにそれらを書き込むシンプルな Lambda 関数を作成する方法を説明します。
Lambda 関数を呼び出す EventBridge ルールを作成するには
-
[Lambda コンソール
] を使用して Lambda 関数を作成し、Amazon リソースネーム (ARN) を書き留めておきます。例えば、 arn:aws:lambda:。EventBridge ターゲットを作成するには ARN が必要です。詳細については、[AWS Lambdaデベロッパーガイド] の [Lambda の開始方法] を参照してください。region:123456789012:function:my-function -
インスタンス起動のイベントに一致するルールを作成するには、次の put-rule
コマンドを使用します。 aws events put-rule --namemy-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 を使用する」を参照してください。
-
ルールのターゲットとして使用する Lambda 関数を指定するには、次のput-arget
コマンドを実行します。 aws events put-targets --rulemy-rule--targets Id=1,Arn=arn:aws:lambda:region:123456789012:function:my-function上記のコマンドで、
my-ruleはステップ 2 でルールに指定した名前になり、Arnパラメータの値はステップ 1 で作成した関数の ARN になります。 -
ルールが Lambda 関数を呼び出せるようにする許可を追加するには、以下の Lambda add-permission
コマンドを使用します。このコマンドは、EventBridge サービスのプリンシパル ( events.amazonaws.com) 信頼し、指定のルールに許可を適用します。aws lambda add-permission --function-namemy-function--statement-idmy-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 文字列バージョンです。 -
-
これらの指示に従った後、次のステップとして「Auto Scaling グループにライフサイクル フックを追加する」に進みます。
Amazon SNS を使用した通知の受信
Amazon SNS を使用して、ライフサイクルアクションが発生したときに、通知を受け取るよう、通知ターゲット (SNS トピック) をセットアップできます。次に、Amazon SNS は登録された受信者に通知を送信します。登録が確認されるまで、トピックに対して発行された通知は受信者に送信されません。
Amazon SNS を使用して通知をセットアップするには
-
Amazon SNS トピックを作成するには、[Amazon SNS コンソール
] または次の [トピックの作成 ] のコマンドを使用します。このトピックが、使用している Auto Scaling グループと同じリージョンにあることを確認します。詳細については、「Amazon Simple Notification Service デベロッパーガイド」の「Amazon SNS の使用開始」を参照してください。 aws sns create-topic --namemy-sns-topic -
その Amazon リソースネーム (ARN) をメモします、例えば、
arn:aws:sns:。ライフサイクルフックを作成するには、それが必要です。region:123456789012:my-sns-topic -
IAM サービスロールを作成して、Amazon EC2 Auto Scaling に Amazon SNS 通知ターゲットへのアクセス権を付与します。
SNS トピックへの Amazon EC2 Auto Scaling のアクセス権を付与するには
IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
左側のナビゲーションペインで、[Roles] を選択します。
-
[ロールの作成] を選択してください。
-
[Select trusted entity] (信頼されたエンティティの選択) で、[AWS のサービス] を選択します。
-
ユースケースでは、[他の AWS サービスのユースケース] で [EC2 Auto Scaling]、[EC2 Auto Scaling Notification Access] の順に選択します。
-
[Next] (次へ) を 2 回選択して、[Name, review, and create] (名前、確認、および作成) ページに進みます。
-
[Role name] (ロール名) にロールの名前 (
my-notification-roleなど) を入力して、[Create role] (ロールを作成) を選択します。 -
[Roles (ロール)] ページで作成したロールを選択して、[Summary (概要)] ページを開きます。ロールの [ARN] をメモします。例えば、
arn:aws:iam::。ライフサイクルフックを作成するには、それが必要です。123456789012:role/my-notification-role
-
これらの指示に従った後、次のステップとして「ライフサイクルフックを追加する (AWS CLI)」に進みます。
Amazon SQS を使用した通知の受信
ライフサイクルアクションが発生したときにメッセージを受け取るよう、Amazon SQS を使用して通知ターゲットをセットアップできます。キューコンシューマーは、SQS キューをポーリングしてこれらの通知を処理する必要があります。
重要
FIFO キューはライフサイクルフックとの互換性がありません。
Amazon SQS を使用して通知をセットアップするには
-
[Amazon SQS コンソール
] を使用して、Amazon SQS キューを作成します。キューが,使用している Auto Scaling グループと同じリージョンにあることを確認します。詳細については、「Amazon Simple Queue Service デベロッパーガイド」の「Getting started with Amazon SQS」を参照してください。 -
キューの ARN をメモします。例えば、
arn:aws:sqs:。ライフサイクルフックを作成するには、それが必要です。us-west-2:123456789012:my-sqs-queue -
IAM サービスロールを作成して、Amazon EC2 Auto Scaling に Amazon SQS 通知ターゲットへのアクセス権を付与します。
SQS キューへ Amazon EC2 Auto Scaling のアクセス権を付与するには
IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
左側のナビゲーションペインで、[Roles] を選択します。
-
[ロールの作成] を選択してください。
-
[Select trusted entity] (信頼されたエンティティの選択) で、[AWS のサービス] を選択します。
-
ユースケースでは、[他の AWS サービスのユースケース] で [EC2 Auto Scaling]、[EC2 Auto Scaling Notification Access] の順に選択します。
-
[Next] (次へ) を 2 回選択して、[Name, review, and create] (名前、確認、および作成) ページに進みます。
-
[Role name] (ロール名) にロールの名前 (
my-notification-roleなど) を入力して、[Create role] (ロールを作成) を選択します。 -
[Roles (ロール)] ページで作成したロールを選択して、[Summary (概要)] ページを開きます。ロールの [ARN] をメモします。例えば、
arn:aws:iam::。ライフサイクルフックを作成するには、それが必要です。123456789012:role/my-notification-role
-
これらの指示に従った後、次のステップとして「ライフサイクルフックを追加する (AWS CLI)」に進みます。
通知を AWS Lambda に直接ルーティングする
ライフサイクルアクションが発生したときに通知ターゲットとして Lambda 関数を使用できます。
通知を AWS Lambda に直接ルーティングするには
Lambda コンソールで [Functions (関数)] ページ
を開きます。 -
目的の Lambda 関数を選択します。
新しい Lambda 関数を作成する場合は、「Lambda 関数を作成する」を参照してください。
-
次に [設定] タブと [アクセス許可] を選択します。
-
[Resource-based policy (リソースベースのポリシー)] にスクロールダウンして [アクセス許可の追加] を選択します。リソースベースのポリシーを使用して、関数を呼び出すアクセス許可を、ポリシーで指定されているプリンシパルに付与します。この場合、プリンシパルは Auto Scaling グループに関連付けられている Amazon EC2 Auto Scaling service-linked role です。
-
[Policy statement (ポリシーステートメント)] セクションで、権限を設定します。
-
を選択します。。AWS アカウント
-
Principal (プリンシパル) で、例えば
arn:aws:iam::<aws-account-id>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScalingといった呼び出しサービスにリンクされたロールの ARN を入力します。 -
[Action (アクション)] で、[lambda:InvokeFunction] を選択します。
-
[Statement ID (ステートメント ID)] に
AllowInvokeByAutoScalingといった一意のステートメント ID を入力します。 -
[保存] を選択します。
-
-
これらの指示に従った後、次のステップとして「ライフサイクルフックを追加する (AWS CLI)」に進みます。
通知メッセージの例
このセクションでは、Amazon SNS、Amazon SQS、および AWS Lambda の通知の例を示します。
インスタンスが待機状態のときに、Amazon SNS、Amazon SQS、および AWS Lambda の通知ターゲットにメッセージが発行されます。
メッセージには、次に示す情報が含まれます。
-
Origin— EC2 インスタンスが来る場所。 -
Destination— EC2 インスタンスが向かう場所。 -
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
Origin: EC2
Destination: AutoScalingGroup
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 イベントリファレンスを参照してください。