Help us understand the problem. What is going on with this article?

【AWS】Lambda×CloudWatch EventsでRDSの自動停止

はじめに

先日社内の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形式で実行したいので次のように入力してあげましょう。
img.png
上の例では、日本時間で月曜から金曜の17時30分にイベントが実行されることになります。AWSでの標準時はグリニッジ標準時になっているので日本時間にするためには9時間早めないといけないことに注意してください。Cron式に詳しく知りたい方は公式ドキュメントを参考にしてください。
ここまで終わったら【ターゲット】のところで先ほど作成したLambda関数を指定してあげましょう。これで完成です!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした