Lambdaの関数を利用してRDSを長期間停止する

#■経緯

Dev環境のRDSを長期間停止しておきたい

RDSについてインスタンスStop機能を使って停止すると
RDSのStop機能は7日後に自動的に起動される仕様になっている。
停止はRDSのインスタンス削除する方法もあるが、
毎回スナップショットからの復旧は面倒。

そのため、
Lambdaの関数を利用して、
定期的にRDSの起動状況を確認し、起動しているなら停止を実施するやり方で
停止を行う


RDSを停止する時は
Lambdaの関数「rds_stop」のルールCloudWatch Events「rds_stop_cron」を「有効」にする。

RDSを起動する時は
「rds_stop」のルールCloudWatch Events「rds_stop_cron」を「無効」にすることを忘れないよう！



#■Lambdaの関数

| 項目             |  内容 |
|:-----------------|------------------:|
| ランタイム       |Rython3.6          |
| 関数　　　　　　 　|rds_stop           |
| Lambdaのロール   | lambda_rds_start_stop_execution|
|トリガー　　　　　 |CloudWatch Events|
|ルール            |「rds_stop_cron」スケジュール式: cron(0/10 * * * ? *)|



###Lambdaのロール
lambda_rds_start_stop_execution

```ruby:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "rds:Describe*",
                "rds:StartDBInstance",
                "rds:StopDBInstance",
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogStreams"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
　
```
###Lambdaの関数

関数：rds_stop

```ruby:

import boto3

　　# RDSインスタンス一覧
rds_ids = [
    'dev-db'
    ]

def lambda_handler(event, context):

    # RDS インスタンスの処理
    rds = boto3.client('rds')

    # リストの要素が0の場合は終了
    if len(rds_ids) == 0:
        print('対象RDSインスタンスがありません。')
    else:
        for i in rds_ids:
            # RDSを停止する前にすでに停止しているどうか確認する。
            response = rds.describe_db_instances(DBInstanceIdentifier=i)
            rds_status = response["DBInstances"][0]["DBInstanceStatus"]
            print(rds_status)

            # ステータスが「stopped」の場合
            if rds_status == "stopped":
                print('既に RDS インスタンスが停止しています。：' + str(i))
            elif rds_status == "available":
                # string 形式で RDS 受け取る
                rds.stop_db_instance(DBInstanceIdentifier=i)
                print('RDSインスタンスを停止しました。：' + str(i))
            else:

                # available や stopped 以外の場合
                print('ステータスが変更途中です。：' + str(i))
                
    
    return 'RDSインスタンスの停止処理を完了しています。'
```

===================

関数：rds_stop

```ruby:
import boto3

# RDSインスタンス一覧
rds_ids = [
    'dev-db'
    ]

def lambda_handler(event, context):

    # RDS インスタンスの処理
    rds = boto3.client('rds')

    # リストの要素が0の場合は終了
    if len(rds_ids) == 0:
        print('対象RDSインスタンスがありません。')
    else:
        for i in rds_ids:
            # RDSを起動する前にすでに起動しているかどうか確認する。
            response = rds.describe_db_instances(DBInstanceIdentifier=i)
            rds_status = response["DBInstances"][0]["DBInstanceStatus"]
            print(rds_status)

            # ステータスが「available」の場合
            if rds_status == "available":
                print('既に RDS インスタンスが起動しています。：' + str(i))
            elif rds_status == "stopped":
                # string 形式で RDS 受け取る
                rds.start_db_instance(DBInstanceIdentifier=i)
                print('RDSインスタンスを起動しました。：' + str(i))
            else:

                # available や stopped 以外の場合
                print('ステータスが変更途中です。：' + str(i))
                
    
    return 'RDSインスタンスの起動処理を完了しています。'

```

参考
https://go-journey.club/archives/5161