[Amazon RDS]起動停止をスケジュール実行してみた

Amazon RDS

コンニチハ、千葉です。

RDSに停止・起動の機能が追加されました!色々制限事項もあるので、下記エントリをご確認ください。

[速報] RDSインスタンスの起動/停止

おのずと必要になってくるのは、自動起動・停止ですよね。そこで、CloudWatch Events + Lambdaで実装してみました。

やってみた

今回は以下の流れでやります

  1. Lambdaへアップロードするzipを作成
  2. Lambda用のIAMロールの作成
  3. Lambdaファンクションの作成
  4. CloudWatch Eventsの登録

Lambdaへアップロードするzipを作成

まずは、Lambdaファンクション用のzipを作成しましょう。デフォルトのboto3だとバージョンが古いようでRDS起動停止のSDKが利用できませんでした。 そのため、最新のboto3をパッケージングしたzipを作成します。

停止

cd ~
WORKDIR=lambda_stop_rds
mkdir -p ${WORKDIR}
pip install boto3 -t  ${WORKDIR}

tee ${WORKDIR}/lambda_function.py <<EOF
import boto3
def lambda_handler(event, context):
    client = boto3.client('rds')
    response = client.stop_db_instance(
    DBInstanceIdentifier=event["DBInstanceIdentifier"],
    )
    print (response)
EOF

cd ${WORKDIR}
zip -r ~/${WORKDIR}.zip .

起動

cd ~
WORKDIR=lambda_start_rds
mkdir -p ${WORKDIR}
pip install boto3 -t  ${WORKDIR}

tee ${WORKDIR}/lambda_function.py <<EOF
import boto3
def lambda_handler(event, context):
    client = boto3.client('rds')
    response = client.start_db_instance(
    DBInstanceIdentifier=event["DBInstanceIdentifier"],
    )
    print (response)
EOF

cd ${WORKDIR}
zip -r ~/${WORKDIR}.zip .

Lambda用のIAMロールの作成

LambdaでRDSの起動・停止のみを許可したIAMロールを作成します。 以下のインラインポリシーでIAMロールを作成しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds:StopDBInstance",
                "rds:StartDBInstance"
            ],
            "Resource": "arn:aws:rds:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        }
    ]
}

Lambdaファンクションの作成

以下でLambdaファンクションを作成します。

  • 設計図の選択でブランク
  • ランタイムにPythonを指定
  • コードエントリタイプにZIPを選択し、作成したzipファイルをアップロード
  • 作成したIAMロールを指定

起動用、停止用の2つのファンクションを作成します。

20170609-rds-auto-stop-start-1

CloudWatch Eventsの登録

CloudWatch Eventsのルールを作成して定期実行させます。

注意:cronはUTC指定です

20170609-rds-auto-stop-start-2

入力設定解説

以下のように入力設定(定数JSONテキスト)を行い、対象のRDSインスタンスを指定します。今回は、"chibadb"を指定しています。

{ "DBInstanceIdentifier": "chibadb" }

これで、RDSの起動・停止をスケジュール実行できるようになりました。

さいごに

いかがでしたでしょうか?開発環境のコスト削減で活用できそうなRDSの起動・停止をスケジュール実行してみました。規模が大きく台数が多い場合、RDSに付与したタグをベースに停止・起動するようにコード変更するとさらに汎用的に使えるかなと思います。それではまたお会いしましょう。

参考

http://boto3.readthedocs.io/en/latest/reference/services/rds.html http://dev.classmethod.jp/cloud/aws/boto3_lambda_deploypackage/