EC2 Auto Scaling のライフサイクルフック通知が Lambda 関数へ直接ルーティング可能になっていたので試してみた
はじめに
テクニカルサポートの 片方 です。
本ブログの執筆時より少し前に、EC2 Auto Scaling のライフサイクルフック通知を Lambda 関数に直接ルーティングできるようになりました。
従来は 「SNS → Lambda 関数」、「SQS → Lambda 関数」 や 「EventBridge → Lambda 関数」 といったサービスなどを経由する必要がありました。今回ご紹介する直接ルーティング方法であれば、ライフサイクルイベントの処理フローをより簡潔に構成できます。
ライフサイクルフックの Lambda 通知ターゲット
ライフサイクルフック通知を AWS Lambda 関数に直接ルーティングできるようになりました。詳細については、「Route notifications to AWS Lambda directly」を参照してください。
やってみた
実装の流れとしては、以下の通りです。
- EC2 Auto Scaling グループの作成
- Lambda 関数の作成 ~ 設定
以下のドキュメントを参考に実装します。
EC2 Auto Scaling グループの作成
基本的には、デフォルトの値で作成ください。
本検証では、EC2 Auto Scaling グループ名を 「Test-Scaling」 で作成しました。
EC2 Auto Scaling グループに関連付けられたサービスリンクロール(AWSServiceRoleForAutoScaling)の ARN が後ほど必要になるため、メモしておきます。

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)
※ 適宜修正してください。
作成した Lambda 関数の リソースベースポリシーを設定します。
[設定] ⇒ [アクセス権限] と選択後、下部へスクロールします。

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

ポリシーステートメントセクションで、以下のアクセス許可を構成します。
- AWS アカウントを選択
- ステートメント ID : 一意のステートメント ID を入力 (例: AllowInvokeByAutoScaling)
- Principal : 先ほどメモした、呼び出し元のサービスにリンクされたロールの ARN を入力
- アクション : lambda:InvokeFunction を選択

ライフサイクルフックの設定
対象の EC2 Auto Scaling グループにライフサイクルフックを追加します。
AWS マネジメントコンソールから手動で設定することも可能ですが、今回は CloudShell を利用して AWS CLI コマンドで実装しました。
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
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
※ 自身の環境に合わせて適宜修正の上でご利用ください。

これで準備は完了です。お疲れ様でした!
検証してみた
EC2 Auto Scaling グループに属する EC2 インスタンスを削除したり、希望容量を増やして新しいインスタンスを起動したりします。
それでは、作成した Lambda 関数の動作を確認します。

問題なく 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

期待通りの挙動で成功です!
まとめ
今回、EC2 Auto Scaling のライフサイクルフック通知を SNS / SQS / EventBridge を使わずに Lambda 関数へ直接ルーティングしてみました。非常に簡単なのでお試しください。
本ブログが誰かの参考になれば幸いです。
参考資料
- ドキュメント履歴 - Amazon EC2 Auto Scaling
- ライフサイクルフックを Auto Scaling グループに追加するための準備 - Amazon EC2 Auto Scaling
- チュートリアル: 最初の Auto Scaling グループを作成する - Amazon EC2 Auto Scaling
- AutoScaling - Boto3 1.42.4 documentation
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。








