AWSのリソースを作成するときはマネジメントコンソール画面で行うことが多いかと思います。
マネジメントコンソールではなく、AWS CLIでもさまざまなAWS環境を構築することが可能です。
今回はAWS CLIでRDSのDBインスタンスを作成する環境を構築します。
また、DBインスタンスの作成に必要なVPCやサブネットグループ等も作成していきます。
AWS CLIを使用するとマネジメントコンソールよりも複雑になってしまいますが、細かい部分までパラメータで指定する必要があるのでいい勉強になるのでぜひトライしてみましょう!
今回は無料利用枠の範囲内のパラメータを使用するので、安心して実行してください。
以下の記事では、現役のAWSエンジニア目線でAWSが学べるスクールを4つ厳選したのでぜひ参考にしてください。
最終構成
今回構築するのは最終的に以下のような構成です。
以下のリソースを作成していきます。
リソース | 記事内でのIDの表記 | 備考 |
---|---|---|
VPC | vpc-123456 | リージョン:ap-northeast-1 CIDR:10.0.0.0/16 |
プライベートサブネット | subnet-aaaaaa | アベイラビリティゾーン:ap-northeast-1a CIDR:10.0.1.0/24 |
プライベートサブネット | subnet-aaaaaa | アベイラビリティゾーン:ap-northeast-1c CIDR:10.0.3.0/24 |
サブネットグループ | my-db-subnet-group | 上記2つのサブネットを関連づけたグループ |
セキュリティグループ | sg-123456 | 内容はデフォルトのまま |
DBインスタンス | my-rds-db | 作成対象のDBインスタンス |
VPC、サブネット、セキュリティグループの作成
まずは、RDSインスタンスの作成に必要な以下のリソースを作成します。
お手持ちですでにこれらのリソースがある人は、ない分だけ作成でもいいです。
- VPC
- プライベートサブネット(2つのアベイラビリティゾーンに1つずつ)
- サブネットグループ
- セキュリティグループ
VPCの作成
デフォルトのVPCでもいいですが、別途作成したい方はaws ec2 create-vpc
コマンドで。
$ aws ec2 create-vpc --cidr-block 10.0.0.0/16 --query Vpc.VpcId --output text
上記コマンドのパラメータ等の詳細は以下で紹介しているので、興味があればぜひ読んでみてください。
今回は上記で作成したVPCがあればOKです。
サブネットの作成
RDSを起動するにはサブネットグループとして複数アベイラビリティゾーン(AZ)のサブネットが必要になるので、ap-northeast-1aとap-northeast-1cのそれぞれプライベートサブネットを作成します。
サブネットの作成はaws ec2 create-subnet
コマンドを使いましょう。
CIDRは何でもいいですが、10.0.1.0/24と10.0.3.0/24にしました。
aws ec2 create-subnet \
--vpc-id vpc-123456 \
--cidr-block 10.0.1.0/24 \
--availability-zone ap-northeast-1a \
--query Subnet.SubnetId --output text
aws ec2 create-subnet \
--vpc-id vpc-123456 \
--cidr-block 10.0.3.0/24 \
--availability-zone ap-northeast-1c \
--query Subnet.SubnetId --output text
aws ec2 create-subnet
コマンドの詳細もVPCの記事に記載しています。
サブネットグループの作成
RDSインスタンスを起動するには、複数のサブネットをまとめたサブネットグループというものが必要になります。aws rds create-db-subnet-group
コマンドで、サブネットグループの作成が可能です。
パラメータは以下の通りです。
パラメータ | 内容 | 設定値例 |
---|---|---|
–db-subnet-group-name | サブネットグループ名 | 任意の文字列 |
–db-subnet-group-description | サブネットの説明 | 任意の文字列 |
–subnet-ids | サブネットグループに関連づけるサブネットIDの一覧(スペース区切りで並べる) | subnet-aaaaaa subnet-cccccc |
今回はmy-db-subnet-groupという名前のサブネットグループを以下のように作成します。
(subnet-aaaaaaはap-notheast-1aのサブネット、subnet-ccccccはap-notheast-1cのサブネットを表す)
aws rds create-db-subnet-group \
--db-subnet-group-name my-db-subnet-group \
--db-subnet-group-description "Subnet group for RDS" \
--subnet-ids subnet-aaaaaa subnet-cccccc
マネジメントコンソール画面で実際に確認すると、ちゃんと設定した内容でサブネットグループが作成されていることがわかります。
セキュリティグループの作成
セキュリティグループをaws ec2 create-security-group
コマンドで作成します。
このセキュリティグループは、RDSのDBインスタンスにアタッチするセキュリティグループです。aws ec2 create-security-group
コマンドのパラメータは、以下のものを使用します。
パラメータ | 内容 | 設定値例 |
---|---|---|
–group-name | セキュリティグループ名 | 任意の文字列 |
–description | セキュリティグループの説明 | 任意の文字列 |
–vpc-id | セキュリティグループを作成するVPCのID | vpc-xxxxxx |
rds-sgという名前のセキュリティグループを作成します。
$ aws ec2 create-security-group \
--group-name rds-sg \
--description "Security group for RDS" \
--vpc-id vpc-123456
返ってくるセキュリティグループのIDを控えておいてください。
DBインスタンスを作成する
ここまででやっと事前準備が完了しました。
では続いてDBインスタンスをaws cliで作成していきましょう。
一応、RDSのAWS CLIコマンドの公式ドキュメントはこちらです。
DBインスタンスの作成
aws rds create-db-instance
コマンドでDBインスタンスを作成できます。
このコマンドで今回使用するパラメータは以下の通りです。
パラメータが多いですが、マネジメントコンソール画面で構築するときも様々なパラメータを設定する必要があります。
パラメータ | 内容 | 設定値例 |
---|---|---|
–db-instance-identifier | DBインスタンス名 | 任意の文字列 |
–db-instance-class | インスタンスタイプ(DBの性能) | db.t3.microなど |
–vpc-security-group-ids | RDSにアタッチするセキュリティグループID | sg-xxxxxx |
–db-subnet-group | RDSインスタンスに関連づけるサブネットグループ | |
–engine | 使用するDBエンジン名 | mysqlなど |
–master-username | マスターアカウントのユーザー名 | adminなど |
–master-user-password | マスターアカウントのパスワード | |
–allocated-storage | ストレージの割り当て | 200など |
–backup-retention-period | DB インスタンスの自動バックアップを保持する日数 | 3など |
では、my-rds-dbというインスタンスを作成します。
ユーザー名とパスワードはもっとマシなものにした方がいいです。
$ aws rds create-db-instance \
--db-instance-identifier my-rds-db \
--db-instance-class db.t3.micro \
--vpc-security-group sg-123456 \
--db-subnet-group my-db-subnet-group \
--engine mysql \
--master-username admin \
--master-user-password adminadmin \
--allocated-storage 200 \
--backup-retention-period 3
DBインスタンスの作成には結構時間がかかるので気長に待ちましょう。
DBインスタンスの状態の確認
インスタンスの状態はaws rds describe-db-instances
コマンドで、--db-instance-identifier
パラメータにさきほどのDBインスタンス名(今回だとmy-rds-db)を指定すれば確認できます。
$ aws rds describe-db-instances \
--db-instance-identifier my-rds-db
このコマンドを実行すると、DBインスタンスの詳細がずらっと表示されます。
その中で、DBInstancesのDBInstanceStatusというところが作成状況です。
ここがavailableになれば、作成完了しています。
ちなみに、--query
パラメータを使用すれば、コマンドの出力のうち、必要なパラメータだけ取り出すことが可能です。
$ aws rds describe-db-instances \
--db-instance-identifier my-rds-db \
--query 'DBInstances[].DBInstanceStatus' --output text
DBインスタンスのエンドポイントも同様にaws rds describe-db-instances
コマンドの結果に、DBInstances.Endpointというパラメータに含まれています。
aws rds describe-db-instances \
--db-instance-identifier my-rds-db \
--query 'DBInstances[].Endpoint.Address' --output text
マネジメントコンソールでDBインスタンスを確認
ちゃんとDBインスタンスができているのか、マネジメントコンソール画面で確認しておきます。
以下のように、指定した識別子のDBインスタンスが作成できていることを確認できました。
ちなみに、「リージョンとAZ」に記載されている、DBインスタンスが立ち上がったAZは、サブネットグループのサブネットのうち自動でどちらかに設定されるので、ap-northeast-1aの方もいらっしゃるかもしれません。
DBインスタンスを削除する
最後に、作成したDBインスタンスを削除しておきましょう。
DBインスタンスの削除はaws rds delete-db-instance
コマンドで行えます。
–db-instance-identifierパラメータはいつものようにDBインスタンスの名前です。
–skip-final-snapshotというパラメータがありますが、これはDBインスタンスの削除前にスナップショット(バックアップ)を必要としないという意味のパラメータです。
$ aws rds delete-db-instance --db-instance-identifier my-rds-db --skip-final-snapshot
上記コマンド実行後、aws rds describe-db-instancesコマンドでDBインスタンスの状態を確認すると、deletingになります。
しばらくすると、削除が完了します。
$ aws rds describe-db-instances \
--db-instance-identifier my-rds-db \
--query 'DBInstances[].DBInstanceStatus' --output text
EC2からRDSにログインする
続いて、EC2からRDSにログインし、MySQLのクエリを実行するまでを確認します。
EC2インスタンスの作成方法までは紹介しないので、別途作成して頂くか、以下の記事を参考にまずはEC2インスタンスを作成しておいてください。
セキュリティグループの編集
RDSインスタンスに設定したセキュリティグループのインバウンドルールに、ログイン用のルールを追加する必要があります。
セキュリティグループへのインバウンドルールの追加はaws ec2 authorize-security-group-ingress
コマンドが使用できます。
今回使用するパラメータは以下の通りです。
パラメータ | 内容 | 設定値例 |
---|---|---|
–group-id | セキュリティグループID | sg-xxxxxx |
–protocol | 追加するルールのプロトコル(tcp/udp/icmp) | tcp |
–port | 追加するルールのポート番号(MySQLの場合は3306) | 3306 |
–source-group | 追加するルールのソースとなるセキュリティグループ | sg-yyyyyy |
–cidr | 追加するルールのソースとなるCIDR | 0.0.0.0/0 |
MySQLのDBインスタンスの場合はプロトコルをtcp、ポート番号を3306に指定してください。
また、ルールのソース(アクセス元)の指定はセキュリティグループを指定する方法と、CIDRを指定する方法があります。
EC2などのAWSリソースからの接続には基本的にはセキュリティグループを使用するといいです。
EC2にアタッチしているセキュリティグループをRDSのセキュリティグループのソースに指定することで、EC2からの接続を許可するようになります。(以下のsg-yyyyyyはEC2にアタッチしているセキュリティグループを表す)
aws ec2 authorize-security-group-ingress \
--group-id sg-123456 \
--protocol tcp \
--port 3306 \
--source-group sg-yyyyyy
一方で、一応CIDRを指定する方法もあります。
0.0.0.0/0のようにフルオープンはセキュリティ上あまりおすすめしませんが、一応それでも接続は可能です。
また、EC2のプライベートIPアドレスを指定する方法もあります。(12.34.56.78/32のように)
今回RDSインスタンスはプライベートサブネットに配置しているため、EC2のパブリックIPアドレスを指定しても接続できないことには注意してください。
RDSエンドポイントの取得
aws rds describe-db-instances
コマンドでRDSインスタンスのエンドポイント(接続先)を取得します。
$ aws rds describe-db-instances \
--db-instance-identifier my-rds-db \
--query 'DBInstances[].Endpoint.Address' --output text
mysqlコマンドのインストール
MySQLに接続するにはクライアント側(EC2側)で
[ec2-user]$はEC2上で実行するコマンドと思ってください。
[ec2-user]$ sudo yum install mysql -y
RDSへの接続
いよいよRDSのDBインスタンスに接続します。
mysqlコマンドを使用することでRDSへの接続が可能です。
-hパラメータには先ほど取得したDBインスタンスのエンドポイント、-uパラメータにはRDSインスタンス生成時に指定したユーザー名を指定します。
最後に-pオプションを付けることでパスワードが聞かれるので、RDSインスタンス生成時に指定したパスワードを入力してEnterを実行してください。
[ec2-user]$ mysql -h {RDSインスタンスのエンドポイント} -u admin -p
Enter password:
以下のような画面になり、プロンプトがMSQL [none]>
になっていれば成功です。
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 28
Server version: 8.0.28 Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>
試しに簡単なMySQLのSQLを実行してみます。
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
このようにMySQLのクエリも成功しました!
ログアウトするときはexit
コマンドか、Ctrl+C
でEC2に戻れます。
まとめ
今回はAWS CLIを使用してRDSのDBインスタンスを作成しました。
さらに、EC2からRDSのインスタンスに接続し、簡単ではありますがSQLを実行することができました。
マネジメントコンソールだともう少し分かりやすく作成できますが、AWS CLIを使うことでRDS作成に必要なパラメータなどをより詳しく理解できるかと思います。
TerraformやCloudFormationなどのIaCツールでも、同様に細かいパラメータ等を調べて構築する必要があり、勉強になると思いますのでぜひトライしてみてください。
もっと詳しくAWSを知るには
さらにAWSを詳しく知りたいという方は、スクールでAWSを学ぶのもおすすめです。
AWSをスクールで学習するのは、以下のメリットがあります。
- 必要最低限のサービスを厳選して学習できる
- ハンズオン形式で効率的に学習できる
- AWS以外のエンジニアに必要なスキルも同時に学習できる
以下の記事では、AWSが学べるスクールを現役のエンジニア目線で4つに厳選してランキングしているので、ぜひ参考にしてみてください。
コメント