EC2,RDSの起動時間を設定する

# はじめに
AWS無料枠の関係でEC2、RDSの起動時間を制限したいなと思った時の備忘録。
どちらもCloudWatchを使用して対応します。

# EC2の起動時間設定
## EC2インスタンス停止
### IAMロールの作成
①IAMコンソールからロールを作成
![スクリーンショット 2021-08-06 16.33.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1273104/118ee73d-d939-854c-389c-545a2e5abfb4.png)

②AWSサービス>EC2を選択>次のステップ

③AWS 管理ポリシーの AmazonSSMAutomationRole をアタッチ
![スクリーンショット 2021-08-06 16.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1273104/7ff2b023-0b5f-7934-af35-362cb9492612.png)

④ロール名を入力し作成

⑤作成したロールを選択し、「信頼関係」のタブから「信頼関係の編集」をクリックし、以下を入力

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "events.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

### CloudWatchのイベントルールを作成

①CloudWatchコンソールのイベントから「ルールの作成」ボタンをクリック
![スクリーンショット 2021-08-06 16.43.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1273104/6e0a386e-8dd5-288f-e01b-711aa1e01515.png)

②イベントソースをスケジュールに設定し、Cron式を入力
今回の場合、日本時間で毎日23時に停止となる
参考：[cron式](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions)

③ターゲット画面にて、"EC2 StopInstances API 呼び出し"を選択し、対象のインスタンスIDを設定。
既存のロールで先程作成したロールを選択

④ルールの名前を入力し、作成して完了

## EC２インスタンス開始
### CloudWatchのイベントルールを作成

①CloudWatchコンソールのイベントから「ルールの作成」ボタンをクリック
![スクリーンショット 2021-08-06 16.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1273104/5d1d06c3-7459-c4f9-d7a2-ce67f1af3c43.png)


②イベントソースをスケジュールに設定し、Cron式を入力
今回の場合、日本時間で毎日8時に停止となる

③ターゲット画面にて、"AWS-StartEC2Instance"を選択し、対象のインスタンスIDを設定。
既存のロールで先程作成したロールを選択

④ルールの名前を入力し、作成して完了

# RDSの起動時間設定
ちなみに以下の記載があります。
`DB インスタンスは最大 7 日間停止できます。
7 日後に DB インスタンスを手動で起動しなかった場合、DB インスタンスは自動的に起動されるため・・・
`
RDS停止の最大は7日間のようです。

参考：[一時的に Amazon RDS DB インスタンスを停止する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_StopInstance.html)

## RDSインスタンス停止

### Lambdaの作成
①AWS Lambda>関数>関数の作成

②適当な関数名を入力し、ランタイムはPython3.7を選択、
アクセス権限：基本的な Lambda アクセス権限で新しいロールを作成　→関数の作成
![スクリーンショット 2021-08-12 9.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1273104/613a10b3-90d5-d811-7fed-bfafc38db16b.png)

③作成後、トリガーを追加を押下
![スクリーンショット 2021-08-12 10.18.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1273104/37277b77-0e21-2b96-acdc-189a0c7273e8.png)


④EventBridge(CloudWatch Events)を選択し、新規ルールの作成を選択
ルールタイプをスケジュール。スケジュール式にcronを設定。
画像の場合、毎日23時にインスタンスを停止となる。

![スクリーンショット 2021-08-12 9.49.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1273104/226fdfb4-3a3a-97b5-f4d6-6cc2212df3e1.png)

⑤追加を押下

⑥作成した関数のコードソースを開き、以下の内容に書き換え　→Deployを押下

```py
import boto3

def lambda_handler(event, context):
dbinstances = [‘RDS DB インスタンス識別子’,’RDS DB インスタンス識別子’] rds = boto3.client(‘rds’)
result = rds.stop_db_instance(DBInstanceIdentifier = dbinstance)
print(result)
return 0
```


![スクリーンショット 2021-08-12 9.59.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1273104/c5221b23-a626-384b-05c2-f699ee7f52e5.png)

### IAMロールの設定

①IAM管理画面＞ロール　にて、Lambdaの作成②で作成したロールを選択

②管理ポリシーに以下をアタッチ
・CloudWatchFullAccess
・AmazonRDSFullAccess

③これにてRDSインスタンスの停止設定が完了

## RDSインスタンス開始
RDSインスタンス停止の設定手順と以下が異なるのみです。
④スケジュールのcron式の内容
⑥開始コードの内容

### Lambdaの作成
①AWS Lambda>関数>関数の作成

②適当な関数名を入力し、ランタイムはPython3.7を選択、
アクセス権限：基本的な Lambda アクセス権限で新しいロールを作成　→関数の作成

③作成後、トリガーを追加を押下

④EventBridge(CloudWatch Events)を選択し、新規ルールの作成を選択
ルールタイプをスケジュール。スケジュール式にcronを設定。

⑤追加を押下

⑥作成した関数のコードソースを開き、以下の内容に書き換え　→Deployを押下

```py
import boto3

def lambda_handler(event, context):
dbinstances = [‘RDS DB インスタンス識別子’,’RDS DB インスタンス識別子’] rds = boto3.client(‘rds’)
result = rds.start_db_instance(DBInstanceIdentifier = dbinstance)
print(result)
return 0
```

### IAMロールの設定

①IAM管理画面＞ロール　にて、Lambdaの作成②で作成したロールを選択

②管理ポリシーに以下をアタッチ
・CloudWatchFullAccess
・AmazonRDSFullAccess

③これにてRDSインスタンスの開始設定が完了

# 参考
[【Lambda】EC2インスタンスやRDSの自動起動/停止設定を実現する](https://soypocket.com/it/aws/lambda-instance-auto-stop-start/)
[[AWS]Lambda で RDS の自動起動・自動停止を実装する](https://www.t3a.jp/blog/infrastructure/rds-auto-start-stop/)
[EC2インスタンスのスケジュール起動がお手軽に実現できるようになっていた！](https://qiita.com/t-toyota/items/5d7455568f1856fd2f4e)
[EC2 インスタンスの起動と停止を自動化することは出来ますか？](https://dev.classmethod.jp/articles/tsnote-ec2-ssm-automation/)