チュートリアル:Lambda 関数を呼び出すライフサイクルフックの設定 - Amazon EC2 Auto Scaling

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

チュートリアル:Lambda 関数を呼び出すライフサイクルフックの設定

この演習では、フィルターパターンが含まれる Amazon EventBridge ルールを作成します。このルールに一致すると、AWS Lambda 関数がルールのターゲットとして呼び出されます。使用するフィルターパターンとサンプル関数コードを提供します。

すべてが正しく設定されると、このチュートリアルの最後に、インスタンスの起動時に Lambda 関数はカスタムアクションを実行します。カスタムアクションは、Lambda 関数に関連付けられている CloudWatch Logs ログ ストリーミングにイベントをログするだけです。

Lambda 関数もコールバックを実行して、このアクションが成功するとインスタンスのライフサイクルを続行しますが、アクションが失敗するとインスタンスは起動を中止し、終了させます。

次の図は、Lambda 関数を使用してカスタムアクションを実行する場合のスケールアウトイベントのフローをまとめたものです。インスタンスが起動した後、タイムアウトまたは Amazon EC2 Auto Scaling が続行のシグナルを受信することによってライフサイクルフックが完了するまで、インスタンスのライフサイクルは一時停止されます。

Lambda 関数を使用してカスタムアクションを実行する場合のスケールアウトイベントのフロー。

前提条件

このチュートリアルを開始する前に、Auto Scaling グループがまだない場合は、作成します。Auto Scaling グループを作成するには、Amazon EC2 コンソールで、Auto Scaling グループのページを開き、[Auto Scaling グループの作成] を選択します。

ステップ 1: ライフサイクルアクションを完了するための許可を持つ IAM ロールを作成する

Lambda 関数を作成する前に、実行ロールと許可ポリシーを作成して、Lambda がライフサイクルフックを完了できるようにする必要があります。

ポリシーを作成するには
  1. IAM コンソールの [ポリシーページ] を開き、[ポリシーの作成] を選択します。

  2. [JSON] タブを選択します。

  3. [ポリシードキュメント] ボックスに、次のポリシードキュメントを貼り付け、[イタリック体] のテキストはアカウント番号と Auto Scaling グループの名前に置き換えます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:CompleteLifecycleAction" ], "Resource": "arn:aws:autoscaling:*:123456789012:autoScalingGroup:*:autoScalingGroupName/my-asg" } ] }
  4. [Next] を選択します。

  5. [ポリシー名] に「LogAutoScalingEvent-policy」と入力します。[Create policy] を選択します。

ポリシーの作成が完了したら、それを使用するロールを作成できます。

ロールを作成するには
  1. 左側のナビゲーションペインで、[Roles] を選択します。

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

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

  4. ユースケースに [Lambda] を選択してから、[Next] (次へ) を選択します。

  5. [Add permissions] (許可を追加) で、作成したポリシー ([LogAutoScalingEvent-policy]) と、[AWSLambdaBasicExecutionRole] という名前のポリシーを選択します。[次へ] を選択します。

    注記

    AWSLambdaBasicExecutionRole ポリシーには、ログを CloudWatch Logs に書き込むために関数が必要とするアクセス許可があります。

  6. [Name, review, and create] (名前、確認、および作成) ページで、[Role name] (ロール名) に LogAutoScalingEvent-role を入力し、[Create role] (ロールを作成) を選択します。

ステップ 2: Lambda 関数を作成する

イベントの対象となる Lambda 関数を作成します。Node.js で記述したサンプルの Lambda 関数は、一致するイベントが Amazon EC2 Auto Scaling から出力されたときに EventBridge から呼び出されます。

Lambda 関数を作成するには
  1. Lambda コンソールで [Functions (関数)] ページを開きます。

  2. [関数の作成] を選択し、[一から作成] を選択します。

  3. [基本的な情報] の [関数名] に「LogAutoScalingEvent」と入力します。

  4. [ランタイム][Node.js 18.x] を選択します。

  5. スクロールして [デフォルトの実行ロールの変更]を選択し、[実行ロール] で、[既存のロールを使用] を選択します。

  6. 既存の[ロール] で、[ログ オート スケーリングイベント ロール] を選択します。

  7. 他はデフォルト値のままにしておきます。

  8. [機能の作成]を選択します。関数のコードと設定に戻ります。

  9. コンソールで LogAutoScalingEvent 関数を開いたまま、エディタの [コードソース] で、index.mjs  という名前のファイルに次のサンプルコードを貼り付けます。

    import { AutoScalingClient, CompleteLifecycleActionCommand } from "@aws-sdk/client-auto-scaling"; export const handler = async(event) => { console.log('LogAutoScalingEvent'); console.log('Received event:', JSON.stringify(event, null, 2)); var autoscaling = new AutoScalingClient({ region: event.region }); var eventDetail = event.detail; var params = { AutoScalingGroupName: eventDetail['AutoScalingGroupName'], /* required */ LifecycleActionResult: 'CONTINUE', /* required */ LifecycleHookName: eventDetail['LifecycleHookName'], /* required */ InstanceId: eventDetail['EC2InstanceId'], LifecycleActionToken: eventDetail['LifecycleActionToken'] }; var response; const command = new CompleteLifecycleActionCommand(params); try { var data = await autoscaling.send(command); console.log(data); // successful response response = { statusCode: 200, body: JSON.stringify('SUCCESS'), }; } catch (err) { console.log(err, err.stack); // an error occurred response = { statusCode: 500, body: JSON.stringify('ERROR'), }; } return response; };

    このコードは単にイベントをログに記録するので、このチュートリアルの最後に、この Lambda 関数に関連付けられている CloudWatch Logsのログ ストリーミングにイベントが表示されます。

  10. [デプロイ] を選択します。

ステップ 3: EventBridge ルールを作成する

Lambda 関数を実行する EventBridge ルールの作成 EventBridge の使用に関する詳細については、「Auto Scaling イベントの処理に EventBridge を使用する」を参照してください。

コンソールを使用してルールを作成するには
  1. [EventBridge コンソール] を開きます。

  2. ナビゲーションペインで ルール] を選択します。

  3. [Create rule] (ルールの作成) を選択します。

  4. [Define rule detail] (詳細の定義) で、次の操作を行います。

    1. [名前]LogAutoScalingEvent-rule と入力します。

    2. [イベントバス] として、[デフォルト] を選択します。アカウント内の AWS のサービスがイベントを生成すると、イベントは常にアカウントのデフォルトイベントバスに送られます。

    3. ルールタイプ では、イベントパターンを持つルール] を選択します。

    4. [Next] を選択します。

  5. [Build event pattern] (イベントパターンの作成) で、次の操作を行います。

    1. [Event source] (イベントソース) で、[AWS events or EventBridge partner events] ( イベントまたは EventBridge パートナーイベント) を選択します。

    2. [イベントパターン] までスクロールして、次の操作を行います。

      1. イベントソースAWS のサービス を選択します。

      2. [AWS のサービス] には、[Auto Scaling] を選択します。

      3. [イベントタイプ] で、[インスタンスの起動と終了] を選択します。

      4. デフォルトで、ルールはすべてのスケールインイベントまたはスケールアウトイベントに一致します。スケールアウトイベントが発生し、ライフサイクルフックに基づいてインスタンスが待機状態になったときに通知するルールを作成するには、[Specific instance event(s)] (特定のインスタンスイベント) を選択してから、[EC2 Instance-launch Lifecycle Action] (EC2 インスタンス起動ライフサイクルアクション) を選択します。

      5. デフォルトでは、このルールはリージョン内のすべての Auto Scaling グループと一致します。ルールを特定の Auto Scaling グループに一致させるには、[特定のグループ名] を選択してグループを選択します。

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

  6. [Select target(s)] (ターゲットを選択) で、以下の操作を行います。

    1. [Target types] (ターゲットタイプ) には、[AWS のサービス] を選択します。

    2. [Select a target] (ターゲットを選択) では、[Lambda function] (Lambda 関数) を選択します。

    3. [Function] (機能) には、[LogAutoScalingEvent] を選択します。

    4. [次へ] を 2 回選択します。

  7. [Review and create] (確認して作成) ページで、[Create rule] (ルールの作成) を選択します。

ステップ 4: ライフサイクルフックを追加する

このセクションでは、Lambda が起動時にインスタンスで関数を実行できるように、ライフサイクルフックを追加します。

ライフサイクルフックを追加するには
  1. Amazon EC2 コンソールで Auto Scaling グループのページを開きます。

  2. Auto Scaling グループの横にあるチェックボックスを選択します。ページの下部にスプリットペインが開きます。

  3. 下部のペインで、[Instance management (インスタンス管理)] タブの [Lifecycle hooks (ライフサイクルフック)] で、[Create lifecycle hook (ライフサイクルフックを作成)] を選択します。

  4. スケールアウト (インスタンスが起動) のライフサイクルフックを定義するには、以下を実行してください。

    1. [ライフサイクルフック名] で、LogAutoScalingEvent-hookを入力します。

    2. [Lifecycle transition (ライフサイクルの移行)] で、[Instance launch (インスタンスの起動)] を選択します。

    3. [ハートビートのタイムアウト] で、Lambda 関数からのコールバックを待機する秒数として300を入力します。

    4. [デフォルトの結果] で、[中止] を選択します。つまり、Lambda 関数からコールバックを受け取らずにフックがタイムアウトすると、Auto Scaling グループは新しいインスタンスを終了します。

    5. (オプション)[通知メタデータ] を空にします。EventBridge に渡すイベントデータには、Lambda 関数を呼び出すために必要な情報がすべて含まれています。

  5. [Create] (作成) を選択します。

ステップ 5: イベントをテストし、検証する

イベントをテストするには、Auto Scaling グループで希望するキャパシティを 1 増やして Auto Scaling グループを更新します。Lambda 関数は、希望するキャパシティを増やしてから数秒以内に呼び出されます。

Auto Scaling グループのサイズを増やすには
  1. Amazon EC2 コンソールで Auto Scaling グループのページを開きます。

  2. Auto Scaling グループの横にあるチェックボックスを選択すると、下部のペインに詳細が表示され、上部のペインの一番上の行が表示されます。

  3. 下部のペインの [詳細] タブで、[グループの詳細] 、[編集] を順に選択します。

  4. [Desired capacity (希望するキャパシティ)] の場合は、現在の値を 1 ずつ増やします。

  5. [Update] (更新) を選択します。インスタンスの起動中は、上部ペインの [Status (ステータス)] 列に [Updating capacity (キャパシティの更新)] というステータスが表示されます。

希望するキャパシティに増やしたら、Lambda 関数が呼び出されたことを確認できます。

Lambda 関数からの出力を表示するには
  1. Amazon CloudWatch コンソールの [[Log groups (ロググループ)] ページ] を開きます。

  2. Lambda 関数 (/aws/lambda/LogAutoScalingEvent) のロググループの名前を選択します。

  3. ライフサイクルアクションの関数によって提供されるデータを表示するログのストリーミング名を選択します。

次に、スケーリング アクティビティの説明から、インスタンスが正常に起動したことを確認できます。

スケーリングを表示するには
  1. [Auto Scaling グループ] ページに戻り、グループを選択します。

  2. [アクティビティ] タブの [アクティビティ履歴] では、[ステータス] 列に、Auto Scaling グループがインスタンスを正常に起動したかどうかが表示されます。

    • アクションが成功した場合、スケーリング アクティビティのステータスは「成功」になります。

    • 失敗した場合、数分待ってから、ステータスが「キャンセル済み」のスケーリング アクティビティが表示され、「インスタンスはユーザーのライフサイクルアクションを完了できませんでした:トークンE85EB647-4FE0-4909-B341-A6C42の例は中止されました:ライフサイクルアクションは中止された結果で完了しました」というステータスメッセージが表示されます。

Auto Scaling グループのサイズを縮小するには

このテスト用に起動した追加のインスタンスが必要なくなった場合は、[詳細] タブを開き、[Desired capacity (希望するキャパシティ)] を 1 減らすことができます。

ステップ 6: クリーンアップする

このチュートリアル専用に作成したリソースで作業が完了したら、次の手順に従ってリソースを削除します。

ライフサイクルフックを削除するには
  1. Amazon EC2 コンソールで Auto Scaling グループのページを開きます。

  2. Auto Scaling グループの横にあるチェックボックスを選択します。

  3. [Instance management (インスタンス管理)] タブの [Lifecycle hooks (ライフサイクルフック)] で、[lifecycle hook (ライフサイクルフック)] を選択します。(LogAutoScalingEvent-hook)

  4. [アクション][削除] の順に選択します。

  5. 確認のために、もう一度 [削除] を選択します。

Amazon EventBridge ルールを削除するには
  1. Amazon EventBridge コンソールで [Rules] (ルール) ページを開きます。

  2. [Event bus (イベントバス)] で、ルール (Default) に関連付けられているイベントバスを選択します。

  3. LogAutoScalingEvent-rule ルールの横にあるチェックボックスをオンにします。

  4. [削除] を選択します。

  5. 確認を求められたら、ルールの名前を入力し、[Delete] (削除) を選択します。

サンプル関数の使用が終了したら、削除します。関数のログを保存するためのロググループや、作成した実行ロールや許可ポリシーも削除できます。

Lambda 関数を削除するには
  1. Lambda コンソールで [Functions (関数)] ページを開きます。

  2. 関数 (LogAutoScalingEvent) を選択します。

  3. [アクション][削除] の順に選択します。

  4. 確認を求められたら、delete を入力して指定した関数の削除を確認し、[Delete] (削除) を選択します。

ロググループを削除するには
  1. Amazon CloudWatch コンソールの [Log groups (ロググループ)] ページを開きます。

  2. 関数のロググループ (/aws/lambda/LogAutoScalingEvent) を選択します。

  3. [アクション]、[ロググループの削除] の順にクリックします。

  4. ロググループの削除ダイアログボックスで、[削除] をクリックします。

実行ロールを削除するには
  1. IAM コンソールの [Roles (ロール)] ページを開きます。

  2. 関数のロール (LogAutoScalingEvent-role) を選択します。

  3. [削除] を選択します。

  4. 確認を求められたら、ロールの名前を入力し、[Delete] (削除) を選択します。

IAM ポリシーを削除するには
  1. IAM コンソールのポリシーページを開きます。

  2. 作成したポリシーを選択します。(LogAutoScalingEvent-policy)

  3. [アクション][削除] の順に選択します。

  4. 確認を求められたら、ポリシーの名前を入力し、[Delete] (削除) を選択します。

以下の関連トピックは、Auto Scaling グループのインスタンスに発生するイベントに基づいて EventBridge ルールを作成する際に役立ちます。

インスタンスメタデータサービス (IMDS) を使用してインスタンス自体からアクションを呼び出す方法を示すチュートリアルについては、「チュートリアル: データスクリプトとインスタンスメタデータを使用してライフサイクル状態を取得する」を参照してください。