この記事について
EC2 のインスタンスタイプを変更する方法として、 AWS-ResizeInstance というSSM オートメーションの事前定義済みドキュメント(ランブック)があり、それを使用することでインスタンスタイプを変更することができる。
しかし、 RDS の DB インスタンスクラスを変更できるドキュメントが見当たらなかったので作成した。
RDS の DB インスタンスはメンテナンスウィンドウで変更を特定のタイミングで実行することができるが、メンテナンスウィンドウは 1 週間単位の設定になっているため、ひと月に一度、定期的に変更したい場合は、メンテナンスウィンドウを毎週変更する必要が出てくる。
SSM オートメーションを EventBridge と組み合わせることで、任意のタイミングで実行することができ、定期実行の有効化・無効化も容易に設定することも可能となると考えた。
DB インスタンスクラスとは
DB インスタンスクラスは RDS の DB インスタンスに割り当てる vCPU 数とメモリ量を決める設定値。
DB インスタンスクラス を変更することでスケールアップあるいはダウンすることができ、例えばアクセスが集中し RDS がボトルネックになることが想定される場合は、事前に DB インスタンスクラスのサイズを変更することがある。
※ DB インスタンスクラスは DB インスタンスクラスタイプとサイズで構成されるが、本記事では説明は割愛する。
詳細はこちらを参照。
作成する カスタム SSM ドキュメントについて
構成イメージ

コードサンプル
description: Modify RDS Instance
schemaVersion: '0.3'
assumeRole: '{{ AutomationAssumeRole }}'
parameters:
InstanceId:
type: String
description: (Required) RDS Instance Id to modify.
AutomationAssumeRole:
type: String
description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
default: ''
InstanceClass:
type: String
description: (Required) RDS Instance Class.
mainSteps:
- name: AssertAvailable
action: aws:assertAwsResourceProperty
nextStep: ModifyDBInstance
isCritical: true
isEnd: false
onFailure: Abort
inputs:
Service: rds
Api: DescribeDBInstances
DBInstanceIdentifier: '{{InstanceId}}'
PropertySelector: $.DBInstances[0].DBInstanceStatus
DesiredValues:
- available
- name: ModifyDBInstance
action: aws:executeAwsApi
nextStep: Sleep5Min
isEnd: false
inputs:
Service: rds
Api: ModifyDBInstance
DBInstanceIdentifier: '{{InstanceId}}'
DBInstanceClass: '{{InstanceClass}}'
ApplyImmediately: true
- name: Sleep5Min
action: aws:sleep
nextStep: CheckModify
isEnd: false
inputs:
Duration: PT5M
- name: CheckModify
action: aws:waitForAwsResourceProperty
maxAttempts: 10
timeoutSeconds: 600
isEnd: true
onFailure: Abort
inputs:
Service: rds
Api: DescribeDBInstances
DBInstanceIdentifier: '{{InstanceId}}'
PropertySelector: $.DBInstances[0].DBInstanceStatus
DesiredValues:
- available
EventBridge と組み合わせて DB インスタンスクラスの変更を自動化する
SSM ステートマネージャーでもスケジュール実行できるが、定期実行の無効・有効が自由にできないので、EventBridge と組み合わせることにした。
構成図

SSM ドキュメントを作成する
※以下に記載のコマンドはCloudShellで実行する。
cat << EOF > Document-ModifyRDSInstance.yaml
description: Modify RDS Instance
schemaVersion: '0.3'
assumeRole: '{{ AutomationAssumeRole }}'
parameters:
InstanceId:
type: String
description: (Required) RDS Instance Id to modify.
allowedValues:
- sample-rds01
- sample-rds02
AutomationAssumeRole:
type: String
description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
default: ''
InstanceClass:
type: String
description: (Required) RDS Instance Class.
allowedValues:
- db.t3.small
- db.t3.medium
- db.t3.large
mainSteps:
- name: AssertAvailable
action: aws:assertAwsResourceProperty
nextStep: ModifyDBInstance
isCritical: true
isEnd: false
onFailure: Abort
inputs:
Service: rds
Api: DescribeDBInstances
DBInstanceIdentifier: '{{InstanceId}}'
PropertySelector: $.DBInstances[0].DBInstanceStatus
DesiredValues:
- available
- name: ModifyDBInstance
action: aws:executeAwsApi
nextStep: Sleep5Min
isEnd: false
inputs:
Service: rds
Api: ModifyDBInstance
DBInstanceIdentifier: '{{InstanceId}}'
DBInstanceClass: '{{InstanceClass}}'
ApplyImmediately: true
- name: Sleep5Min
action: aws:sleep
nextStep: CheckModify
isEnd: false
inputs:
Duration: PT5M
- name: CheckModify
action: aws:waitForAwsResourceProperty
maxAttempts: 10
timeoutSeconds: 600
isEnd: true
onFailure: Abort
inputs:
Service: rds
Api: DescribeDBInstances
DBInstanceIdentifier: '{{InstanceId}}'
PropertySelector: $.DBInstances[0].DBInstanceStatus
DesiredValues:
- available
EOF
aws ssm create-document \
--content file://Document-ModifyRDSInstance.yaml \
--name "Sample-ModifyRDSInstance" \
--document-type "Automation" \
--document-format YAML
IAMロールを作成する
cat << EOF > Trust-Policy-Events.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
aws iam create-role \
--role-name Sample-Role-ModifyRDSInstance \
--assume-role-policy-document file://Trust-Policy-Events.json
cat << EOF > Policy-ModifyRDSInstance.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds:*"
],
"Resource": "arn:aws:rds:ap-northeast-1:123456789012:db:sample-rds01"
},
{
"Effect": "Allow",
"Action": "ssm:StartAutomationExecution",
"Resource": "*"
}
]
}
EOF
aws iam put-role-policy \
--role-name Sample-Role-ModifyRDSInstance \
--policy-name Sample-Policy-ModifyRDSInstance \
--policy-document file://Policy-ModifyRDSInstance.json
EventBridgeルールを作成する
aws events put-rule --name "Sample-Rule-ModifyRDSInstance-ScaleUp" --schedule-expression "cron(00 19 L-1 * ? *)"
cat << EOF > Target-ModifyRDSInstance-ScaleUp.json
{
"Targets": [
{
"Id": "1",
"Arn": "arn:aws:ssm:ap-northeast-1:123456789012:automation-definition/Sample-ModifyRDSInstance",
"RoleArn": "arn:aws:iam::123456789012:role/Sample-Role-ModifyRDSInstance",
"Input": "{\"InstanceId\":[\"sample-rds01\"],\"InstanceClass\":[\"db.t3.large\"]}"
}
]
}
EOF
aws events put-targets --rule Sample-Rule-ModifyRDSInstance-ScaleUp --cli-input-json file://Target-ModifyRDSInstance-ScaleUp.json
動作確認
1.RDS の DB インスタンスクラスが db.t3.micro であること確認する。
![]()
2.作成した SSM ドキュメント指定した SSM オートメーションをスケジュール実行する。

3.指定した RDS の DB インスタンスが変更中になったことを確認する。
![]()
4.SSM オートメーションの実行が完了したことを確認する。

5.DB インスタンスクラスが指定した db.t3.large に変更されたことを確認する。
![]()