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

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

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

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

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

Prerequisites

このチュートリアルを開始する前に、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. [Name (名前)] に LogAutoScalingEvent-policy と入力します。[ポリシーの作成] を選択します。

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

ロールを作成するには

  1. ナビゲーションペインで [ロール]、[ロールの作成] の順に選択します。

  2. [Choose a use case (ユースケースの選択)] セクションで、リストから[Lambda]、[Next: Permissions (次へ: アクセス許可)] の順に選択します。

  3. [許可ポリシーのアタッチ] で、[ログ オートスケーリング イベント ポリシー] および [AWSLambdaBasicExecutionRole] を選択します。

  4. [次へ:タグ] を選択し、[次へ:レビュー] を選択します。

  5. [Review (確認)] ページで、[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. [関数の作成] を選択します。関数のコードと設定に戻ります。

  8. LogAutoScalingEvent関数をコンソールで開いたまま、エディタの[関数コード] で、次のサンプルコードを 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. [デプロイ] を選択します。

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

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

コンソールを使用してルールを作成するには

  1. [EventBridge コンソール] を開きます。

  2. ナビゲーションペインで、[ルール]、[ルールの作成] の順に選択します。

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

  4. [Define pattern (パターンの定義)] で、[Event pattern (イベントパターン)] を選択します。

  5. [イベントマッチングパターン] で、[カスタムパターン] を選択します。

  6. ルールでは、イベントパターンを使用してイベントを選択し、ターゲットに振り分けます。次のパターンを、[Event pattern (イベントパターン)] ボックス内にコピーします。

    { "source": [ "aws.autoscaling" ], "detail-type": [ "EC2 Instance-launch Lifecycle Action" ] }
  7. イベントパターンを保存するには、[保存] を選択します。

  8. [Select event bus (イベントバスを選択)] で、[AWS default event bus (AWSデフォルトイベントバス)] を選択します。

  9. [ターゲット] で、[Lambda 関数] を選択します。

  10. [関数] で、[ログ オート スケーリング イベント] を選択します。[Create] を選択します。

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

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

ライフサイクルフックを追加するには

  1. Amazon EC2 Auto Scaling コンソール (https://console.aws.amazon.com/ec2autoscaling/) を開きます。

  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 コンソール (https://console.aws.amazon.com/ec2autoscaling/) を開きます。

  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 コンソール (https://console.aws.amazon.com/ec2autoscaling/) を開きます。

  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. [ Actions] で、[Delete ] を選択します。

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

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

Lambda 関数を削除するには

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

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

  3. [ Actions] で、[Delete ] を選択します。

  4. [関数の削除] ダイアログボックスで、[削除] を選択します。

ロググループを削除するには

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

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

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

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

実行ロールを削除するには

  1. IAM コンソールの [Roles (ロール)] ページを開きます。

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

  3. [ロールの削除] を選択します。

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

IAM ポリシーを削除するには

  1. IAM コンソールの [Policies (ポリシー)] ページを開きます。

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

  3. [ポリシーの削除] を選択します。

  4. [ポリシーの削除] ダイアログボックスで、[はい、削除します] を選択します。