2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SSMオートメーション+EventBridgeでRDSの自動停止(タグで指定)

Last updated at Posted at 2025-11-25

本記事はBIPROGY / ユニアデックス社内AWSコミュニティ「BIPROGY AWS Ambassador」の定期投稿企画第10回目の記事です。
他の定期投稿企画の記事は、#BIPROGY_AWS_Ambassadorタグ または Organizationページをご覧ください。

はじめに

みなさんはRDS(Amazon Relational Database Service)を利用されていますか?
RDSは、AWSが提供するマネージド型のリレーショナルデータベースサービスです。データベースの運用管理やパッチの適用などのインフラ管理はAWSに任せることができるため、ユーザーはアプリケーション開発に専念することができます。

しかし、便利なRDSにも注意すべき点があります。RDSは一度停止しても、7日後に勝手に再起動されてしまう仕様になっています。そのため、気づいたら起動しっぱなしになっていて、無駄に料金が発生しているといったことが起こりがちです。
これを防ぐための「RDSを定期的に停止する仕組み」は様々な方法で実現可能です。

今回は、SSMオートメーションとEventBridgeを使って、指定のタグが付与されたRDSを決まった時間に停止する処理を実装してみました。このやり方は、一度仕組みを作ってしまえば、あとは停止したいRDSに指定のタグを付与するだけで、RDS自動停止を簡単に実現できます。仕組みとしては、指定のタグが付与されたRDSを停止するSSMオートメーションドキュメントをEventBridgeで定期実行します。

ここからは、SSMオートメーションドキュメントの作成・動作確認、EventBridgeルールに割り当てるIAMロールの作成、EventBridgeルールの作成の順で、実装方法について説明していきます。

本記事のやり方だと、RDSが停止後7日経過で自動起動してから、EventBridgeでSSMオートメーションドキュメントが実行されるまでの期間は、RDSが起動状態となってしまうため、その点はご注意ください。

SSMオートメーションドキュメントの作成

ここからは実装方法について説明していきます。
まずは、指定のタグが付与されたRDSを停止するドキュメントを作成していきます。

マネジメントコンソール上のSystem Managerのページにアクセスし、左メニューの変更管理ツール配下の「自動化」からSSMオートメーションのページに行きます。
画像.png

右上の「オートメーションの実行」からrunbook(ドキュメント)のページに行きます。
画像 (1).png

ドキュメントのページには、「AWS-StopRdsInstance」という「インスタンスIDを指定してRDSを停止するドキュメント」がすでに用意されています。

画像 (3).png
しかし、今回はRDSをタグで指定したいので、タグを指定してRDSを停止するドキュメントを新たに作っていきます。
ドキュメントを新たに作成するには、右上の「ドキュメントの作成」をクリックします。

ドキュメント作成画面に遷移するので、ここでドキュメントを作成していきます。
画像 (4).png
まずはドキュメントに名前を付けます。
画面左上の「NewRunbook」の右にある編集アイコンから名前の編集が可能です。
今回は、ドキュメント名を「StopRdsInstanceByTag」とします。

次にドキュメントの中身を作成します。
画面左上の「デザイン | コード」でコードの方を選択すると、画面左にエディタが表示されます。
画像 (5).png
エディタに元々記載されているコードを削除してから、以下のコード(YAML形式)を貼り付けます。

description: StopRdsInstanceByTag
schemaVersion: '0.3'
assumeRole: '{{ AutomationAssumeRole }}'
parameters:
  TagKey:
    type: String
    description: タグのキー
  TagValue:
    type: String
    description: タグの値
  AutomationAssumeRole:
    type: String
    description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
    default: ''
mainSteps:
  - name: StopRdsInstance
    action: aws:executeAwsApi
    isEnd: true
    inputs:
      Service: ssm
      Api: StartAutomationExecution
      DocumentName: AWS-StopRdsInstance
      TargetParameterName: InstanceId
      Targets:
        - Key: tag:{{ TagKey }}
          Values:
            - '{{ TagValue }}'

このコードでは、以下の処理を行います。

  1. 入力パラメータとしてタグのキー(TagKey)と値(TagValue)を受け取る
  2. tag:TagKey=TagValue に一致するRDSインスタンスを検索する
  3. 2で検索したインスタンスに対して「AWS-StopRdsInstance」を実行する

つまり、このコードを実行することで、入力パラメータとして与えたタグのキー&値をもつRDSを停止することが可能です。

エディタにコードを貼り付けた後は、画面右上の「ランブックを作成」をクリックし、ドキュメントを保存します。
これでドキュメントの作成は完了です。

作成したドキュメントを手動で実行する(動作確認)

試しに、作成したドキュメントを手動で実行してみます。
まずは事前に、自動停止を試す用のRDSを準備し、タグを付与します。
今回、タグのキーは「auto_stop」、値は「true」に設定しました。
画像 (6).png

RDSの準備ができたら、先ほど作成したドキュメント「StopRdsInstanceByTag」のページを開きます。
画像 (7).png

画面右上の「オートメーションを実行する」をクリックします。
画像 (8).png

次に実行時のパラメータ等の設定をします。
「シンプルな実行」をチェックし、入力パラメータでTagKeyに「auto_stop」、TagValueに「true」を入力します。(AutomationAssumeRoleは何も選択しない)
画像 (9).png
画面下までスクロールし、右下にある「実行」をクリックしてドキュメントを実行します。

このあと、タグを付与したRDSを確認して停止状態になっていれば問題ないです。
これでSSMオートメーションドキュメントの準備は完了になります。

IAMロールの作成

EventBridgeルール作成の前に、ルールに割り当てるIAMロール(EventBridgeから対象のssmオートメーションを実行するために必要なロール)を事前に作成しておきます。

コンソール上でIAMロールのページを開き、「ロールを作成」をクリックします。
画像 (10).png

信頼されたエンティティタイプで「カスタム信頼ポリシー」を選択します。
画像 (11).png

「カスタム信頼ポリシー」のエディタに以下を貼り付けます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "events.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

その後、画面を下までスクロールし、「次へ」をクリックします。

次に許可設定をします。
AWS管理ポリシーである「AmazonSSMAutomationRole」と「ResourceGroupsandTagEditorReadOnlyAccess」にチェックを入れ、「次へ」をクリックします。
画像 (12).png

次にロールに名前を付けます。
今回は「StopRDSDailyRole」としました。
画像 (13).png
その後、画面を下までスクロールし、「ロールの作成」をクリックします。

最後に、作成したロールにカスタマーインラインポリシーをアタッチします。
作成したロール「StopRDSDailyRole」のページを開き、許可タブの「許可を追加」から「インラインポリシーを作成」をクリックします。
画像 (15).png

ポリシーエディタを開きます。(「ビジュアル|JSON」のJSONをクリックする)
画像 (16).png
エディタに以下のポリシーを貼り付けます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBInstances",
                "rds:StopDBInstance"
            ],
            "Resource": "*"
        }
    ]
}

画面下までスクロールし、「次へ」をクリックします

最後にカスタマーインラインポリシーに名前を付けます。
今回はポリシー名を「StopRDSPolicy」としました。
画像 (17).png
その後、「ポリシーの作成」をクリックします。

これでIAMロールの作成は完了です。

EventBridgeルールの作成

最後にEventBridgeルールを作成します。

EventBridgeルールのページで「ルール作成」の右にある「▲」をクリックし、表示された「スケジュールされたルールを作成」をクリックします。
画像 (19).png

初めに、ルールに名前を付けます。
今回は名前を「StopRDSDaily」としました。
画像 (20).png
名前を入力したら「次へ」をクリックします。

誤って「EventBridge Schedulerで続行」をクリックしないようにする

次にルールを実行するスケジュールを作成します。
スケジュールパターンは、「特定の時刻(毎月~)に実行されるきめ細かいスケジュール」を選択します。
RDSを自動停止するスケジュールのCron式を入力し、「次へ」をクリックします。
画像 (21).png

上の画像ではCron式を日次設定にしていますが、この場合、RDSが停止後7日経過で自動起動した際に、毎回24時間弱はRDSが起動状態となります。RDSが自動起動してから停止するまでの時間を短くしたい場合は、実行スケジュールの間隔を短くする必要があります。

次に、ターゲット(イベントを送信する先のリソース)を選択します。
「ターゲットを選択」で「Systems Manager オートメーション」を
「ドキュメント」で「StopRdsInstanceByTag」を選択します。
「自動化パラメータを設定」では、TagKeyを「auto_stop」、TagValueを「true」とします。
「実行ロール」では、「既存のロールを使用」を選択後、「ロール名」に先ほど作成した「StopRDSDailyRole」を選択し、「次へ」をクリックします。
画像 (22).png
画像 (23).png

「タグを設定」では、何も設定せずに「次へ」をクリックします。
「レビューと作成」の画面では、画面下までスクロールし、「ルールの作成」をクリックします。
これで、EventBridgeルールの作成が完了です。

あとは、定期的に停止したいRDSにタグ(キーは「auto_stop」、値は「true」)を付与するだけです。
画像 (6).png
停止したくないときは、タグの値をfalseなどとしておけばOKです。

おわりに

今回はRDSをタグで指定して自動停止する仕組みを実装してみました。
RDSを利用している方、これから利用する予定の方は是非お試しください。
また今回はRDSの停止だけですが、実行するssmオートメーション、EventBridgeルールに割り当てるIAMロールを修正すれば、RDSの自動起動、EC2の自動停止・起動も実装可能です。

We Are Hiring!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?