AWS Aurora Mysql をCLIで作成

## 問題

AWS内で製品やその製品とそのハードとの互換性が定期的に更新されるため、コマンドラインで用意したパラメーターがいずれ無効になる可能性がある。


```zsh
aws rds create-db-instance \
--db-instance-identifier ＜⭐️識別子⭐️＞ \
--engine ＜⭐️エンジン⭐️＞ \
--db-instance-class ＜⭐️インスタンスクラス⭐️＞ \
--master-username ユーザー名 \
--master-user-password ユーザーパスワード \
--allocated-storage ギガバイト \
--backup-retention-period バックアップ期間
```

> An error occurred (InvalidParameterCombination) when calling the CreateDBInstance operation: RDS does not support creating a DB instance with the following combination: DBInstanceClass=db.t2.micro, Engine=aurora-mysql, EngineVersion=5.7.mysql_aurora.2.11.2, LicenseModel=general-public-license. For supported combinations of instance class and database engine version, see the documentation.

## 解決

それぞれのRDBの作成に必要なパラメーターを調べる。ブラウザーで調べても面白くないのでCLIで取得. 

- 公式ドキュメント: [AWS Documentation > Amazon RDS > User Guide for Aurora > Aurora DB instance classes](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.DBInstanceClass.html)


### ① エンジンを調べる

```zsh
aws rds describe-db-engine-versions \
    --output table \
    --query "DBEngineVersions[].{Engine:Engine,EngineVersion:EngineVersion,DBEngineVersionDescription:DBEngineVersionDescription}"
```

上記でエンジンとエンジンバージョンを取得(2023/06/26時点の結果の一部のみ搭載)

| DBEngineVersionDescription | Engine | EngineVersion |
|---|---|---|
| ... | | |
  Aurora MySQL 3.01.0 (compatible with MySQL 8.0.23)   |  aurora-mysql         |  8.0.mysql_aurora.3.01.0             |
|  Aurora MySQL 3.01.1 (compatible with MySQL 8.0.23)   |  aurora-mysql         |  8.0.mysql_aurora.3.01.1             |
|  Aurora MySQL 3.02.0 (compatible with MySQL 8.0.23)   |  aurora-mysql         |  8.0.mysql_aurora.3.02.0             |
|  Aurora MySQL 3.02.1 (compatible with MySQL 8.0.23)   |  aurora-mysql         |  8.0.mysql_aurora.3.02.1             |
| ... | | |


<font color="DeepPink">エンジン = aurora-mysqlとエンジンバージョン = 8.0.mysql_aurora.3.01.0が分かった！</font>

### ② インスタンスクラスを調べる

上記のコマンでで好みのエンジンとエンジンバージョンを指定し

```zsh
aws rds describe-orderable-db-instance-options \
    --engine aurora-mysql \
    --engine-version "8.0.mysql_aurora.3.01.0" \
    --query "OrderableDBInstanceOptions[].{DBInstanceClass:DBInstanceClass,SupportedEngineModes:SupportedEngineModes[0],EngineVersion:EngineVersion}" \
    --output table \
    --region ap-northeast-1
```

対応するインスタンスクラスを取得(2023/06/26時点の結果)

| DBInstanceClass |       EngineVersion       | SupportedEngineModes   |
|---|---|---|
|  db.r5.12xlarge |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.r5.16xlarge |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.r5.24xlarge |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.r5.2xlarge  |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.r5.4xlarge  |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.r5.8xlarge  |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.r5.large    |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.r5.xlarge   |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.r6g.12xlarge|  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.r6g.16xlarge|  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.r6g.2xlarge |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.r6g.4xlarge |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.r6g.8xlarge |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.r6g.large   |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.r6g.xlarge  |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.t3.large    |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.t3.medium   |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.t4g.large   |  8.0.mysql_aurora.3.01.0  |  provisioned           |
|  db.t4g.medium  |  8.0.mysql_aurora.3.01.0  |  provisioned           |

安価なものがほしいから<font color="DeepPink">インスタンスクラス = db.t3.mediumが分かった！</font>


さて！　今まで分かったパラメーターだけで作成できそう！　実際にcreate-db-instanceコマンドを叩くとと allocated-storage不正エラーに遭遇してしまう。

> An error occurred (InvalidParameterCombination) when calling the CreateDBInstance operation: Invalid storage size for engine name aurora-mysql and storage type aurora: 20

https://github.com/aws/aws-sdk-go/issues/3222

Githubの問題の通り、db cluster identifierを指定するが、そのためにdb clusterを作成する必要がある。


### ③ 今まで分かったパラメータ一覧


| パラメーター名 | 値 | 備考 |
|---|---|---|
| エンジン | <font color="DeepPink"><code>aurora-mysql</code></font> | ClusterとInstance作成時両方必要 |
| エンジンバージョン | <font color="DeepPink"><code>8.0.mysql_aurora.3.01.0</code></font> | Cluster作成時必要 | 
| インスタンスクラス | <font color="DeepPink"><code>db.t3.medium</code></font> | Instance作成時に必要 | 
| DBクラスターID | <font color="DeepPink"><code>my-db</code></font> | 自分で決める。ClusterとInstance作成時両方必要 |
| DBインスタンスID | <font color="DeepPink"><code>my-db-instance</code></font> | 自分で決める。Instance作成時に必要 | 

### ④ Clusterを作成!

エンジンとエンジンバージョンを指定して実行！

```zsh
aws rds create-db-cluster \
    --engine aurora-mysql \
    --engine-version "8.0.mysql_aurora.3.01.0" \
    --master-username adminAurora \
    --master-user-password adminAuroraPassword \
    --db-cluster-identifier my-db
```

```
{
    "DBCluster": {
        "AllocatedStorage": 1,
        "AvailabilityZones": [
            "ap-northeast-1c",
            "ap-northeast-1a",
            "ap-northeast-1d"
        ],
        "BackupRetentionPeriod": 1,
        "DBClusterIdentifier": "my-db",
        "DBClusterParameterGroup": "default.aurora-mysql8.0",
        "DBSubnetGroup": "default",
        "Status": "creating",
        "Endpoint": "my-db.cluster-xyz1.ap-northeast-1.rds.amazonaws.com",
        "ReaderEndpoint": "my-db.cluster-ro-xyz1.ap-northeast-1.rds.amazonaws.com",
        "MultiAZ": false,
        "Engine": "aurora-mysql",
        "EngineVersion": "8.0.mysql_aurora.3.01.0",
        "Port": 3306,
        "MasterUsername": "adminAurora",
        "PreferredBackupWindow": "17:52-18:22",
        "PreferredMaintenanceWindow": "fri:16:36-fri:17:06",
        "ReadReplicaIdentifiers": [],
        "DBClusterMembers": [],
        "VpcSecurityGroups": [
            {
                "VpcSecurityGroupId": "sg-abc",
                "Status": "active"
            }
        ],
        "HostedZoneId": "Z24O6O9L7SGTNB",
        "StorageEncrypted": false,
        "DbClusterResourceId": "cluster-Ddef",
        "DBClusterArn": "arn:aws:rds:ap-northeast-1:999:cluster:my-db",
        "AssociatedRoles": [],
        "IAMDatabaseAuthenticationEnabled": false,
        "ClusterCreateTime": "2023-06-26T10:19:22.490000+00:00",
        "EngineMode": "provisioned",
        "DeletionProtection": false,
        "HttpEndpointEnabled": false,
        "CopyTagsToSnapshot": false,
        "CrossAccountClone": false,
        "DomainMemberships": [],
        "TagList": [],
        "AutoMinorVersionUpgrade": true,
        "NetworkType": "IPV4"
    }
}
```


### ④ RDS Instanceを作成！


注意: Clusterの方で既にユーザー名とパスワードを指定しているので create-db-instanceの時に指定しない。指定してしまうと怒られる。

> An error occurred (InvalidParameterCombination) when calling the CreateDBInstance operation: The requested DB Instance will be a member of a DB Cluster. Set master user password for the DB Cluster.

成功するコマンド:


```zsh
aws rds create-db-instance \
    --db-instance-identifier my-db-instance \
    --db-cluster-identifier my-db \
    --engine aurora-mysql \
    --db-instance-class db.t3.medium  
```
結果:

```
{
    "DBInstance": {
        "DBInstanceIdentifier": "my-db-instance",
        "DBInstanceClass": "db.t3.medium",
        "Engine": "aurora-mysql",
        "DBInstanceStatus": "creating",
        "MasterUsername": "adminAurora",
        "AllocatedStorage": 1,
        "PreferredBackupWindow": "17:52-18:22",
        "BackupRetentionPeriod": 1,
        "DBSecurityGroups": [],
        "VpcSecurityGroups": [
            {
                "VpcSecurityGroupId": "sg-stu",
                "Status": "active"
            }
        ],
        "DBParameterGroups": [
            {
                "DBParameterGroupName": "default.aurora-mysql8.0",
                "ParameterApplyStatus": "in-sync"
            }
        ],
        "DBSubnetGroup": {
            "DBSubnetGroupName": "default",
            "DBSubnetGroupDescription": "default",
            "VpcId": "vpc-def",
            "SubnetGroupStatus": "Complete",
            "Subnets": [
                {
                    "SubnetIdentifier": "subnet-abc123",
                    "SubnetAvailabilityZone": {
                        "Name": "ap-northeast-1c"
                    },
                    "SubnetOutpost": {},
                    "SubnetStatus": "Active"
                },
                {
                    "SubnetIdentifier": "subnet-abc789",
                    "SubnetAvailabilityZone": {
                        "Name": "ap-northeast-1a"
                    },
                    "SubnetOutpost": {},
                    "SubnetStatus": "Active"
                },
                {
                    "SubnetIdentifier": "subnet-abc567",
                    "SubnetAvailabilityZone": {
                        "Name": "ap-northeast-1d"
                    },
                    "SubnetOutpost": {},
                    "SubnetStatus": "Active"
                }
            ]
        },
        "PreferredMaintenanceWindow": "thu:19:56-thu:20:26",
        "PendingModifiedValues": {},
        "MultiAZ": false,
        "EngineVersion": "8.0.mysql_aurora.3.01.0",
        "AutoMinorVersionUpgrade": true,
        "ReadReplicaDBInstanceIdentifiers": [],
        "LicenseModel": "general-public-license",
        "OptionGroupMemberships": [
            {
                "OptionGroupName": "default:aurora-mysql-8-0",
                "Status": "in-sync"
            }
        ],
        "PubliclyAccessible": false,
        "StorageType": "aurora",
        "DbInstancePort": 0,
        "DBClusterIdentifier": "my-db",
        "StorageEncrypted": false,
        "DbiResourceId": "db-XYZ123",
        "CACertificateIdentifier": "rds-ca-2019",
        "DomainMemberships": [],
        "CopyTagsToSnapshot": false,
        "MonitoringInterval": 0,
        "PromotionTier": 1,
        "DBInstanceArn": "arn:aws:rds:ap-northeast-1:99966:db:my-db-instance",
        "IAMDatabaseAuthenticationEnabled": false,
        "PerformanceInsightsEnabled": false,
        "DeletionProtection": false,
        "AssociatedRoles": [],
        "TagList": [],
        "CustomerOwnedIpEnabled": false,
        "BackupTarget": "region",
        "NetworkType": "IPV4",
        "StorageThroughput": 0,
        "CertificateDetails": {
            "CAIdentifier": "rds-ca-2019"
        }
    }
}
```

出来上がり！

![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83390/eb331ffe-0c59-037a-91a6-be67da144ae0.png)



### ⑤ VPC設定関連

Instanceを作成する際に 

本当は--vpc-security-group-idsを指定し　アクセスを制御する方がいいが、

外から試しに色々と叩きたい時はぜひ `--public accessible`をパスして + 設定されているVPCのinboundの設定をする。

- [Configure private and public Aurora Endpoints in the Amazon RDS console.](https://repost.aws/knowledge-center/aurora-private-public-endpoints).
- [Fix Connectivity to an RDS Instance that uses VPC's subnet](https://repost.aws/knowledge-center/rds-connectivity-instance-subnet-vpc)

AWS Cloudshell から試す場合は curl http://checkip.amazonaws.com/ などを使ってIPを取得して Inbound rulesに適用。

https://teleporter.hateblo.jp/entry/2019/03/27/155537

#### 他の参考になったリンク

https://www.capybara-engineer.com/entry/2022/01/21/155422

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.CreateInstance.html

https://dev.classmethod.jp/articles/aws-you-may-not-specify-a-referenced-group-id-for/

https://qiita.com/ki_87/items/494059f5c0c5dbd8ff44