EC2 自動化によるコスト削減:AWS Lambda と EventBridge の活用方法
2025年2月7日

開発用の EC2 インスタンスを一日中起動したままにしていませんか?
必要なときだけ起動して利用できれば、コストを節約できるだけでなく、管理も楽になるはずです。しかし、思った以上に多くのチームがこの問題に直面しています。
私たちのチームも同じでした。
週末や残業のない夜でも、EC2 インスタンスは稼働し続けていました。しかし、実際に使用していない時間にも課金が発生し、不要な運用コストが積み重なり、リソース管理の非効率性が増していました。
この問題を解決するために、私たちはAWS LambdaとAmazon EventBridge。 を活用し、自動化を導入しました。その結果、EC2 コストを 45% 削減し、管理の負担も大幅に軽減することができました。
どのようにしてこの成果を実現したのか?
これから、その方法を詳しくご紹介します。
自動化を検討することになった理由
1か月間の AWS コストを分析した結果、開発用 EC2 インスタンスの不要なコストがかなり発生していることが判明しました。
開発環境の EC2 インスタンスが 1日平均 14時間以上アイドル状態のままになっていた
週末にも未使用のインスタンスが起動し続け、不要な課金が発生していた
開発者が手動で EC2 を起動・停止するのは手間がかかり、非効率的だった
これらの問題を解決するために、自動化された EC2 スケジューリングシステムを導入することを決定しました。
自動化を実装すれば、必要なときだけインスタンスを起動し、未使用時には自動で停止することで、コスト削減と運用効率の向上を同時に実現できると考えました。
EC2 自動化のためのアーキテクチャ
EC2 インスタンスを効率的に管理するために、AWS のサーバーレスサービスを活用した自動化システムを構築しました。これにより、必要なときだけインスタンスを起動し、未使用時には自動で停止するようにしました。
主な構成要素と役割
主な構成要素 | 役割 |
|---|---|
Amazon EventBridge | EC2 インスタンスの起動・停止**スケジューリングを担当 |
AWS Lambda | EventBridge で発生したイベントを受け取り、EC2 インスタンスを制御するロジックを実行 |
IAM | Lambda が EC2 を制御できるように必要な権限を管理 |
自動化の流れ
出勤時間 (午前10時) → EventBridge がトリガーされ、EC2 インスタンスが自動で起動
業務終了時間 (午後7時) → EventBridge が再度トリガーされ、EC2 インスタンスが自動で停止
例外処理 → 特定の開発者が残業や週末にも EC2 を維持したい場合は、
EC2インスタンスに「Override」タグを追加し、自動停止を防止
Lambda がタグを確認し、Override 設定がある場合は停止を実行しない
このアーキテクチャにより、手作業なしで EC2 を自動管理できるだけでなく、不必要なコストを削減しつつ、柔軟な例外処理を提供できます。
EC2 自動化の実装プロセス
EC2 インスタンスを自動的に起動・停止するために、まず自動化対象のインスタンスを識別できるタグを設定する必要があります。
1. EC2 タグの設定
自動化対象の EC2 インスタンスに特定のタグを追加し、対象と非対象を区別します。以下の AWS CLI コマンドを実行すると、指定した EC2 インスタンスに Scheduled=True のタグを追加できます。
aws ec2 create-tags --resources i-0abcd1234efgh5678 --tags Key=Scheduled,Value=Trueこのタグが設定されたインスタンスのみが自動化スケジュールに従って起動・停止されます。つまり、タグがないインスタンスは自動化規則から除外され、手動で管理できます。また、特定のインスタンスを自動終了対象から除外するためには、Override=True のタグを追加できます。これにより、Lambda はインスタンスを停止する前にこのタグを確認し、終了をスキップすることができます。
2. IAM ポリシーの設定
AWS Lambda が EC2 インスタンスを制御するためには、適切な IAM ポリシーを設定する必要があります。これにより、Lambda にインスタンスの起動や停止など、必要な操作を実行するための権限を付与します。
以下は、Lambda に EC2 インスタンスの管理権限を付与するための基本的な IAM ポリシー例です。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:StartInstances", "ec2:StopInstances" ], "Resource": "*" } ]}このポリシーにより、Lambda が指定された EC2 インスタンスを開始・停止できるようになります。
IAM ロール (Role) の作成と Lambda の接続
IAM コンソール (AWS IAM) で新しいロールを作成
Lambda で使用するサービスロールを選択
上記の IAM ポリシーを追加して、そのロールに接続
作成した IAM ロールを Lambda 関数に割り当て
このように設定することで、Lambda が不必要な EC2 インスタンスを制御できないように制限でき、セキュリティを維持しながら自動化作業を実行することができます。
3. Lambda 関数の実装
Lambdaで EC2 インスタンスを自動的に起動・停止する関数を作成します。この関数は、Scheduled=True タグが付けられたインスタンスのみを対象として実行されます。
Lambda コード (EC2の起動と停止をサポート)
以下のコードは、EC2インスタンスを起動または停止する Lambda 関数です。前回のコードでは start_instances のみを処理しましたが、今回は stop_instances 機能も追加しました。
import boto3import logginglogger = logging.getLogger()logger.setLevel(logging.INFO)def get_instances(): ec2 = boto3.resource(&class=class="type-content-mono code-token-string">"type-content-mono code-token-comment"</span>>#39;ec2')</span> return [ instance.id for instance in ec2.instances.all() if any(tag.get(&class=class="type-content-mono code-token-string">"type-content-mono code-token-comment"</span>>#39;Key') == 'Scheduled' and tag.get('Value') == 'True' </span> for tag in instance.tags or []) ]def lambda_handler(event, context): try: ec2_client = boto3.client(&class=class="type-content-mono code-token-string">"type-content-mono code-token-comment"</span>>#39;ec2', region_name='ap-northeast-2')</span> instances = get_instances() if not instances: logger.info("No scheduled instances found") return ec2_client.start_instances(InstanceIds=instances) logger.info(f"Successfully started instances: {instances}") except Exception as e: logger.error(f"Failed to start instances: {str(e)}") raise Lambda 関数の主な機能
1. `get_instances()`
EC2リソースを確認し、
Scheduled=Trueタグが付けられたインスタンスを見つけて返します。
2. `lambda_handler(event, context)`
event['action'] の値に基づいて、EC2インスタンスを開始または停止します。
"start" の場合、start_instances() を実行
"stop" の場合、stop_instances() を実行
不正な action 値が渡された場合、警告メッセージを表示します。
EventBridge と Lambda の連携方法
EC2 起動イベント (朝10時トリガー)
EventBridge は
{"action": "start"}イベントを Lambda に渡して、EC2 インスタンスの起動をトリガーします。EC2 停止イベント (夜7時トリガー)
EventBridge は
{"action": "stop"}イベントを Lambda に渡して、EC2 インスタンスの停止をトリガーします。
このように設定することで、業務時間に合わせて EC2 が自動的に起動し、終了時間には自動的に停止する完全な自動化が実現できます。 🚀
4. EventBridge スケジュール設定
Amazon EventBridge を使用して、EC2 の起動・停止時間を予約することができます。これにより、開発者が手動でインスタンスを起動・停止する手間を減らし、運用コストを削減することができます。
EventBridge ルール作成 (EC2 の起動・停止スケジュール設定)
以下の AWS CLI コマンドを使用して、EventBridge で EC2 インスタンスを自動的に起動・停止するルールを設定します。
"type-content-mono code-token-comment"># Start EC2 at 10:00 AM (UTC: 1:00 AM)</span>aws events put-rule \ --name ec2-start-schedule \ --schedule-expression "cron(0 1 ? * MON-FRI *)""type-content-mono code-token-comment"># Stop EC2 at 7:00 PM (UTC: 10:00 AM)</span>aws events put-rule \ --name ec2-stop-schedule \ --schedule-expression "cron(0 10 ? * MON-FRI *)"これで、EC2 は業務時間に合わせて自動的に起動し、退勤後には自動的に停止するため、不要なコストを削減することができます! 🚀
運用中に遭遇した問題と解決方法
自動化を導入した後、いくつかの問題に直面しましたが、それらの解決方法は以下の通りです。
問題 | 方法 |
|---|---|
公休日に EC2 を起動しないようにしたい | DynamoDB に公休日データを保存し、Lambda でチェック |
緊急時に EC2 を起動しなければならない | Override タグを追加し、自動停止を例外処理 |
起動順序を調整したい | Step Functions を活用し、インスタンス依存性の管理 |
このように、運用中に発生する問題にも問題なく対応することができました。
自動化後の効果
EC2 スケジューリング自動化を導入した結果、以下のような顕著な改善効果を得ることができました。
✅ AWS コスト45%削減
アイドル状態だった EC2 インスタンスを自動的に終了することで、不要なコストを削減することができました。
✅ 業務時間外の EC2 自動終了
残業や週末でも不要なインスタンスが起動していることがなくなりました。
必要なときだけ実行するように設定したことで、効率的なリソース活用が可能になりました。
✅ 運用負担軽減
開発者がもはや EC2 を手動で管理する必要がなくなり、手間が減少しました。
IAM ポリシーとタグベースの管理により、セキュリティと管理の効率も向上しました。
何よりも、自動化を導入した後は夜も心配せず、安心して退勤できるようになりました。😊
追加で考慮する拡張機能
現在の EC2 スケジューリング自動化システムをさらに発展させるために、以下の機能を追加で検討しています。
✅ Slack 通知連携
EC2 インスタンスが自動的に起動または停止したときに、チームチャネルに通知を送信
開発者が現在のインスタンスの状態をリアルタイムで確認できるようになり、運用の透明性が向上
✅ CloudWatch との連携による自動スケーリング
EC2 インスタンスの CPU 使用率、ネットワークトラフィックなどの指標を分析
使用量が少ないときは自動で終了、逆に多いときは追加インスタンスを実行する自動スケーリングを適用
✅ ストレポートの自動化
毎月、EC2 コストレポートを自動で生成し、メールで送信
コスト削減効果を追跡し、さらに最適化の機会を特定
これらの拡張機能を導入することで、さらにスマートなインフラ運用が可能になり、チーム全体の運用効率とコスト削減効果を最大化できると期待しています。 🚀
終わりに
AWS Lambda と EventBridge を活用した EC2 自動化方法を紹介しました。私たちのチームはこれにより、コスト削減と運用負担の軽減という二つの成果を得ることができました。もし皆さんも似たような悩みを抱えているのであれば、ぜひこの自動化を直接適用してみてください。効率的なリソース管理とコスト最適化を通じて、より良い運用環境を作り上げていけることでしょう。😊
参考資料