[AWS]Lambda で RDS の自動起動・自動停止を実装する

[AWS]Lambda で RDS の自動起動・自動停止を実装する

rds_auto_start_stop_top

RDS インスタンスを自動で起動・停止を行う

サーバーレス(Lambda)で時間をトリガーとして RDS インスタンスの自動起動と自動停止を実装する方法をご紹介します。

Advertisement

自動起動・自動停止の活用方法

RDS のインスタンスは、一時停止が認められています。

DB インスタンスは最大 7 日間停止できます。
DB インスタンスを手動で起動しないで 7 日間が経過すると、DB インスタンスは自動的に起動します。

〇一時的に Amazon RDS DB インスタンスを停止する
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_StopInstance.html

EC2 は恒久的な停止が可能ですが、RDS の停止は最大 7 日間のため、長期間使用しない際はインスタンスの破棄が一般的です。

そのため RDS の自動起動・停止の用途は、
・営業時間外(夜中や休日)のテスト用 DB の自動起動/停止によるコスト削減
・使用頻度が低いが削除できない DB のコスト削減
になります。

1つ目、営業時間外のテストDBの自動起動/停止は非常におすすめです。社員が帰宅した頃に自動で RDS が停止して、社員が出社する頃に自動で RDS が起動すると使い勝手も抜群です。また EC2 の自動起動・停止と組み合わせると効果がぐっと上がります。

2つ目は使用頻度が低いが削除できない DB のコスト削減です。僕自身が本記事を作成したのはコチラが原因で、不定期にしか使用しない DB だが、使う際には即座に使用可能にする必要がある場合です。DB を削除できないが、DB が起動しているかを定期的にチェックするのも面倒というときには非常に役立ちます。

 

Lambda による RDS の自動起動・自動停止の設定手順

Lambda で処理(スクリプト)を実行したいときは、
・権限(ロール)の作成
・Lambda(スクリプト)の設定
の設定を行います。

では順番に設定手順を確認してみましょう。

IAM による権限(ロール)の作成

AWS のトップメニューから「セキュリティ、ID、およびコンプライアンス」>「IAM」(AWS Identity and Access Management)を選択します。

左メニューにある「ロール」をクリックします。
rds_auto_start_stop_iam1

 

ロール一覧が表示されるため、赤枠で囲った「ロールの作成」をクリックします。
rds_auto_start_stop_iam2

 

「信用されたエンティティの種類を選択」については、「AWS サービス」を選択。「このロールを使用するサービスを選択」は「Lambda」を選択します。
rds_auto_start_stop_iam3

 

Attach(アタッチ)する権限ポリシーは、
・CloudWatchFullAccess
・AmazonRDSFullAccess
を選択します。

※本来は、「CloudWatch」と「RDS」の全権限を与える必要はないので、厳格な権限設定がしたい方は適度に設定を調整してください。
rds_auto_start_stop_iam4

 

タグの追加(オプション)は、今回は設定せずに次のステップへ移行します。
rds_auto_start_stop_iam5

 

最後に確認画面が表示されて、ロールの作成完了となります。
※設定した内容は下記の画像の通りです。
rds_auto_start_stop_iam6

 

Lambda の設定方法

AWS のトップメニューから「コンピューティング」>「Lambda」を選択します。

Lambda で登録済みのスクリプト一覧が表示したら、赤枠で囲った「関数の作成」をクリックします。
rds_auto_start_stop_lambda1

 

先ほど作成したロール(権限)を設定して、プログラムは「Python3.6」(Python2.7でも可)を選択しています。
rds_auto_start_stop_lambda2

 

時間による RDS の自動起動・停止を設定するため、左メニューにある「トリガーの追加」から「CloudWatch Events」を選択してトリガーを追加します
rds_auto_start_stop_lambda3

 

設定した「CloudWatch Events」を選択して、時間によって動作する設定を行います。ルール名は自分が分かり易い名前をつけて、「ルールタイプ」は「スケジュール式」を選択します。

cron([分],[時],[日],[月],[曜日],[年])

とcronの書式で実行する時間を設定します。

rds_auto_start_stop_lambda4

 

RDS 自動停止を実装する際の実行時間

設定に関して少し蛇足になりますが、RDS インスタンスが7日後に再起動する仕様について、コストを下げるため僕が設定した内容を記載しておきます。

コストを下げる基本的な考え方として、AWS 側のシステムで再起動を発生させないことが良いと思います。そのため一定時間ごとに RDS を起動して1時間以内に停止命令を送る実装をすれば良いです。
※aws は1時間以内の起動時間は1時間の使用としてコストが計上されるため

そこで今回は6日間隔で1時間以内の起動と停止を繰り返す設定を行っています。つまり毎月1日、7日、13日、19日、25日、29日にスクリプトを実行します。

RDS の起動時間

cron(15 23 */6 * ? *)

RDS の停止時間

cron(45 23 0/6 * ? *)

 

スクリプト(Python)の作成

では実際に Lambda に記述するスクリプトを記載します。

自動起動および自動停止のスクリプトは、変数であるリージョン「region」と DB インスタンス名「instance」を調整すれば再利用できますので、各自の環境に合わせて調整してください。

 

RDS インスタンスの自動起動
では続いて、Lambda の設定を行って、RDS の自動起動を設定します。

Lambda の画面にて「関数」>「関数の作成」を選択します。先ほど作成した権限を設定して、プログラムは「Python3.6」(Python2.7でも可能)を選択しています。

サンプルプログラム内でメインとなる関数「start_db_instance」の解説ページを下記に記載しますので、スクリプトを改変される方はお役立てください。

〇amazon 公式の「start_db_instance」の解説ページ
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html#RDS.Client.start_db_instance

 

RDS インスタンスの自動停止
RDS の停止も起動と同じように「StopRDSInstance」として、Lambda のスクリプトに記述します。

停止関数である「stop_db_instance」の解説ページも下記に記載しますので、「start_db_instance」と合わせてご参照ください。

〇amazon 公式の「stop_db_instance」の解説ページ
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html#RDS.Client.stop_db_instance

 

リージョンについて
プログラム内で設定するリージョンについて、使用頻度が高い日本(東京)リージョンとアメリカ(バージニア、オレゴン)のリージョンを載せておきます。もしその他の全てのリージョンを確認したいときは、下記に設置したリンク「リージョンとアベイラビリティーゾーン」より AWS 公式ページにてご確認ください。

リージョンコード 名称
us-east-1 米国東部(バージニア北部)
us-west-2 米国西部(オレゴン)
ap-northeast-1 アジアパシフィック(東京)

リージョンとアベイラビリティーゾーン
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html

 

補足情報

設定が必須では無いですが、時折スクリプトの実行時にメモリ不足によりスクリプトが失敗するときがあります。そんなときは「基本設定」にある「メモリ」と「タイムアウト」を調整してください。

rds_auto_start_stop_lambda5
今回は紹介したプログラムは念のため、

〇メモリ(MB)
128MB → 256MB

〇タイムアウト
3秒 → 10秒

の設定を行っています。

Advertisement

さいごに

いかがでしたでしょうか。

RDS の自動起動と自動停止は、作業工数が少なく実装できるので経費削減には非常に有用です。

なお今回利用した Lambda の Python ライブラリ「boto3」は多機能な性能を揃えているため、ぜひ多機能なサーバーレスの処理役としてご活用ください。

 

この記事が気に入ったら
いいね ! をお願いします

Twitter で

インフラカテゴリの最新記事