EC2 Auto Scaling のライフサイクルフック通知が Lambda 関数へ直接ルーティング可能になっていたので試してみた

EC2 Auto Scaling のライフサイクルフック通知が Lambda 関数へ直接ルーティング可能になっていたので試してみた

2025.12.08

はじめに

テクニカルサポートの 片方 です。
本ブログの執筆時より少し前に、EC2 Auto Scaling のライフサイクルフック通知を Lambda 関数に直接ルーティングできるようになりました。
従来は 「SNS → Lambda 関数」、「SQS → Lambda 関数」 や 「EventBridge → Lambda 関数」 といったサービスなどを経由する必要がありました。今回ご紹介する直接ルーティング方法であれば、ライフサイクルイベントの処理フローをより簡潔に構成できます。

https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/DocumentHistory.html

ライフサイクルフックの Lambda 通知ターゲット
ライフサイクルフック通知を AWS Lambda 関数に直接ルーティングできるようになりました。詳細については、「Route notifications to AWS Lambda directly」を参照してください。

やってみた

実装の流れとしては、以下の通りです。

  1. EC2 Auto Scaling グループの作成
  2. Lambda 関数の作成 ~ 設定

以下のドキュメントを参考に実装します。
https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/prepare-for-lifecycle-notifications.html#lambda-notification

EC2 Auto Scaling グループの作成

基本的には、デフォルトの値で作成ください。

https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/create-your-first-auto-scaling-group.html

本検証では、EC2 Auto Scaling グループ名を 「Test-Scaling」 で作成しました。
EC2 Auto Scaling グループに関連付けられたサービスリンクロール(AWSServiceRoleForAutoScaling)の ARN が後ほど必要になるため、メモしておきます。

01

Lambda 関数の作成~設定

実行ロール

※ 信頼ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
アタッチするポリシー例
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Sid": "AllowCompleteLifecycleAction",
            "Effect": "Allow",
            "Action": [
                "autoscaling:CompleteLifecycleAction",
                "autoscaling:RecordLifecycleActionHeartbeat"
            ],
            "Resource": "*"
        }
    ]
}

※ 適宜修正してください。

Lambda 関数

今回は Python 3.14 で実装しました。

Lambda 関数例
import json
import boto3

autoscaling = boto3.client("autoscaling")

def lambda_handler(event, context):
    print("Received event:")
    print(json.dumps(event))

    if event.get("Event") == "autoscaling:TEST_NOTIFICATION":
        print("Test notification received. No action required.")
        return {"status": "ok"}

    instance_id = event.get("EC2InstanceId")
    group_name = event.get("AutoScalingGroupName")
    hook_name = event.get("LifecycleHookName")
    token = event.get("LifecycleActionToken")
    transition = event.get("LifecycleTransition")

    print(f"Instance ID: {instance_id}")
    print(f"Lifecycle Transition: {transition}")

    if transition == "autoscaling:EC2_INSTANCE_LAUNCHING":
        print(f"Custom launch task for instance {instance_id}")
    elif transition == "autoscaling:EC2_INSTANCE_TERMINATING":
        print(f"Custom termination task for instance {instance_id}")
    else:
        print("Unknown transition type:", transition)

    resp = autoscaling.complete_lifecycle_action(
        LifecycleHookName=hook_name,
        AutoScalingGroupName=group_name,
        LifecycleActionToken=token,
        LifecycleActionResult="CONTINUE"
    )

    print("Lifecycle action completed:", resp)

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/autoscaling.html
※ 適宜修正してください。

作成した Lambda 関数の リソースベースポリシーを設定します。
[設定] ⇒ [アクセス権限] と選択後、下部へスクロールします。

02

[アクセス権限を追加] をクリックします。

03

ポリシーステートメントセクションで、以下のアクセス許可を構成します。

  • AWS アカウントを選択
  • ステートメント ID : 一意のステートメント ID を入力 (例: AllowInvokeByAutoScaling)
  • Principal : 先ほどメモした、呼び出し元のサービスにリンクされたロールの ARN を入力
  • アクション : lambda:InvokeFunction を選択

04

ライフサイクルフックの設定

対象の EC2 Auto Scaling グループにライフサイクルフックを追加します。
AWS マネジメントコンソールから手動で設定することも可能ですが、今回は CloudShell を利用して AWS CLI コマンドで実装しました。

ライフサイクルフック(Launch)
aws autoscaling put-lifecycle-hook \
  --lifecycle-hook-name TestScaling-Launch-Hook \
  --auto-scaling-group-name Test-Scaling \
  --lifecycle-transition autoscaling:EC2_INSTANCE_LAUNCHING \
  --notification-target-arn arn:aws:lambda:ap-northeast-1:123456789012:function:my-lifecycle-lambda \
  --default-result CONTINUE
ライフサイクルフック(Terminate)
aws autoscaling put-lifecycle-hook \
  --lifecycle-hook-name TestScaling-Terminate-Hook \
  --auto-scaling-group-name Test-Scaling \
  --lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING \
  --notification-target-arn arn:aws:lambda:ap-northeast-1:123456789012:function:my-lifecycle-lambda \
  --default-result CONTINUE

※ 自身の環境に合わせて適宜修正の上でご利用ください。

05

これで準備は完了です。お疲れ様でした!

検証してみた

EC2 Auto Scaling グループに属する EC2 インスタンスを削除したり、希望容量を増やして新しいインスタンスを起動したりします。
それでは、作成した Lambda 関数の動作を確認します。

06

問題なく Lambda 関数を通知ターゲットとして使用できていますね。
CloudWatch ロググループより、対象のログイベントも確認してみます。

ログイベント (マスクします)
INIT_START Runtime Version: python:3.14
START RequestId: ********-****-****-****-************ Version: $LATEST
Received event:
{
    "AccountId": "************",
    "RequestId": "********-****-****-****-************",
    "AutoScalingGroupARN": "arn:aws:autoscaling:ap-northeast-1:************:autoScalingGroup:********************:autoScalingGroupName/Test-Scaling",
    "AutoScalingGroupName": "Test-Scaling",
    "Service": "AWS Auto Scaling",
    "Event": "autoscaling:TEST_NOTIFICATION",
    "Time": "2025-12-07T07:38:10.603Z"
}

Test notification received. No action required.
END RequestId: ********-****-****-****-************
REPORT RequestId: ********-****-****-****-************  Duration: 2.39 ms  Memory Used: 87 MB

07

期待通りの挙動で成功です!

まとめ

今回、EC2 Auto Scaling のライフサイクルフック通知を SNS / SQS / EventBridge を使わずに Lambda 関数へ直接ルーティングしてみました。非常に簡単なのでお試しください。
本ブログが誰かの参考になれば幸いです。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

この記事をシェアする

FacebookHatena blogX

関連記事