AWS

StepFunctionsでRDSを7日後停止

2024年12月26日

StepFunctions


AWSで検証用や一時的なRDSインスタンスを使った後に停止しても、7日後に自動的に再起動される仕組みになっています。

今回は、AWS Step Functions を使って、RDSが7日後に自動起動した後に自動停止する仕組みを構築してみました。

Lambdaを使わず、Step Functions単体で完結するのがポイントです。


1.構成

今回は以下のような構成で進めていきます。

<実現したいこと>
・RDSが7日後に自動起動した後に、自動で停止させたい
・コストのかかる検証環境を自動的にシャットダウンしたい
・コードを書かずにAWSのGUI上で完結したい


<使用するサービス>

AWS Step Functions 処理フロー(停止〜再開)を管理
Amazon RDS         管理対象のデータベース(MySQL等)
AWS SDK 統合機能      Step FunctionsからRDS APIを呼び出す

<処理の全体像>

今回のステートマシンは次の流れで動作します。

①RDSインスタンスを停止
②停止状態になるまで待機・確認
③7日間(604,800秒)待機
④RDSインスタンスを再起動

これにより、たとえばテスト環境のDBを夜間や週末に止めたり、
特定期間後に自動で停止させたりできます。





2.コード

以下は、実際に使ったStep FunctionsのJSON定義ファイルの例です。
マネジメントコンソールの「コードエディタ」に貼り付けて利用できます。


<JSONコード>

{
  "Comment": "State machine to manage MySQL instance",
  "StartAt": "RDSインスタンスを停止",
  "States": {
    "RDSインスタンスを停止": {
      "Type": "Task",
      "Next": "Wait - 7日間",
      "Resource": "arn:aws:states:::aws-sdk:rds:stopDBInstance",
      "Parameters": {
        "DbInstanceIdentifier": "データベース名"
      },
      "ResultPath": null
    },
    "Wait - 7日間": {
      "Type": "Wait",
      "Seconds": 604800,
      "Next": "DescribeDBInstances"
    },
    "DescribeDBInstances": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:rds:describeDBInstances",
      "Parameters": {
        "DbInstanceIdentifier": "データベース名"
      },
      "Next": "Choice - インスタンスステータス",
      "ResultSelector": {
        "Db_identifier.$": "$.DbInstances[0].DbInstanceIdentifier",  
        "status.$": "$.DbInstances[0].DbInstanceStatus"
      }
    },
    "Choice - インスタンスステータス": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.status",
          "StringMatches": "stopping",
          "Next": "RDSインスタンスを一時的に起動"
        }
      ],
      "Default": "Success - インスタンスが別の要因で起動または削除されました"
    },
    "RDSインスタンスを一時的に起動": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:rds:startDBInstance",
      "Parameters": {
        "DbInstanceIdentifier": "データベース名"
      },
      "ResultPath": null,
      "Next": "Wait - 10分"
    },
    "Wait - 10分": {
      "Type": "Wait",
      "Seconds": 600,
      "Next": "RDSインスタンスを停止"
    },
    "Success - インスタンスが別の要因で起動または削除されました": {
      "Type": "Succeed"
    }
  }
}


ポイントは、"Wait" ステートで7日(604,800秒)待機させている部分です。



<実行の流れ>

記事内のスクリーンショットのように、Step Functionsを実行すると
各ステップが「緑色のチェックマーク」で順に実行されます。

①停止タスク実行
②状態確認
③7日待機
④起動タスク完了


このように 可視化されたワークフロー で、エラー箇所も一目で分かります。


画像にあるように、成功と出ています。

これで、RDSの7日後の自動起動後の自動停止は実現できました。





3.まとめ

AWSを日常運用していると、こうした「自動停止の仕組み」が地味に役立ちます。

Step Functionsを使えば、シンプルかつ視覚的に管理できるので、コスト削減と効率化の両立にぴったりの構成です。


<Lmbdaを使わないメリット>

一般的に、RDSの自動停止は「CloudWatch + Lambda」で構成されますが、Step Functionsだけで実現すれば以下のメリットがあります。

・コード不要(ノーコード運用)
・GUIでステップ確認可能
・異常時のハンドリングが簡単
・運用コストが低い

AWSコンソール上で「一目で分かる自動化」を作れるのは、学習にも実践にも最適です。



<利用シーン>
・検証、開発用の一時DBを自動停止
・深夜、休日にコストを節約したい環境
・長期間放置を防止したいRDSインスタンス

Step Functionsは無料枠も広く、AWS学習者にもおすすめです。





スポンサーリンク

-AWS

Copyright© さねたにブログ , 2025 All Rights Reserved.