はじめに
先日社内のAWSユーザーから「Auroraを検証で利用してるんだけど、停止してても7日間後に自動で起動しちゃったり、開発で使った後に止め忘れちゃうから何かいい方法ない?」と問い合わせがありました。なので、CloudWatch EventsとLambdaを使ってRDSを定期的に自動停止するプログラムをpython3.7
で作成しました。
この記事の対象者
- IAMロールやポリシーの違いが分かっていて、ポリシーを作成できる
- 何らかのプログラミング言語が書けるor読める
目次
- Lambda用のIAMロールの作成
- Lambda関数を作成する
- CloudWatch Eventsでスケジュールを立てる
Lambda用のIAMロールの作成
まずはIAMロールに割り当てるためのポリシーを作成していきます。ポリシーの作成からjsonエディターを開いて、次のjsonファイルをコピペしてください。それが終わったら、IAMロールに適当な名前をつけてアタッチしましょう。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"rds:Describe*",
"rds:StopDBInstance",
"rds:StartDBInstance"
],
"Resource": "arn:aws:rds:*:*:db:*"
}
]
}
Lambda関数を作成する
次にLambda関数を作成していきましょう。Lambdaのダッシュボードから【関数の作成】 > 【一から作成】を選択し、適当な関数名を入力、ランタイムをpython3.7とし、アクセス権限のところで先ほど作成したIAMロール割り当てて上げましょう。【関数の作成】をクリックすると関数のエディタ画面に遷移すると思うので、次のコードをコピペしてください。
import boto3
# 任意のDB識別子
db_instance = "sample_db"
def lambda_handler(event, context):
client = boto3.client('rds')
# DBの情報一覧が格納されている
informations = client.describe_db_instances(DBInstanceIdentifier=db_instance)
# DBの起動状態を取得
rds_stauts = informations["DBInstances"][0]["DBInstanceStatus"]
# DBが停止していた場合
if rds_stauts == "stopped":
print('DB already stopped.')
return
# DBが停止状態でなかった場合
else:
response = client.stop_db_instance(DBInstanceIdentifier = db_instance)
print('DB is stopping.')
return
プログラム自体はとてもシンプルですね。DBの識別子は皆さんのDBに合わせて変更してください。describe_db_instances
でDBインスタンスの情報を取得していて、その中から変数rds_status
にDBの状態を文字列型で代入しています。詳しく知りたい方は公式ドキュメントを参考にしてください。
ここまで終わったら、実行してみましょう!画面右上の【テスト】を選択し、イベント名に適当な名前を入力してください。【作成】ボタンをおし、もう一度【テスト】を実行すると該当のDB停止されているか確認してください。
CloudWatch Eventsでスケジュールを立てる
最後にCloudWatch EventsでLamda関数を定期実行できるようにしてあげましょう。CloudWatchのダッシュボードから【イベント】を選択します。スケジュールに基づくCron形式で実行したいので次のように入力してあげましょう。
上の例では、日本時間で月曜から金曜の17時30分にイベントが実行されることになります。AWSでの標準時はグリニッジ標準時になっているので日本時間にするためには9時間早めないといけないことに注意してください。Cron式に詳しく知りたい方は公式ドキュメントを参考にしてください。
ここまで終わったら【ターゲット】のところで先ほど作成したLambda関数を指定してあげましょう。これで完成です!