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

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

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

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

すべてが正しく設定されると、このチュートリアルの最後に、インスタンスの起動時に 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. [次へ] をクリックします。

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

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

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

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

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

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

  5. [アクセス権限の追加] で、作成したポリシー (LogAutoScalingEvent-policy) と名前の付いたポリシーを選択しますAWSLambdaBasicExecutionRole[次へ] を選択します。

    注記

    AWSLambdaBasicExecutionRoleポリシーには、関数がログにログを書き込むために必要な権限があります。 CloudWatch

  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. [既存のロール] には-role を選択します。LogAutoScalingEvent

  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 関数に関連するイベントがログログストリームに表示されることを確認できます。

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

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

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

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

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

  3. ルールの作成‭ を選択します。

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

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

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

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

    4. 次へ をクリックします。

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

    1. [イベントソース] には、[AWS イベント] または [ 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. [次へ] をクリックします。

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

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

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

    3. [機能] では、を選択します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. (オプション)[通知メタデータ] を空にします。渡すイベントデータには、Lambda EventBridge 関数を呼び出すために必要な情報がすべて含まれています。

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

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

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

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

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

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

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

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

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

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

  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 コンソールのルールページを開きます

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

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

  4. [削除] をクリックします。

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

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

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

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

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

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

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

  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) を使用してインスタンス自体からアクションを呼び出す方法を示すチュートリアルについては、「チュートリアル: インスタンスメタデータを使用してターゲットライフサイクル状態を取得するようにユーザーデータを設定する」を参照してください。