AWS CLIからSSM Automationを使用したEC2/RDSのスケジュール起動・停止を設定する

# 概要
EC2やRDSのスケジュール起動、停止について色々な実現方法がありますが`SSM Automation`でも行うことができるのでAWS CLIから設定してみます。

# 手順
## IAM Roleの作成
CloudWatch Eventsが使用するIAMRoleを作成します。
付与するポリシーは環境や要件に合わせて調整してください。

`AssumeRolePolicyDocument.json`を作成します。
 
```json

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

`StartStopDB.json`を作成します。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBInstances",
                "rds:StartDBInstance",
                "rds:StopDBInstance"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

IAM Role`CWEventsStartStopAutomationRole`を作成します。

```
aws iam create-role --role-name CWEventsStartStopAutomationRole --assume-role-policy-document file://AssumeRolePolicyDocument.json
```

`CWEventsStartStopAutomationRole`に`AmazonSSMAutomationRole`ポリシーを付与します。

```
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole --role-name CWEventsStartStopAutomationRole
```

`CWEventsStartStopAutomationRole`に`StartStopDB`ポリシーを付与します。

```
aws iam put-role-policy --role-name CWEventsStartStopAutomationRole --policy-name StartStopDB --policy-document file://StartStopDB.json
```

各ポリシーが付与されていることを確認します。

```
aws iam list-attached-role-policies --role-name CWEventsStartStopAutomationRole
aws iam list-role-policies --role-name CWEventsStartStopAutomationRole
```

##起動スケジュールの作成

`StartTarget.json`を作成します。ターゲットにAutomationドキュメントの`AWS-StartEC2Instance`と`AWS-StartRdsInstance`を指定し。開始したいインスタンスIDを設定します。

```json
[
    {
        "Id": "1",
        "Arn": "arn:aws:ssm:ap-northeast-1::automation-definition/AWS-StartEC2Instance:$DEFAULT",
        "RoleArn": "arn:aws:iam::<AWSアカウントID>:role/CWEventsStartStopAutomationRole",
        "Input": "{\"InstanceId\":[\"<EC2インスタンスID>\"]}"
    },
    {
        "Id": "2",
        "Arn": "arn:aws:ssm:ap-northeast-1::automation-definition/AWS-StartRdsInstance:$DEFAULT",
        "RoleArn": "arn:aws:iam::<AWSアカウントID>:role/CWEventsStartStopAutomationRole",
        "Input": "{\"InstanceId\":[\"<RDSインスタンスID>\"]}"
    }
]
```

起動ルール`StartInstance`を作成します。日本時間で月-金の10時に起動します。

```
aws events put-rule --name StartInstance --schedule-expression "cron(0 1 ? * 2-6 *)"
```

`StartInstance`にターゲットを紐付けます。

```
aws events put-targets --rule StartInstance --targets file://StartTarget.json
```

## 停止スケジュールの作成

`StopTarget.json`を作成します。ターゲットにAutomationドキュメントの`AWS-StopEC2Instance`と`AWS-StopRdsInstance`を指定し、停止したいインスタンスIDを設定します。

```json
[
    {
        "Id": "1",
        "Arn": "arn:aws:ssm:ap-northeast-1::automation-definition/AWS-StopEC2Instance:$DEFAULT",
        "RoleArn": "arn:aws:iam::<AWSアカウントID>:role/CWEventsStartStopAutomationRole",
        "Input": "{\"InstanceId\":[\"<EC2インスタンスID>\"]}"
    },
    {
        "Id": "2",
        "Arn": "arn:aws:ssm:ap-northeast-1::automation-definition/AWS-StopRdsInstance:$DEFAULT",
        "RoleArn": "arn:aws:iam::<AWSアカウントID>:role/CWEventsStartStopAutomationRole",
        "Input": "{\"InstanceId\":[\"<RDSインスタンスID>\"]}"
    }
]
```

停止ルール`StopInstance`を作成します。日本時間で月-金の19時に停止します。
 
```
aws events put-rule --name StopInstance --schedule-expression "cron(0 10 ? * 2-6 *)"
```
`StopInstance`にターゲットを紐付けます。

```
aws events put-targets --rule StopInstance --targets file://StopTarget.json
```

# 参考
- [自動化を CloudWatch Events のターゲットとして設定する (オプション)](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-cwe-target.html)
- https://docs.aws.amazon.com/AmazonCloudWatchEvents/latest/APIReference/API_PutTargets.html