RDSを停止し続けるLambda

Terraformに以下のように書けば、停止し続けてくれるLambdaをサクッとデプロイできるようにしてます。

module "lambda-rds-keep-stopping" {
  source  = "e-koma/lambda-rds-keep-stopping/aws"
  version = "1.0.0"

  aws_account_id            = "***"
  db_matcher_name           = "sample,test"
  cloudwatch_start_schedule = "cron(0 22 ? * SUN *)"
  cloudwatch_stop_schedule  = "cron(30 22 ? * SUN *)"
}

RDSは停止すると1週間で自動的に起動してしまうため、cron で指定した特定タイミングで一瞬だけ起動させてまた停止する、というよくある仕組みと同じです。

cron時間指定はメンテナンスウィンドウに合わせるのが無難です。
(cloudwatchという名称が気になりますが自分用なので目をつぶってください)

背景

RDSはコストが高いです。例えばリリース前の負荷テストでは、本番相当のRDSを使いながら以下のようなタスクを繰り返すことが多く、コスト懸念が大きくなります。

  1. 2〜3日間本番相当のRDSを使って負荷テストをし、ボトルネックを特定
  2. 数日間、ボトルネックの改善
  3. 再び負荷テストをし、次のボトルネックを特定

2.の期間では、RDSを使わないので停止しておきたいことがあります。1週間以内だったら良いのですが、RDSは1週間経過すると勝手に起動してしまうため、少し期間が空いてしまうとRDSが実は勝手に起動していました、みたいなことになってしまい、余計なコストを支払うことになります。

自分用にTerraform moduleを作ってたのですが、最近、カヤックさんが RDSを1週間停止し続ける仕組み という記事を書いていたため、自分も同じ仕組みを昔作ったことがあったので紹介しようと思いました。

仕組み

Lambdaが特定のタイミングで一瞬だけRDSを起動させてまた停止する、というよくある仕組みと同じです。停止対象は以下のとおり。

  1. autostopタグがtrueの場合、停止対象
  2. sample や test という名称が付与されているクラスタ全部が停止対象 (db_matcher_nameで指定可能)

2つめの仕様は、パラメータにstressなどを指定しておけば、stress-hogehogeみたいな名称のクラスターを一括で停止できるようにしています。名称でパッと見て判断できるのが個人的には地味に嬉しいんですよ。

自分は長らくAuroraしか使っていないので、Cluster単位での制御になります。

使ってくれる人がいると良いな。
では Happy Cost Optimization !!


Tagged in: