📌 概要
AWS上で動いているEC2を AWS Lambda と EventBridge で毎晩自動停止する仕組みを作ります。
📌 なぜ作ろうと思ったのか
プライベートの開発で利用しているインスタンスを立ち上げっぱなしにしていたところ、 1週間で約 120ドル(=約18,000円)の請求額となりました 😱
「やばい、これ無駄すぎる...」と思い、夜中の午前3時に全インスタンスを自動で停止することにしました。
📌 手順の全体像
- IAMロールを設定
- Lambda関数を作成
- EventBridge Schedulerで定期実行を設定(毎日3時に実行)
📌 Step 1. IAMロールを作成
Lambda 専用の IAM ロール lambda-ec2-stop-role を新規作成します。
| 項目 | 設定値 |
|---|---|
| サービス | Lambda |
| ロール名 | lambda-ec2-stop-role |
| アタッチするポリシー | AWSLambdaBasicExecutionRole, AmazonEC2FullAccess |
📌 Step 2. Lambda関数を作成
全ec2を停止するLambda関数を作成します。
設定項目
| 項目 | 設定値 |
|---|---|
| サービス名 | AWS Lambda |
| 関数名 | stop-ec2 |
| ランタイム | Python 3.x |
| アーキテクチャ | arm64 |
| 実行ロール | 既存のロールを使用する |
| 既存のロール | lambda-ec2-stop-role |
コードソース
import boto3
def lambda_handler(event, context):
ec2 = boto3.client('ec2', region_name='ap-northeast-1')
instances = ec2.describe_instances(
Filters=[{'Name': 'instance-state-name', 'Values': ['running']}]
)
ids = []
for reservation in instances['Reservations']:
for instance in reservation['Instances']:
ids.append(instance['InstanceId'])
if ids:
ec2.stop_instances(InstanceIds=ids)
print(f"Stopped instances: {ids}")
else:
print("No running instances found.")
return {"statusCode": 200, "body": "EC2 stop process complete"}
📌 Step 3. EventBridge Scheduler で自動実行
Lambda 関数 stop-ec2 を毎日自動で実行するために EventBridge Scheduler でスケジュールを作成します。
| 項目 | 設定内容 |
|---|---|
| スケジュール名 | daily-stop-ec2 |
| 説明 | 毎日EC2を自動停止するスケジュール |
| スケジュールタイプ | 定期的なスケジュール |
| スケジュール方式 | cron ベースのスケジュール |
| cron式 |
cron(0 3 * * ? *)(毎日 午前3時 JST) |
| タイムゾーン | Asia/Tokyo (UTC+09:00) |
| 開始日時 | 2025/10/14 00:00 |
| 終了日時 | 指定なし(無期限) |
| フレックスタイムウィンドウ | オフ |
| ターゲットサービス | AWS Lambda |
| Lambda関数 | stop-ec2 |
| ペイロード | 空欄(不要) |
| スケジュールの状態 | 有効 |
| スケジュール完了後のアクション | なし(削除しない) |
| 再試行ポリシー | 有効(最大24時間再試行) |
| デッドレターキュー(DLQ) | なし |
| 暗号化 | デフォルト(AWS管理キー) |
| アクセス許可ロール | 既存のロールを使用 → lambda-invoke-role
|
📌 まとめ
これで「うっかりEC2つけっぱなし課金」とおさらばできます 🚀
夜中にこっそり動く仕組みを、今日からあなたの環境にも 💪







