【AWS】RDS自動停止設定を行ってみた

## 【AWS】RDS自動停止設定を行ってみた

### はじめに
インフラ環境の運用を行っているマエザトです。
こちらの記事はAWSで管理している社内環境でのお話となります。

AWSサービスは起動していると課金される仕組みが多く、
EC2（サーバー）は必要な際に起動停止を行って費用を抑えておりましたが、
RDS（DB）に関しては使用していない時に停止を行っても7日後には
自動起動してしまうという仕様※となっており、困っていました。
ネット記事を参考にRDSの自動停止設定を行ってみることにしました。

※RDSの停止と自動起動について
https://aws.amazon.com/jp/about-aws/whats-new/2017/06/amazon-rds-supports-stopping-and-starting-of-database-instances/



### 環境
■操作環境
OS：Windows 10 Pro(64bit)

■使用プラットフォーム
Amazon AWS

■使用サービス
IAM
CloudWatch Events
Lambda


### 手順
####1.IAMによる権限の作成
自動停止を行うに対して、まずは権限設定をIAMにて設定します。

検索窓よりIAMと検索してIAMを立ち上げます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496216/5b451a1f-9963-d6e4-5086-1e04edbcd95f.png)

左メニューからロールを選択して、ロールの作成を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496216/9f026fcc-67cd-a8ec-ce3e-c9ae584d0c7b.png)

AWSサービス、Lambdaを選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496216/a907ad4d-ee11-bccd-4c4e-9286a788907c.png)

アクセス権限ポリシーはデフォルトにある下記を選択して次へ
AmazonRDSFullAccess
AmazonEC2FullAccess
CloudWatchLogsFullAccess
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496216/e968b2fc-6181-a37f-215e-5780af691be0.png)


タグは今回は特別設定せず、次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496216/9874ac2b-5bc3-d7d2-18d6-fc9f50e5db3f.png)


ロール名を任意に決め、ポリシーがきちんと選択されている事を確認し、ロールの作成ボタンにてロール作成が完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496216/5ba98377-d8a6-0aff-a0a7-6327db38b790.png)

####2.Lambdaの設定
検索窓よりLambdaと検索してLambdaを立ち上げます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496216/ed74c2d6-8676-ee24-fcc0-81801d4df96b.png)

関数の作成ボタンからlambdaの設定画面に移行します。
下記の内容で変更していきます。
・関数名
　任意の名前

・ランタイム
　Python 3.6

・ロール
　既存のロールを使用する

・アーキテクチャ
　x86_64

・既存のロール
　1で作成したロール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496216/bfc989ca-0393-94fe-7ec4-8de831b6b3b1.png)

関数が作成できたら、トリガーを追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496216/d7b86968-87ac-7a31-b821-0d3b8194e31f.png)

EventBridge（CloudWatch Events）を選択し、下記の内容で設定していく。
・ルール
　新規ルールの作成

・ルール名
　任意の名前

・ルールタイプ
　スケジュール式

・スケジュール式
　cron(0 19 * * ? *)
※こちらでは毎日朝04時に停止で設定しております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496216/fa1a3386-2793-584d-8784-ba949f049c8a.png)

######cron設定について
cron設定を行う際に書式や設定方法について簡単に調べたので記載します。
Cron式は
cron([分],[時],[日],[月],[曜日],[年])という形式で記載となっております。

#####記載する値の範囲

|項目|記載内容|
|:--|:--|
|分|0～59
|時|0～23
|日|1～31
|月|1-12 または JAN-DEC
|曜日|1 - 7 または SUN - SAT
|年|1970-2199

#####記載方法と設定例
cron式はUTC（協定世界時）での値を入力しないといけないため、
JST（日本標準時）の時間で設定する際はUTCに時間を変換しなければならない。
変換は下記サイトで簡単に行えます。
https://www.jisakeisan.com/


最後に時間の設定例を記載します。

例１　毎日午後 18:00 (JST) に実行
cron(0 9 * * ? *)

例２　15分ごとに実行
cron(0/15 * * * ? *)

例３　毎週月曜日から金曜日まで午後 13:00 (JST) に実行
cron(0 4 * * MON-FRI *)




####3.Lambdaスクリプトの作成
最後にLambdaスクリプトを記述します。
コードを記載したらDeployボタンを押し、Change deployedボタンを押します。
こちらで終了となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496216/1f546df9-7e47-30f9-f3bd-f527c36e290e.png)

■スクリプト記載例
3行目の'止めたいDB名'は各自で変更ください。

```
import boto3			
			
region = 'ap-northeast-1'			
			
instance = '止めたいDB名'			
def lambda_handler(event, context):			
    rds = boto3.client('rds', region_name=region)			
    rds.stop_db_instance(DBInstanceIdentifier=instance)			
    print('stoped instance: ' + instance)
```





### おわりに
対象のRDSの1ヶ月常時起動の金額が約18500円
1日の起動が616円となっておりました。

今回が月1回しか使用しない運用であったため、
設定適用してからは最低でも15000円の無駄なコスト削減ができました。
（7日間に一回の自動起動から自動停止までのタイムラグ含む）

AWSを触る機会が少ない中、ネットを参考に行いましたが、
簡単に設定することが出来ましたので、皆さんも是非参考に設定してみてください。


### 参考資料
下記サイト様をご参考にさせていただきました。
サイト名：[AWS]Lambda で RDS の自動起動・自動停止を実装する
https://www.t3a.jp/blog/infrastructure/rds-auto-start-stop/