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

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

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

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

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

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

前提条件

このチュートリアルを開始する前に、Auto Scaling グループがまだない場合は、作成します。Auto Scaling グループを作成するには、Amazon EC2 コンソールの Auto Scaling グループページを開き、[Create Auto Scaling group] (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. [Name] (名前) に「LogAutoScalingEvent-policy」と入力します。[Create policy] を選択します。

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

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

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

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

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

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

    注記

    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. [デフォルト実行ロールを変更する]を選択し、[実行ロール] で、[既存のロールを使用する] を選択します。

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

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

  7. [Create function] (関数の作成) を選択します。関数のコードと設定に戻ります。

  8. コンソールで LogAutoScalingEvent 関数を開いたまま、エディタの [Function code] (関数コード) で、index.js という名前のファイルに以下のサンプルコードを貼り付けます。

    var aws = require("aws-sdk"); exports.handler = (event, context, callback) => { console.log('LogAutoScalingEvent'); console.log('Received event:', JSON.stringify(event, null, 2)); var autoscaling = new aws.AutoScaling({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; autoscaling.completeLifecycleAction(params, function(err, data) { if (err) { console.log(err, err.stack); // an error occurred response = { statusCode: 500, body: JSON.stringify('ERROR'), }; } else { console.log(data); // successful response response = { statusCode: 200, body: JSON.stringify('SUCCESS'), }; } }); return response; };

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

  9. [Deploy‬] (デプロイ) をクリックします。

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

Lambda 関数を実行する EventBridge ルールの作成

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

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

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

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

    1. [Name] (名前) に「LogAutoScalingEvent-rule」と入力します。

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

    3. [Rule type] (ルールタイプ) では、[Rule with an event pattern] (イベントパターンを持つルール) を選択します。

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

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

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

    2. [Event pattern] (イベントパターン) の場合は、次のいずれかを実行します。

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

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

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

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

      5. デフォルトでは、このルールはリージョン内のすべての Auto Scaling グループと一致します。ルールを特定の Auto Scaling グループに一致させるには、[Specific group name (特定のグループ名)] を選択して 1 つ以上の 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] (作成) をクリックします。

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

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

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

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

    [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:次のステップ

このチュートリアルを完了したので、終了時のライフサイクルフックを作成してみましょう。Auto Scaling グループに含まれるインスタンスが終了すると、イベントは EventBridge に送信されます。インスタンスの終了時に出力されるイベントについては、EC2 インスタンス終了のライフサイクルアクションを参照してください。

ステップ 7: クリーンアップ

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

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

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

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

  4. [Actions] (アクション) で、[Delete] (削除) を選択します。

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

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

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

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

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

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

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

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

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

  3. [Actions] (アクション) で、[Delete] (削除) を選択します。

  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 コンソールの [Policies (ポリシー)] ページを開きます。

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

  3. [Actions] (アクション) で、[Delete] (削除) を選択します。

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