RDSとは?
AWSを使っていて、お値段が高いなぁと感じるコンポーネントの一つにRDSがあります。
Amazon RDS (Relational Database Service) は、AWSが提供するフルマネージドのリレーショナルデータベースサービスです。
PostgreSQL、MySQL、MariaDB、Oracle、SQL Serverなど複数のデータベースエンジンをサポートしており、インフラ管理(スケーリング、バックアップ、パッチ適用、レプリケーションなど)を自動化し、運用負荷を軽減できます。
RDSを利用することで、手軽にデータベースをデプロイ・管理でき、アプリケーション開発に集中できるようになります。
このようにAWS上でシステムを構築してサービスを運用する上で、ほぼ必要となるこのRDS。とても便利なのですが、ランニングコストが高いのが特徴です。
RDSを自動停止してムダをなくす?
仮想マシンとして利用できるEC2、使わない時はインスタンスを停止しておくことでほぼ課金されません。たまにしか使わない試験環境などはインスタンスを停止しておくことでランニングコストを抑えることができます。
しかし、RDSはインスタンスの完全停止ができないのです!
一時停止しかできないので、停止しても一定期間経過するとAWS側で自動で再起動されてしまうのです。まるでこの子のように止めても止めても動き出して、課金が開始されてしまいます。
本番運転しているサービスなら別ですが、必要な時にしか動かなさいサービスや開発、試験環境などは使わない間はデータベースのインスタンスを止めておくと無駄なコストが削減できます。
また、AWSで勉強しようとアカウントを作って結構な確率でやらかしてしまうのが、データベースをRDSで構築し、勉強が終わったあと停止したのにいつの間にか勝手に起動していて、その結果、高額な請求がきてしまったというパターンです。
RDSのランニングコストを下げるには
そんな高価にRDSをずっと起動しておくのはお金をドブに捨てているのと同じです。
使っていない時は止めておきましょう。
マネジメントコンソールにログインして停止(GUI好き向け)
一般的なRDSの操作方法としては、AWSマネジメントコンソールにログインして、RDSのページで操作したいデータベースを選択して停止します。
停止したいデータベースインスタンス、またはクラスターを選択して、アクションから「一時的に停止」を選択します。
AWS CLIでログインせずに停止(CUI好き向け)
毎回AWSマネジメントコンソールにログインして、データベースを停止させるのは面倒くさい!
という方には、AWS CLIを使う方法があります。
これを使うとログインせず、WindowsやMacなどの普段使っているパソコン上でコマンドを実行するだけでマネジメントコンソールで停止処理するのと同じことが実行できます。
やり方を紹介します。
AWS CLIを使うはAWSマネジメントコンソールでできることがコマンドで実行できてしまいますので、よくやる操作はコマンドラインとして保存しておくといつでも手軽に実行できるのが魅力です。
データベースのステータス確認
まずは、対象のデータベースクラスタ、またはデータベースインスタンスが動いているかどうか確認します。
データベースインスタンスの場合
次のコマンドは、東京リージョンにある test-db というデータベースインスタンスの状態を表示するコマンドです。
aws rds describe-db-instances --db-instance-identifier test-db --query "DBInstances[*].{DBInstanceId
entifier:DBInstanceIdentifier, Status:DBInstanceStatus}" --output text --region ap-northeast-1
データベースクラスターの場合
次のコマンドは、東京リージョンにある test-db-cluster というデータベースクラスターの状態を表示するコマンドです。
aws rds describe-db-clusters --db-cluster-identifier test-db-cluster --query "DBClusters[0].Status" --output text --region ap-northeast-1
コマンドを実行すると、次の状態のいずれかが表示され、現在の状態が確認できます。
- available:動作中
- stopping:停止中
- stopped:停止
データベースの停止
データベースのステータスを確認した結果、available が表示された場合は、対象のデータベースが動いている状態ですので、停止しましょう。
データベースインスタンスの場合
次のコマンドは、東京リージョンにある test-db というデータベースインスタンスの状態を表示するコマンドです。
aws rds stop-db-instance --db-instance-identifier test-db --region ap-northeast-1
データベースクラスターの場合
次のコマンドは、東京リージョンにある test-db-cluster というデータベースクラスターの状態を表示するコマンドです。
aws rds stop-db-cluster --db-cluster-identifier test-db-cluster --region ap-northeast-1
コマンド実行後、ステータスを確認してください。
停止コマンド実行直後は、stoppingになっています。そしてしばらくして再度ステータス確認をすると、stoppedになります。
完全に停止できないの?
結論、できません。
但し、データベースが起動していたら自動で止めるということは可能です。
RDS、昔は完全に停止できたのですが、最近は完全停止はできなくなり、止めても一時的な停止で、時間が経つと自動で起動します。
AWS始めたばかりの人がよくやらかしてしますのが、AWS上にWebサービス構築したけど、しばらく使わないから勿体ないのでインスタンス停止しておこう、と止めるわけです。これは正しい発想です。
しかし、EC2と違い、RDSは一時停止になるだけで完全に停止させるのは削除する以外にありません。そうするといつの間にか自動で起動して課金が開始され、請求書見てなんじゃこりゃぁ~となるわけです。
対策Lv.1 手動で定期的に止める
RDSは停止してから最大で7日経過すると自動で起動しますので、先に紹介した方法で手動で停止してください。但し、停止するのを忘れてしまうと課金地獄に落ちてしまいますので注意が必要です。
対策Lv.2 停止コマンドを自動起動する
先に紹介したデータベースの停止コマンドをパソコンのスケジュール起動の機能を使って自動起動することができます。
例えば、Windowsの場合、コマンドの内容をバッチファイルとして作成し、パソコンのタスクスケジューラーを使って自動で実行することで、忘れずに停止することができます。
対策Lv.3 AWS Lambdaで自動停止
ずっとパソコンを起動しているのやだ! はい、私もです。
というわけで、私のオススメはAWS Lambdaを使った停止処理の実装です。
AWS Lambdaはサーバレスでプログラムを実行することができるAWSのサービスです。
データベースを停止させるPytonのプログラムを作成して、それをAWS上で自動起動することで手元のパソコンが起動していなくてもデータベースを停止することができます。
そしてそのプログラムをAWS上でスケジュール起動させることで自動停止を実現することができます。
データベースクラスタ停止プログラム
やり方を紹介します。まずは、Lambdaで新しい関数を作成します。
- 一から作成を選択
- 関数名はデータベースを自動で停止するための機能ということがわかりやすい名前を付ける
- ランタイムはPythonを選択
- アーキテクチャは x86_64
- 最後に関数の作成ボタンを押す
コード入力画面が表示されたら、次のコードを入力すればデータベース停止機能の完成です。
db_cluster_identifierに停止対象のデータベースクラスタ識別子を指定してください。
import boto3
# boto3のRDSクライアントを作成
rds_client = boto3.client('rds')
def lambda_handler(event, context):
# チェックしたいDBクラスタの識別子を指定
db_cluster_identifier = 'test-db-cluster' # ここにDBクラスタ識別子を設定
try:
# クラスタの現在のステータスを取得
response = rds_client.describe_db_clusters(DBClusterIdentifier=db_cluster_identifier)
db_cluster_status = response['DBClusters'][0]['Status']
print(f"Current status of {db_cluster_identifier}: {db_cluster_status}")
# クラスタが起動しているかを確認
if db_cluster_status == 'available':
# クラスタを停止
print(f"Stopping DB cluster {db_cluster_identifier} as it is currently running...")
rds_client.stop_db_cluster(DBClusterIdentifier=db_cluster_identifier)
return {
'statusCode': 200,
'body': f"DB cluster {db_cluster_identifier} is being stopped."
}
else:
print(f"DB cluster {db_cluster_identifier} is not in 'available' status.")
return {
'statusCode': 200,
'body': f"DB cluster {db_cluster_identifier} is not running, current status is {db_cluster_status}."
}
except Exception as e:
print(f"Error occurred: {str(e)}")
return {
'statusCode': 500,
'body': f"Error occurred: {str(e)}"
}
テスト実行してエラーが起きずに対象のデータベースが停止できることを確認しましょう。
自動実行を設定する
AWS上でLambda関数をスケジュール起動するには、Amazon EventBridgeを使います。
いくつか種類がありますが、今回は一定間隔でスケジュール起動したいので、EventBridgeスケジュールを選択します。
スケジュールにわかりやすい名前を付けます。
起動タイミングを指定します。
- 定期的なスケジュールを指定
- タイムゾーンはお住まいの地域を指定
- 決まった時間に起動させたいのでUnix/Linuxユーザにはお馴染みのcronベースを選択
- cron式は起動タイミングを指定(今回は毎日0時0分に起動)
- 直近10回の起動タイミングがリスト表示されるので間違っていないか確認
次にスケジュール起動する処理を選択します。
ここでは先に作成した自動停止Lanbda関数を指定します。
起動するLanbda関数を選択したら、アクセス権限を設定します。既に同じようなことをしている場合は既存のロールから選択、よくわからない場合は新規で次のようにわかりやすい名前を付けて作成します。
このようにステータスが有効で作成が完了すれば自動起動設定完了です。
これでデータベースが自動で起動しても自動で停止させる仕組みができました。
あとは、きちんと動作しているか定期的にCloudWatchでチェックしましょう。
それではまた!
コメント