この記事には広告を含む場合があります。
記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
目次
RDS インスタンスを自動で起動・停止を行う
サーバーレス(Lambda)で時間をトリガーとして RDS インスタンスの自動起動と自動停止を実装する方法をご紹介します。
用途を含めて解説していますので、ご自身に合わせて調整してください。
自動起動・自動停止の活用方法
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)を選択します。
ロール一覧が表示されるため、赤枠で囲った「ロールの作成」をクリックします。
「信用されたエンティティの種類を選択」については、「AWS サービス」を選択。「このロールを使用するサービスを選択」は「Lambda」を選択します。
Attach(アタッチ)する権限ポリシーは、
・CloudWatchFullAccess
・AmazonRDSFullAccess
を選択します。
※本来は、「CloudWatch」と「RDS」の全権限を与える必要はないので、厳格な権限設定がしたい方は適度に設定を調整してください。
タグの追加(オプション)は、今回は設定せずに次のステップへ移行します。
最後に確認画面が表示されて、ロールの作成完了となります。
※設定した内容は下記の画像の通りです。
Lambda の設定方法
AWS のトップメニューから「コンピューティング」>「Lambda」を選択します。
Lambda で登録済みのスクリプト一覧が表示したら、赤枠で囲った「関数の作成」をクリックします。
先ほど作成したロール(権限)を設定して、プログラムは「Python3.6」(Python2.7でも可)を選択しています。
時間による RDS の自動起動・停止を設定するため、左メニューにある「トリガーの追加」から「CloudWatch Events」を選択してトリガーを追加します
設定した「CloudWatch Events」を選択して、時間によって動作する設定を行います。ルール名は自分が分かり易い名前をつけて、「ルールタイプ」は「スケジュール式」を選択します。
とcronの書式で実行する時間を設定します。
RDS 自動停止を実装する際の実行時間
設定に関して少し蛇足になりますが、RDS インスタンスが7日後に再起動する仕様について、コストを下げるため僕が設定した内容を記載しておきます。
コストを下げる基本的な考え方として、AWS 側のシステムで再起動を発生させないことが良いと思います。そのため一定時間ごとに RDS を起動して1時間以内に停止命令を送る実装をすれば良いです。
※aws は1時間以内の起動時間は1時間の使用としてコストが計上されるため
そこで今回は6日間隔で1時間以内の起動と停止を繰り返す設定を行っています。つまり毎月1日、7日、13日、19日、25日、29日にスクリプトを実行します。
〇RDS の起動時間
〇RDS の停止時間
スクリプト(Python)の作成
では実際に Lambda に記述するスクリプトを記載します。
自動起動および自動停止のスクリプトは、変数であるリージョン「region」と DB インスタンス名「instance」を調整すれば再利用できますので、各自の環境に合わせて調整してください。
〇RDS インスタンスの自動起動
では続いて、Lambda の設定を行って、RDS の自動起動を設定します。
Lambda の画面にて「関数」>「関数の作成」を選択します。先ほど作成した権限を設定して、プログラムは「Python3.6」(Python2.7でも可能)を選択しています。
1 2 3 4 5 6 7 8 9 |
import boto3 region = 'ap-northeast-1' instance = 'testdb' def lambda_handler(event, context): rds = boto3.client('rds', region_name=region) rds.start_db_instance(DBInstanceIdentifier=instance) print('started instance: ' + instance) |
サンプルプログラム内でメインとなる関数「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 のスクリプトに記述します。
1 2 3 4 5 6 7 8 9 |
import boto3 region = 'ap-northeast-1' instance = 'testdb' def lambda_handler(event, context): rds = boto3.client('rds', region_name=region) rds.stop_db_instance(DBInstanceIdentifier=instance) print('stoped instance: ' + instance) |
停止関数である「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
補足情報
設定が必須では無いですが、時折スクリプトの実行時にメモリ不足によりスクリプトが失敗するときがあります。そんなときは「基本設定」にある「メモリ」と「タイムアウト」を調整してください。
128MB → 256MB
〇タイムアウト
3秒 → 10秒
の設定を行っています。
さいごに
いかがでしたでしょうか。
RDS の自動起動と自動停止は、作業工数が少なく実装できるので経費削減には非常に有用です。
なお今回利用した Lambda の Python ライブラリ「boto3」は多機能な性能を揃えているため、ぜひ多機能なサーバーレスの処理役としてご活用ください。
ページ数: 240ページ
出版社: 技術評論社
発売日:2019/11/07
出典:amazon