この記事について
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 に変更されたことを確認する。