RDSを定期的に停止するLambdaを作る

公開日時
更新日時

AWSのコスト削減のために利用頻度の低いサービスを停止しておきたいことがある。

ただ、RDSの場合は最大7日間しか停止できない仕様となっている。

DB インスタンスは最大 7 日間停止できます。7 日後に DB インスタンスを手動で起動しなかった場合、DB インスタンスは自動的に起動されるため、必要なメンテナンス更新が遅れることはありません。

この仕様に自動で対応するため下記記事を参考にさせていただき、RDSを停止するLambdaと定期的にLambdaを実行するEventBridgeの設定を行った。

[[Amazon RDS]起動停止をスケジュール実行してみた | DevelopersIO](https://dev.classmethod.jp/articles/rds-auto-stop-start/)

Lambdaの作成

参考記事では最新のboto3を別途インストールする必要があると書かれていたが、現在はデフォルトのboto3でもエラーなく実行できた。

import boto3

client = boto3.client('rds')

def lambda_handler(event, context):
    try:
        response = client.stop_db_instance(DBInstanceIdentifier=event["DBInstanceIdentifier"])
        print(response)
    except Exception as e:
        print(e)

Lambda用IAMロール設定

停止させたいRDSのarnに対して rds:StopDBInstance を許可する設定を追加。

{
    "Effect": "Allow",
    "Action": [
         "rds:StopDBInstance"
    ],
    "Resource": "arn:aws:rds:xxxx"
}

EventBridgeの作成

  • 1日1回Lambdaを実行するように設定
5 0 * * ? *
  • 定数(JSONテキスト)に↓のjsonを設定する
{"DBInstanceIdentifier":"somerds"}

これで手動で都度RDSの停止作業を実施しなくても自動停止されるようになった。


Related #lambda

AWS SESの受信メールを暗号化してs3に保存しLambdaで読み込む

jsの場合、複合処理を独自実装する必要がある

Nodejs12のLambdaでawscliを使う

aws-lambda-layer-awscliを使う

s3の署名付きURLが有効期限より前に見れなくなってしまう

IAMロールではなくIAMユーザの権限でURLを生成する必要があった

AWS Lambdaでpuppeteerを動かしスクリーンショットをs3に保存する

前から気になっていたHeadless Chromeをjsから操作できるpuppeteerを使って、スクリーンショットをs3に保存するAPIを作ることにした。

CDK aws-lambda-nodejsのビルド時間を短縮する

Parcel v2.0.0-beta.1を使ってローカルでバンドルする

Lambdaでaws cli configureを設定できるようにする

AWS_CONFIG_FILE=/tmp/.aws/configを設定した