この記事について

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 に変更されたことを確認する。