[AWS] RDSの自動起動を抑制するには

RDSは停止させても7日が経過すると自動起動されてしまう。

テスト用にインスタンスを作成して役割を終えたのだけど、近い将来また使うかもしれないので削除せずにキープしておきたいということがある。スナップショットを取って削除して、また必要になればリストアすれば良いのだけど、それだけの作業も面倒に感じてしまう。

そんな場合に課金節約のためにインスタンスを一旦停止させるのだけど、7日が経過すると勝手に再起動されてしまう。それに気付かず放っておくと、使っていないのに課金されてしまう。

どうにかしてRDSの自動起動を抑制できないかと調べていたら、Amazon EventBridgeを使った事例を見つけたので、それに倣って動作を確認してみたい。

まずは料金

Amazon EventBridgeの料金表は以下ページにある。

料金 – Amazon EventBridge | AWS
https://aws.amazon.com/jp/eventbridge/pricing/

スケジューラー

  • 月間無料起動回数1400万回
  • それ以後は月間スケジュール起動回数100万回あたり1.00USD

今回試すのは7日周期のスケジュールでRDSの停止コマンドを発行するというもの。月間起動回数は4-5回というところなので無料枠の範囲だ。

ついでにRDSの料金表も確認しておく。自分はdb.t3.microをテスト用に作成することが多いので、もしRDSの自動起動に気づかず放置したらいくら課金されるか試算しよう。

料金 – Amazon RDS for MySQL | AWS
https://aws.amazon.com/jp/rds/mysql/pricing/

RDS for MySQL (オンデマンド)

  • db.t3.micro (シングルAZデプロイ) 0.017USD
  • 1か月換算 (24h x 30d = 720h) 12.24USD/mo

無料のサービスを使って無駄なRDS課金を回避できるなら最高だ。それでは具体的に設定をしていこう。

IAMの設定

まずはRDSの停止を実行するための、IAMポリシーとロールをAWSコンソールで設定する。

IAM>Policies

  • [Create policy]
  • Policy editor
    • RDS
    • Actions allowed: Write/StopDBInstance
    • Resources > Add Arn to restrict access
      • Specify ARNs
      • Resource in: This account
      • Resource region: us-west-2
      • Resource db instance name: any db instance name(*)
      • ARN: Any resource (db:*)
      • [Add ARSs]
  • [Next]
  • Policy details
  • Policy name: RDS-StopDBInstance
  • Description: Policy to suppress automatic startup of RDS instances for testing.
  • [Create policy]

IAM>Roles

  • [Create role]
  • Trusted entity type: Custom trust policy
    Create a custom trust policy to enable others to perform actions in this account.
  • Custom trust policy
  • [Next]
  • Add permissions
  • Policy name: RDS-StopDBInstance
  • [Next]
  • Role name: RDS-StopDBInstance
  • Description: Role to suppress automatic startup of RDS instances for testing.
  • [Create role]

Amazon EventBridgeのスケジュール作成

IAMの準備が出来たら、Amazon EventBridgeのスケジュールを作成する。

Amazon EventBridge

  • Get started: EventBridge Schedule
  • [Create schedule]
  • Schedule name and description
    • Schedule name: rds-auto-stop
    • Description: Suppress automatic startup of RDS instances for testing.
    • Schedule group: default
  • Schedule pattern
    • Occurrence: Recurring schedule
    • Schedule type: Rate-based schedule
    • Rate expression: rate(169 hours)
      ↑7日+1h(猶予)ごとに実行
    • Flexible time window: Off
  • Timeframe
    • Time zone: (UTC-07:00) America/Los_Angeles
    • Start date and time – optional: 2023/10/01 13:30
      ↑RDSの停止日時に応じて設定
    • End date and time – optional:
  • [Next]
  • Target detail
    • Target API: All APIs
    • All AWS service>Amazon RDS>StopDBInstance
    • Input:
  • [Next]
  • Schedule state
    • Enable schedule: Enable
  • Action after schedule completion
    • Action after schedule completion: NONE
  • Retry policy and dead-letter queue (DLQ)
    • Retry policy: Not Retry
    • Dead-letter queue (DLQ): None
  • Encryption
    • Customize encryption settings (advanced): OFF
  • Permissions
    • Execution role: Use existing role
    • Select an existing role: RDS-StopDBInstance
  • [Next]
  • 確認画面
  • [Create schedule]

Start date and timeで指定した日時になったら、Target detailで識別子を指定したRDSが停止された。7日間が経過するとRDSが自動起動されるが、このスケジュールは169時間(7日と1時間)が経過する度に繰り返し実行されるので、RDSの自動起動→スケジュールによる自動停止→RDSの自動起動、の繰り返しとなる。

参考サイト

RDS、停止したままにしたすぎる問題。 – DENET 技術ブログ
https://blog.denet.co.jp/rds_stop_plz/
1月 6, 2023

停止したのに自動復旧で損してる? 「Amazon RDS」のインスタンス管理を「AWS Systems Manager Automation」で自動化する方法:AWSチートシート – @IT
https://atmarkit.itmedia.co.jp/ait/articles/2305/19/news174.html
2023年05月25日