【AWS】RDSの可用性設定をAWS CLIで変更してみた

# ・概要

RDSの可用性設定は以下２種類があります。
　シングルAZ構成
　マルチAZ構成

可用性設定はRDSマネジメントコンソール上で変更することができます。
https://zenn.dev/mn87/articles/668d1df1c2f9d2

また、AWS CLIの「modify-db-instance」で可用性設定を変更することも可能です。
https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html

マネジメントコンソールから可用性設定を変更する方法が記載された記事はいくつかありますが、AWS CLIを使った可用性設定変更の記事はあまりないので、そっちのナレッジを増やすべく、実際に検証・記事にしました。
以下では、AWS CLIによる可用性設定変更方法を記載しますが、本記事では以下2パターンの方法を記載します。
　・シングルAZ→マルチAZに変更
　・マルチAZ→シングルAZに変更

# AWS CLIによるRDS可用性設定変更方法

## ・使用するコマンド

modify-db-instanceコマンドを使用して、RDSの設定を変更します。
本記事で使用する各パラメーターの概要を以下に示します。
　--db-instance-identifier：RDSの識別子
　--multi-az：RDSをマルチAZ構成に変更
　--no-multi-az：RDSをシングルAZ構成に変更
　--apply-immediately：設定変更をすぐに適用


## ・シングルAZ→マルチAZに変更

以下コマンドを実行します。
以下では、--apply-immediatelyを指定しているので、変更が即座に適用されます。
```
aws rds modify-db-instance --db-instance-identifier mysqltest --multi-az --apply-immediately
```

実行後、RDSの構成情報が表示されます。
（最下部に--MORE--と表示されている場合は、Enterキーを押すと更なる構成情報が表示されます）
```
aws rds modify-db-instance --db-instance-identifier mysqltest --multi-az --apply-immediately
{
    "DBInstance": {
        "DBInstanceIdentifier": "mysqltest",
        "DBInstanceClass": "db.t3.micro",
        "Engine": "mysql",
        "DBInstanceStatus": "available",
        "MasterUsername": "admin",
        "Endpoint": {
            "Address": "mysqltest.c6iafgoibqk7.ap-northeast-1.rds.amazonaws.com",
            "Port": 3306,
            "HostedZoneId": "Z24O6O9L7SGTNB"
        },
        "AllocatedStorage": 120,
        "InstanceCreateTime": "2022-09-17T11:33:16.569000+00:00",
        "PreferredBackupWindow": "19:21-19:51",
        "BackupRetentionPeriod": 7,
        "DBSecurityGroups": [],
        "VpcSecurityGroups": [
            {
                "VpcSecurityGroupId": "sg-0800246aa8a16ea87",
                "Status": "active"
            }
        ],
        "DBParameterGroups": [
            {
                "DBParameterGroupName": "default.mysql8.0",
                "ParameterApplyStatus": "in-sync"
            }
        ],
        "AvailabilityZone": "ap-northeast-1a",
        "DBSubnetGroup": {
            "DBSubnetGroupName": "privatesubnetgroup",
            "DBSubnetGroupDescription": "privatesubnetgroup",
            "VpcId": "vpc-0fbabfc0431459450",
            "SubnetGroupStatus": "Complete",
            "Subnets": [
                {
                    "SubnetIdentifier": "subnet-0eb27b9f5cc1d4a42",
                    "SubnetAvailabilityZone": {
                        "Name": "ap-northeast-1a"
                    },
                    "SubnetOutpost": {},
                    "SubnetStatus": "Active"
                },
                {
                    "SubnetIdentifier": "subnet-031ecece5859504e8",
                    "SubnetAvailabilityZone": {
                        "Name": "ap-northeast-1c"
                    },
                    "SubnetOutpost": {},
                    "SubnetStatus": "Active"
                }
            ]
        },
        "PreferredMaintenanceWindow": "fri:14:30-fri:15:00",
        "PendingModifiedValues": {
            "MultiAZ": true
        },
        "LatestRestorableTime": "2022-09-17T11:40:01+00:00",
        "MultiAZ": false,
        "EngineVersion": "8.0.28",
        "AutoMinorVersionUpgrade": true,
        "ReadReplicaDBInstanceIdentifiers": [],
        "LicenseModel": "general-public-license",
        "OptionGroupMemberships": [
            {
                "OptionGroupName": "default:mysql-8-0",
                "Status": "in-sync"
            }
        ],
        "PubliclyAccessible": false,
        "StorageType": "gp2",
        "DbInstancePort": 0,
        "StorageEncrypted": true,
        "KmsKeyId": "arn:aws:kms:ap-northeast-1:0123456789012:key/843b51ef-4bc3-4703-8802-2a0437bffffc",
        "DbiResourceId": "db-23ESG3ORGT6OHVDF5LACVKABYE",
        "CACertificateIdentifier": "rds-ca-2019",
        "DomainMemberships": [],
        "CopyTagsToSnapshot": true,
        "MonitoringInterval": 0,
        "DBInstanceArn": "arn:aws:rds:ap-northeast-1:0123456789012:db:mysqltest",
        "IAMDatabaseAuthenticationEnabled": false,
        "PerformanceInsightsEnabled": false,
        "DeletionProtection": false,
        "AssociatedRoles": [],
        "TagList": [],
        "CustomerOwnedIpEnabled": false,
        "BackupTarget": "region"
    }
}
```

マネジメントコンソールに移動し、以下の状態になっていればマルチAZ構成になっています（設定変更には10~15分程度かかります）。
　ステータスが「利用可能」
　当該RDSのマルチAZが「あり」

![マルチAZ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/bcec9057-2bbb-ad50-ab87-d18a9f4b894b.png)


## ・マルチAZ→シングルAZに変更

以下コマンドを実行します。

```
aws rds modify-db-instance --db-instance-identifier mysqltest --no-multi-az --apply-immediately
```

実行後、RDSの構成情報が表示されます。
```
aws rds modify-db-instance --db-instance-identifier mysqltest --no-multi-az --apply-immediately
{
    "DBInstance": {
        "DBInstanceIdentifier": "mysqltest",
        "DBInstanceClass": "db.t3.micro",
        "Engine": "mysql",
        "DBInstanceStatus": "available",
        "MasterUsername": "admin",
        "Endpoint": {
            "Address": "mysqltest.c6iafgoibqk7.ap-northeast-1.rds.amazonaws.com",
            "Port": 3306,
            "HostedZoneId": "Z24O6O9L7SGTNB"
        },
        "AllocatedStorage": 120,
        "InstanceCreateTime": "2022-09-17T23:13:13.155000+00:00",
        "PreferredBackupWindow": "19:21-19:51",
        "BackupRetentionPeriod": 7,
        "DBSecurityGroups": [],
        "VpcSecurityGroups": [
            {
                "VpcSecurityGroupId": "sg-0800246aa8a16ea87",
                "Status": "active"
            }
        ],
        "DBParameterGroups": [
            {
                "DBParameterGroupName": "default.mysql8.0",
                "ParameterApplyStatus": "in-sync"
            }
        ],
        "AvailabilityZone": "ap-northeast-1a",
        "DBSubnetGroup": {
            "DBSubnetGroupName": "privatesubnetgroup",
            "DBSubnetGroupDescription": "privatesubnetgroup",
            "VpcId": "vpc-0fbabfc0431459450",
            "SubnetGroupStatus": "Complete",
            "Subnets": [
                {
                    "SubnetIdentifier": "subnet-0eb27b9f5cc1d4a42",
                    "SubnetAvailabilityZone": {
                        "Name": "ap-northeast-1a"
                    },
                    "SubnetOutpost": {},
                    "SubnetStatus": "Active"
                },
                {
                    "SubnetIdentifier": "subnet-031ecece5859504e8",
                    "SubnetAvailabilityZone": {
                        "Name": "ap-northeast-1c"
                    },
                    "SubnetOutpost": {},
                    "SubnetStatus": "Active"
                }
            ]
        },
        "PreferredMaintenanceWindow": "fri:14:30-fri:15:00",
        "PendingModifiedValues": {},
        "LatestRestorableTime": "2022-09-17T23:56:22+00:00",
        "MultiAZ": true,
        "EngineVersion": "8.0.28",
        "AutoMinorVersionUpgrade": true,
        "ReadReplicaDBInstanceIdentifiers": [],
        "LicenseModel": "general-public-license",
        "OptionGroupMemberships": [
            {
                "OptionGroupName": "default:mysql-8-0",
                "Status": "in-sync"
            }
        ],
        "SecondaryAvailabilityZone": "ap-northeast-1c",
        "PubliclyAccessible": false,
        "StorageType": "gp2",
        "DbInstancePort": 0,
        "StorageEncrypted": true,
        "KmsKeyId": "arn:aws:kms:ap-northeast-1:0123456789012:key/843b51ef-4bc3-4703-8802-2a0437bffffc",
        "DbiResourceId": "db-XN5DEW36MFJXALZUR7J626S25A",
        "CACertificateIdentifier": "rds-ca-2019",
        "DomainMemberships": [],
        "CopyTagsToSnapshot": true,
        "MonitoringInterval": 0,
        "DBInstanceArn": "arn:aws:rds:ap-northeast-1:0123456789012:db:mysqltest",
        "IAMDatabaseAuthenticationEnabled": false,
        "PerformanceInsightsEnabled": false,
        "DeletionProtection": false,
        "AssociatedRoles": [],
        "TagList": [],
        "CustomerOwnedIpEnabled": false,
        "BackupTarget": "region"
    }
}
```

マネジメントコンソールに移動し、以下の状態になっていればシングルAZ構成になっています（設定変更には10~15分程度かかります）。
　ステータスが「利用可能」
　当該RDSのマルチAZが「なし」
![シングルAZ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/264a4255-36e9-845a-722f-9e5358d2438f.png)


# ・最後に

使用するRDSが増えるにつれて、それらの運用保守の作業負荷は高まります。
AWS CLIを使えば、コマンド1つで実行できるので、マネジメントコンソールでやるよりも作業時間は短縮されます。
作業時間を短縮することで作業負荷を減らし、システムの改善等、現状をより良くするための取り組みにリソースを充てることが大事です。
今回はRDSの可用性設定変更をAWS CLIで実施しましたが、運用時にやりそうな、別の設定変更も記事にする予定です。

# ・参考

https://zenn.dev/mn87/articles/668d1df1c2f9d2
https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html