本記事は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オートメーションのページに行きます。

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

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

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

まずはドキュメントに名前を付けます。
画面左上の「NewRunbook」の右にある編集アイコンから名前の編集が可能です。
今回は、ドキュメント名を「StopRdsInstanceByTag」とします。
次にドキュメントの中身を作成します。
画面左上の「デザイン | コード」でコードの方を選択すると、画面左にエディタが表示されます。

エディタに元々記載されているコードを削除してから、以下のコード(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 }}'
このコードでは、以下の処理を行います。
- 入力パラメータとしてタグのキー(TagKey)と値(TagValue)を受け取る
- tag:TagKey=TagValue に一致するRDSインスタンスを検索する
- 2で検索したインスタンスに対して「AWS-StopRdsInstance」を実行する
つまり、このコードを実行することで、入力パラメータとして与えたタグのキー&値をもつRDSを停止することが可能です。
エディタにコードを貼り付けた後は、画面右上の「ランブックを作成」をクリックし、ドキュメントを保存します。
これでドキュメントの作成は完了です。
作成したドキュメントを手動で実行する(動作確認)
試しに、作成したドキュメントを手動で実行してみます。
まずは事前に、自動停止を試す用のRDSを準備し、タグを付与します。
今回、タグのキーは「auto_stop」、値は「true」に設定しました。

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

次に実行時のパラメータ等の設定をします。
「シンプルな実行」をチェックし、入力パラメータでTagKeyに「auto_stop」、TagValueに「true」を入力します。(AutomationAssumeRoleは何も選択しない)

画面下までスクロールし、右下にある「実行」をクリックしてドキュメントを実行します。
このあと、タグを付与したRDSを確認して停止状態になっていれば問題ないです。
これでSSMオートメーションドキュメントの準備は完了になります。
IAMロールの作成
EventBridgeルール作成の前に、ルールに割り当てるIAMロール(EventBridgeから対象のssmオートメーションを実行するために必要なロール)を事前に作成しておきます。
コンソール上でIAMロールのページを開き、「ロールを作成」をクリックします。

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

「カスタム信頼ポリシー」のエディタに以下を貼り付けます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
その後、画面を下までスクロールし、「次へ」をクリックします。
次に許可設定をします。
AWS管理ポリシーである「AmazonSSMAutomationRole」と「ResourceGroupsandTagEditorReadOnlyAccess」にチェックを入れ、「次へ」をクリックします。

次にロールに名前を付けます。
今回は「StopRDSDailyRole」としました。

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

ポリシーエディタを開きます。(「ビジュアル|JSON」のJSONをクリックする)

エディタに以下のポリシーを貼り付けます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"rds:DescribeDBInstances",
"rds:StopDBInstance"
],
"Resource": "*"
}
]
}
画面下までスクロールし、「次へ」をクリックします
最後にカスタマーインラインポリシーに名前を付けます。
今回はポリシー名を「StopRDSPolicy」としました。

その後、「ポリシーの作成」をクリックします。
これでIAMロールの作成は完了です。
EventBridgeルールの作成
最後にEventBridgeルールを作成します。
EventBridgeルールのページで「ルール作成」の右にある「▲」をクリックし、表示された「スケジュールされたルールを作成」をクリックします。

初めに、ルールに名前を付けます。
今回は名前を「StopRDSDaily」としました。

名前を入力したら「次へ」をクリックします。
誤って「EventBridge Schedulerで続行」をクリックしないようにする
次にルールを実行するスケジュールを作成します。
スケジュールパターンは、「特定の時刻(毎月~)に実行されるきめ細かいスケジュール」を選択します。
RDSを自動停止するスケジュールのCron式を入力し、「次へ」をクリックします。

上の画像ではCron式を日次設定にしていますが、この場合、RDSが停止後7日経過で自動起動した際に、毎回24時間弱はRDSが起動状態となります。RDSが自動起動してから停止するまでの時間を短くしたい場合は、実行スケジュールの間隔を短くする必要があります。
次に、ターゲット(イベントを送信する先のリソース)を選択します。
「ターゲットを選択」で「Systems Manager オートメーション」を
「ドキュメント」で「StopRdsInstanceByTag」を選択します。
「自動化パラメータを設定」では、TagKeyを「auto_stop」、TagValueを「true」とします。
「実行ロール」では、「既存のロールを使用」を選択後、「ロール名」に先ほど作成した「StopRDSDailyRole」を選択し、「次へ」をクリックします。


「タグを設定」では、何も設定せずに「次へ」をクリックします。
「レビューと作成」の画面では、画面下までスクロールし、「ルールの作成」をクリックします。
これで、EventBridgeルールの作成が完了です。
あとは、定期的に停止したいRDSにタグ(キーは「auto_stop」、値は「true」)を付与するだけです。

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