概要

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

手順

IAM Roleの作成

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

AssumeRolePolicyDocument.jsonを作成します。

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

StartStopDB.jsonを作成します。

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

IAM RoleCWEventsStartStopAutomationRoleを作成します。

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

CWEventsStartStopAutomationRoleAmazonSSMAutomationRoleポリシーを付与します。

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

CWEventsStartStopAutomationRoleStartStopDBポリシーを付与します。

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-StartEC2InstanceAWS-StartRdsInstanceを指定し。開始したいインスタンスIDを設定します。

[
    {
        "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-StopEC2InstanceAWS-StopRdsInstanceを指定し、停止したいインスタンスIDを設定します。

[
    {
        "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

参考

元記事はこちら

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