ガバメントクラウドのコスト最適化術──EventBridge×Step FunctionsでEC2/RDS/Fargateを夜間自動停止してみた

益子 竜与志
益子 竜与志
XThreads
最終更新日:2026年03月30日公開日:2026年03月30日

ガバメントクラウドの費用の大半を占めるEC2・RDS・Fargateを、夜間・休日に自動停止するだけで大幅なコスト削減が実現できます。Amazon EventBridgeとAWS Step Functionsを組み合わせたタグベース管理の仕組みを、実装手順を交えながら詳しく解説します。

ガバメントクラウドにおけるコスト課題

ガバメントクラウドを利用する府省・地方公共団体から最も多く挙がる課題の1つが「クラウドコストの管理」です。ガバメントクラウドでは、利用クラウド料をPJMOが提示する範囲内に収めるよう事業者がモニタリングすることが求められています。特に費用が大きいのはAmazon EC2(仮想サーバー)・Amazon RDS(マネージドデータベース)・AWS Fargate(コンテナ実行環境)です。これらを夜間(例:20:00〜8:00)と休日(土日・祝日)に停止するだけで、稼働時間を約40〜50%削減できます。月額100万円の環境であれば、40〜50万円の削減が見込めます。

夜間・休日停止によるコスト削減効果

解決策:EventBridge × Step Functions による自動停止・起動

AWS公式が推奨する夜間自動停止・起動の仕組みは、Amazon EventBridgeとAWS Step Functionsを組み合わせた構成です。タグベース管理でEC2・ECS on Fargate・RDSをまとめて管理できます。Step Functionsを介することでシステム固有の前処理・後処理(ヘルスチェック等)を組み込め、Step Functionsのコンソールから手動でいつでも緊急起動できる点も利点です。

EventBridge×Step Functionsアーキテクチャ図

アーキテクチャ全体像

  1. Amazon EventBridge(スケジューラー):cron式で停止・起動のトリガーを定義(例:毎日20:00に停止、毎日8:00に起動)
  2. AWS Step Functions(ステートマシン):停止・起動の処理フローを定義。Lambda関数の呼び出し・待機・エラーハンドリングを管理
  3. AWS Lambda(実行処理):実際にEC2・RDS・Fargateを停止・起動するAPIコールを実行
  4. タグ:リソースのタグを参照して停止対象を動的に決定

タグ設計

自動停止・起動の対象リソースを識別するためのタグ設計が重要です。AutoStop: enabled(自動停止の対象)・AutoStopSchedule: business-hours(スケジュール種別)・Environment: dev(環境種別)を推奨します。本番環境(Environment: prod)には絶対にAutoStopタグを付与しないようにします。

タグベースのリソース管理設計

Lambda 実装例(EC2停止)

import boto3

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name='ap-northeast-1')
    
    response = ec2.describe_instances(
        Filters=[
            {'Name': 'tag:AutoStop', 'Values': ['enabled']},
            {'Name': 'tag:Environment', 'Values': ['dev', 'stg']},
            {'Name': 'instance-state-name', 'Values': ['running']}
        ]
    )
    
    instance_ids = []
    for reservation in response['Reservations']:
        for instance in reservation['Instances']:
            instance_ids.append(instance['InstanceId'])
    
    if instance_ids:
        ec2.stop_instances(InstanceIds=instance_ids)
        print(f"停止したEC2インスタンス: {instance_ids}")
    
    return {"stopped_instances": instance_ids}

EventBridge スケジュールの設定(JST注意)

EventBridgeのcron式はUTC基準です。日本標準時(JST、UTC+9)に注意して設定してください。

# 平日20:00 JST(UTC 11:00)に停止
cron(0 11 ? * MON-FRI *)

# 平日08:00 JST(UTC 23:00前日)に起動
cron(0 23 ? * SUN-THU *)

RDS・Fargateへの対応

RDSの停止:boto3のstop_db_instanceで停止できますが、RDSは停止から7日後に自動起動する仕様があるため注意が必要です。

rds = boto3.client('rds')
rds.stop_db_instance(DBInstanceIdentifier='my-dev-db')

ECS on Fargateの停止:タスク数を0にすることで実質的な停止が可能です。

ecs = boto3.client('ecs')
ecs.update_service(cluster='my-cluster', service='my-service', desiredCount=0)

コスト可視化の実践

AWS Cost ExplorerでコストトレンドをWS・月次で確認し、AWS Budgetsで月次コストの予算を設定してアラートを受信します。Cost Allocation Tagsでシステムごと・環境ごとのコストをタグで分類して可視化します。ガバメントクラウドでは利用クラウド料の予実管理が義務化されており、GCASガイドの「クラウド利用料の予実管理と最適化(AWS編)」を参照して適切なコスト管理体制を構築してください。

注意点とアンチパターン

  • 本番環境への誤適用防止:タグポリシーとSCPを組み合わせて、本番環境へのAutoStopタグ付与を禁止する
  • データ整合性の確保:RDS停止前にアプリケーションのセッションが残っていないか確認
  • 依存関係の考慮:複数システムが連携している場合、依存関係を考慮した停止順序・起動順序を定義する
  • 監視の維持:停止中も監視ツール(CloudWatch等)は稼働させ、起動できなかった場合にアラートが届く仕組みを用意する

まとめ

ガバメントクラウドにおけるコスト最適化は、単なる経費節減ではなく、適切なクラウド利用という観点からも重要な取り組みです。EventBridge × Step Functionsによる自動停止・起動は、開発・ステージング環境のコストを大幅に削減する最も効果的な手法の1つです。今回紹介した仕組みはIaCで管理し、ガバメントクラウドの基本原則「インフラの変更はすべてIaCで」に従い、安全で再現性の高い運用を実現しましょう。

IT/DXプロジェクト推進するPMO・コンサル人材を提供しています

AI利活用×高生産性のリソースで、あらゆるIT/DXプロジェクトを一気通貫支援します

詳しく見る →
AI駆動型ITコンサルティング
Careerバナーconsultingバナー