Amazon RDS(Relational Database Service)を使うと、データベースサーバを OS から用意しなくても、AWS のコンソールからデータベースを作れます。この記事では RDS の概要を整理したうえで、MySQL エンジンの RDS をプライベートサブネットに作り、EC2 から MySQL 8.0 に接続するところまでを確かめます。
- RDS がマネージドで受け持つ範囲と、利用者が設定する3つのグループ
- RDS をプライベートサブネットに置くための準備(サブネット、セキュリティグループ)
- サブネットグループ、パラメータグループ、オプショングループと DB インスタンスの作成手順
- EC2 から RDS のエンドポイントに mysql コマンドで接続する方法
RDS の概要
RDS はフルマネージドのデータベースサービスです。バックアップ、ソフトウェアのパッチ適用、障害の検知と復旧は AWS が受け持ちます。一方で、SQL の作り方やデータの設計、性能のチューニングは利用者の担当です。
マネージドサービスなので、RDS の DB インスタンスには SSH などで OS にログインできません。データベースへは、mysql コマンドなどの SQL クライアントで接続します。OS の設定ファイル(MySQL なら my.cnf)を直接書き換える代わりに、次のグループで設定を渡します。
| グループ | 何を設定するか |
|---|---|
| パラメータグループ | データベースエンジンの設定値(パラメータ)をまとめたものです。デフォルトのパラメータグループは値を変えられないので、値を変えたい場合は自分で作って DB インスタンスに関連付けます。 |
| オプショングループ | データベースエンジンが持つ追加機能(オプション)を有効にし、その設定をするものです。デフォルトのオプショングループは空で、変更も削除もできません。 |
| サブネットグループ | VPC の中で、DB インスタンスを置いてよいサブネットの集まりです。2つ以上のアベイラビリティゾーン(AZ)のサブネットを入れる必要があります。 |
この3つと、通信を許可するセキュリティグループを先に作っておき、DB インスタンスの作成時に選んで関連付けます。
検証時(2021年8月)に選べたエンジンは、Amazon Aurora、MySQL、MariaDB、PostgreSQL、Oracle、Microsoft SQL Server の6つです。この記事では MySQL 8.0 を使います。
現在の RDS では、IBM Db2 も選べるエンジンに加わっています。また、RDS for MySQL 8.0 の標準サポートは 2026年7月31日に終わり、今は有償の RDS 延長サポート(2029年7月31日まで)でだけ使えます。この記事で使った 8.0.25 も、今は選べるマイナーバージョンに入っていません。これから作る場合は MySQL 8.4 を検討してください。
RDS 構築(検証環境)
この記事の構成です。VPC(MyVPC)のパブリックサブネットに EC2 を置き、作業 PC から SSH で入ります。RDS はインターネットから届かないプライベートサブネットに置き、EC2 からの MySQL の通信(TCP 3306)だけを許可します。
プライベートサブネットを用意する
データベースは、セキュリティのためにインターネットから接続できないプライベートサブネットに置くのが基本です。また、サブネットグループには2つ以上の AZ のサブネットが必要なので、ap-northeast-1a に 10.0.2.0/24、ap-northeast-1c に 10.0.22.0/24 のプライベートサブネットを作っておきます。
この記事の画面は、実際の画面ではなく、検証時の画面から設定する項目(見るポイント)を抜き出して描いたイメージです。AWS のコンソールは画面の構成や表記がよく変わるので、今の画面とは違う場合があります。サブネットやセキュリティグループなどの ID は省いています。
| Name | IPv4 CIDR | アベイラビリティーゾーン |
|---|---|---|
| 1private-subnet-1a | 10.0.2.0/24 | ap-northeast-1a |
| private-subnet-1c | 10.0.22.0/24 | ap-northeast-1c |
| public-subnet-1a | 10.0.1.0/24 | ap-northeast-1a |
| public-subnet-1c | 10.0.11.0/24 | ap-northeast-1c |
サブネットの作り方は、次の記事を参考にしてください。
セキュリティグループを作る
RDS には、パブリックサブネットの EC2 からだけ接続できるようにします。EC2 は次の記事で作ったものを使います。この EC2 に適用しているセキュリティグループは EC2-public です。
| Name | パブリック IPv4 アドレス | セキュリティグループ名 |
|---|---|---|
| EC2-public | (伏せています) | 1EC2-public |
次に、RDS に適用するセキュリティグループを作ります。VPC ›› セキュリティグループ ›› セキュリティグループを作成 を開きます。セキュリティグループの考え方は、次の記事で説明しています。
| 1セキュリティグループ名 | DB-Private-sg |
| 説明 | DB-Private-sg |
| 2VPC | MyVPC(10.0.0.0/16) |
| 3タイプ | MYSQL/Aurora |
| プロトコル/ポート範囲 | TCP / 3306 |
| 4ソース | カスタム EC2-public |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | セキュリティグループ名 | 任意の名前です。この記事では DB-Private-sg にします。作成後に名前は変えられません。 |
| 2 | VPC | RDS を置く VPC(MyVPC)を選びます。 |
| 3 | タイプ | MYSQL/Aurora を選ぶと、プロトコル TCP、ポート 3306 が入ります。 |
| 4 | ソース | カスタムで、EC2 のセキュリティグループ EC2-public を選びます。 |
ソースにセキュリティグループを指定すると、そのセキュリティグループが適用されたインスタンスのプライベート IP アドレスからの通信を許可します。EC2 の IP アドレスが変わっても、ルールを書き換える必要がありません。アウトバウンドルールは、作成時に入るすべて許可のルールのままにします。
作成すると、一覧に DB-Private-sg が追加されます。
| セキュリティグループ名 | VPC | 説明 |
|---|---|---|
| 1DB-Private-sg | MyVPC | DB-Private-sg |
サブネットグループを作る
ここから RDS のコンソールで作業します。コンソール上部の検索欄に RDS と入れると、RDS の画面へのリンクが出ます。RDS ›› サブネットグループ ›› DB サブネットグループを作成 を開きます。
| 1名前 | db-subnet-g |
| 説明 | db-subnet-g |
| 2VPC | MyVPC |
| 3アベイラビリティーゾーン | ap-northeast-1a × ap-northeast-1c × | ||||||
| 4サブネット | 10.0.2.0/24 × 10.0.22.0/24 ×
|
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | 名前 | 任意の名前です。この記事では db-subnet-g にします。作成後に名前は変えられません。 |
| 2 | VPC | MyVPC を選びます。作成後に別の VPC には変えられません。 |
| 3 | アベイラビリティーゾーン | ap-northeast-1a と ap-northeast-1c にチェックを入れます。 |
| 4 | サブネット | プライベートサブネットの 10.0.2.0/24 と 10.0.22.0/24 を選びます。下の「選択したサブネット」に2つが表示されます。 |
| 5 | 作成 | クリックすると、サブネットグループが登録されます。 |
今回の DB インスタンスはスタンバイのないシングル AZ ですが、サブネットグループには2つの AZ のサブネットを入れます。あとでマルチ AZ に変えたときや、障害でスタンバイを作り直すときに、RDS はもう一方の AZ のサブネットを使います。
| 名前 | 説明 | ステータス | VPC |
|---|---|---|---|
| db-subnet-g | db-subnet-g | 1 完了 | MyVPC |
ステータスが緑の「完了」になっていれば、サブネットグループは使える状態です。
パラメータグループを作る
RDS ›› パラメータグループ ›› パラメータグループを作成 を開きます。
| 1パラメータグループファミリー | mysql8.0 |
| 2グループ名 | mysql8-pg |
| 説明 | mysql8-pg |
| 名前 | ファミリー | タイプ | 説明 |
|---|---|---|---|
| mysql8-pg | mysql8.0 | DB インスタンスパラメータグループ | mysql8-pg |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | パラメータグループファミリー | 使うエンジンとメジャーバージョンに合わせて mysql8.0 を選びます。ファミリーが違うパラメータグループは、その DB インスタンスに関連付けられません。 |
| 2 | グループ名 | 任意の名前です。この記事では mysql8-pg にします。 |
作ったばかりのパラメータグループの値は、デフォルトと同じです。文字コードやタイムゾーンなど、MySQL の設定を変えたいときは、このパラメータグループの値を編集します。
オプショングループを作る
RDS ›› オプショングループ ›› グループを作成 を開きます。
| 1名前 | mysql8-og |
| 説明 | mysql8-og |
| 2エンジン | mysql |
| メジャーエンジンバージョン | 8.0 |
| 名前 | 説明 | エンジン | エンジンバージョン |
|---|---|---|---|
| mysql8-og | mysql8-og | MySQL Community | 8.0 |
| default:mysql-8-0 | Default option group for mysql 8.0 | MySQL Community | 8.0 |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | 名前 | 任意の名前です。この記事では mysql8-og にします。 |
| 2 | エンジン/メジャーエンジンバージョン | DB インスタンスと同じ mysql と 8.0 を選びます。 |
一覧の default:mysql-8-0 は、RDS が用意しているデフォルトのオプショングループです。デフォルトは変更できないので、あとからオプションを足せるように、自分のオプショングループを作って関連付けておきます。この記事ではオプションは追加しません。
DB インスタンスを作る
RDS ›› データベース ›› データベースの作成 を開きます。作成画面は長いので、前半(エンジンから可用性まで)と後半(接続から追加設定まで)に分けて示します。
| 1作成方法 | ◉ 標準作成○ 簡単に作成 |
| 2エンジンのタイプ | ○ Amazon Aurora◉ MySQL○ MariaDB ○ PostgreSQL○ Oracle○ Microsoft SQL Server |
| バージョン | MySQL 8.0.25 |
| 3テンプレート | ○ 本番稼働用○ 開発/テスト◉ 無料利用枠 |
| 4DB インスタンス識別子 | testdb-1 |
| 5マスターユーザー名 | admin |
| マスターパスワード/確認 | ●●●●●●●●● |
| 6DB インスタンスクラス | ○ 標準クラス (m クラスを含む) ○ メモリ最適化クラス (r クラスと x クラスを含む) ◉ バースト可能クラス (t クラスを含む) db.t2.micro 1 vCPUs 1 GiB RAM |
| ストレージタイプ | 汎用 (SSD) |
| ストレージ割り当て | 20 GiB |
| ストレージの自動スケーリング | ☑ ストレージの自動スケーリングを有効にする |
| 最大ストレージしきい値 | 1000 GiB |
| 7マルチ AZ 配置 | ○ スタンバイインスタンスを作成する (本稼働環境向けに推奨) ◉ スタンバイインスタンスを作成しないでください |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | 作成方法 | 標準作成 を選びます。すべての設定を自分で決める方法で、作っておいたグループをここで選べます。「簡単に作成」は推奨の設定で作り、一部の設定は作成後に変える方法です。 |
| 2 | エンジンのタイプ/バージョン | MySQL を選び、バージョンは検証時に 8.0 系でいちばん新しかった 8.0.25 にします。 |
| 3 | テンプレート | 検証用なので 無料利用枠 を選びます。選べるインスタンスクラスやマルチ AZ が、無料利用枠の範囲に絞られます。 |
| 4 | DB インスタンス識別子 | 任意の名前です。この記事では testdb-1 にします。エンドポイントのホスト名の先頭にもなります。 |
| 5 | マスターユーザー名/パスワード | 接続に使う管理用のユーザーです。この記事では admin にし、パスワードを決めて入れます。 |
| 6 | DB インスタンスクラス | 無料利用枠では、バースト可能クラスの db.t2.micro を選びます。 |
| 7 | マルチ AZ 配置 | 無料利用枠では選べず、スタンバイを作らない設定になります。 |
ストレージはデフォルトのまま(汎用 SSD、20 GiB、自動スケーリングの上限 1000 GiB)にします。本番では、ワークロードに合わせて汎用(m)やメモリ最適化(r)のクラスを選び、マルチ AZ 配置で「スタンバイインスタンスを作成する」を選ぶのが一般的です。マルチ AZ では、別の AZ に同期するスタンバイが作られ、障害時には自動で切り替わります。スタンバイは待機用なので、読み取りの処理には使えません。
AWS の無料利用枠の仕組みは検証時から変わっています。今の無料プランはクレジット制で、RDS で対象になるインスタンスクラスは db.t3.micro と db.t4g.micro です。作成時の画面で、選べるテンプレートとインスタンスクラスを確かめてください。
| 1Virtual Private Cloud (VPC) | MyVPC |
| 2サブネットグループ | db-subnet-g |
| 3パブリックアクセス | ○ あり◉ なし |
| 4VPC セキュリティグループ | ◉ 既存の選択○ 新規作成 DB-Private-sg × |
| 5アベイラビリティーゾーン | ap-northeast-1a |
| データベース認証オプション | ◉ パスワード認証 ○ パスワードと IAM データベース認証 ○ パスワードと Kerberos 認証 |
| 最初のデータベース名 | |
| 6DB パラメータグループ | mysql8-pg |
| オプショングループ | mysql8-og |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | VPC | MyVPC を選びます。作成後に VPC は変えられません。 |
| 2 | サブネットグループ | STEP 3 で作った db-subnet-g を選びます。 |
| 3 | パブリックアクセス | なし を選びます。RDS にパブリック IP アドレスが割り当てられず、VPC の中からだけ接続できます。 |
| 4 | VPC セキュリティグループ | 既存の選択で、STEP 2 で作った DB-Private-sg を選びます。 |
| 5 | アベイラビリティーゾーン | DB インスタンスを置く AZ です。この記事では ap-northeast-1a にします。指定しなければ RDS が選びます。 |
| 6 | DB パラメータグループ/オプショングループ | STEP 4、5 で作った mysql8-pg と mysql8-og を選びます。 |
| 7 | データベースの作成 | クリックすると作成が始まります。 |
データベース認証はデフォルトのパスワード認証のままにします。最初のデータベース名を空にすると、RDS は DB インスタンスの中にデータベースを作りません。必要なデータベースは、接続したあとに CREATE DATABASE で作ります。自動バックアップなど、追加設定のほかの項目もデフォルトのままです。
作成を始めると「データベース testdb-1 を作成しています」と表示され、起動まで数分かかります。しばらくして、データベースの一覧から testdb-1 を開き、ステータスを確かめます。
| DB 識別子 | CPU | ステータス | クラス |
|---|---|---|---|
| testdb-1 | 3.61% | 1 利用可能 | db.t2.micro |
| ロール | 現在のアクティビティ | エンジン | リージョンと AZ |
| インスタンス | 0 接続 | MySQL Community | ap-northeast-1a |
ステータスが緑の「利用可能」になれば、接続できる状態です。
EC2 から RDS へアクセス
EC2 に MySQL クライアントを入れる
EC2(Amazon Linux 2)に SSH でログインし、yum で MySQL のクライアントを入れます。
作業 PC → EC2(Amazon Linux 2)
mac:Desktop hirotano $ ssh -i "hirotano-key.pem" ec2-user@xx.xxx.xxx.xxx
Last login: Wed Aug 18 10:03:33 2021 from (伏せています)
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
4 package(s) needed for security, out of 16 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-1-100 ~]$
[ec2-user@ip-10-0-1-100 ~]$ sudo yum -y install mysql
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core | 3.7 kB 00:00:00
・
・ 出力省略
.
完了しました!
[ec2-user@ip-10-0-1-100 ~]$
Amazon Linux 2 は 2026年6月30日でサポートが終わっています。これから EC2 を作る場合は Amazon Linux 2023 を使ってください。Amazon Linux 2023 では、MySQL や MariaDB のクライアントのパッケージ名が Amazon Linux 2 と同じとは限らないので、使うバージョンのドキュメントで確かめてください。
エンドポイントを確かめて接続する
RDS の接続先は、IP アドレスではなくエンドポイント(DNS 名)で指定します。RDS ›› データベース ›› testdb-1 を開き、「接続とセキュリティ」タブでエンドポイントを確かめます。
| 1エンドポイント | testdb-1.xxxxxxxxxxxx.ap-northeast- |
| アベイラビリティーゾーン | ap-northeast-1a |
エンドポイントは「DB インスタンス識別子.固有の文字列.リージョン.rds.amazonaws.com」の形です。マルチ AZ の場合、フェイルオーバーするとこの DNS 名の向き先がスタンバイに切り替わるので、アプリケーションは同じエンドポイントのまま接続し直せます。
EC2 で、-h にエンドポイント、-u にマスターユーザー名を指定して mysql コマンドを実行します。-p を付けると、パスワードを聞かれます。
EC2 → RDS
[ec2-user@ip-10-0-1-100 ~]$ mysql -h testdb-1.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -u admin -p Enter password: ★パスワードを入力 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 8.0.25 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)]>
| 表示 | 意味 |
|---|---|
| Welcome to the MariaDB monitor. | 接続に使ったクライアントの表示です。Amazon Linux 2 で yum install mysql として入ったのは MariaDB のクライアントなので、この表示になります。 |
| Server version: 8.0.25 | 接続先のサーバ(RDS)のバージョンです。作成時に選んだ MySQL 8.0.25 につながっています。 |
| MySQL [(none)]> | プロンプトです。(none) は、まだ使うデータベースを選んでいないことを表します。接続時にデータベース名を指定するか、USE で選ぶと、ここにその名前が出ます。 |
これで、プライベートサブネットの RDS に EC2 から接続できました。
うまくいかないとき
| 状態 | よくある原因 | 確認すること |
|---|---|---|
| mysql コマンドが応答せずタイムアウトする | セキュリティグループで 3306 番が許可されていない、ソースが EC2 のセキュリティグループになっていない | DB-Private-sg のインバウンドルール、EC2 に適用しているセキュリティグループ |
| ホスト名が解決できない | エンドポイントのコピーの誤り | 「接続とセキュリティ」タブのエンドポイント |
| Access denied と表示される | ユーザー名かパスワードの誤り | マスターユーザー名と、作成時に決めたパスワード |
| サブネットグループを作れない | 1つの AZ のサブネットしか選んでいない | 2つ以上の AZ のサブネットを選んでいるか |
まとめ
| 作ったもの | この記事の名前 | 設定のポイント |
|---|---|---|
| プライベートサブネット | private-subnet-1a/1c | 2つの AZ に1つずつ(10.0.2.0/24、10.0.22.0/24) |
| セキュリティグループ | DB-Private-sg | MYSQL/Aurora(TCP 3306)を、ソース EC2-public から許可 |
| サブネットグループ | db-subnet-g | 2つのプライベートサブネットをまとめる |
| パラメータグループ | mysql8-pg | ファミリー mysql8.0 |
| オプショングループ | mysql8-og | エンジン mysql、メジャーバージョン 8.0 |
| DB インスタンス | testdb-1 | MySQL 8.0.25、パブリックアクセスなし、上の4つを関連付ける |
RDS では OS にログインできない代わりに、置き場所はサブネットグループ、通信はセキュリティグループ、エンジンの設定はパラメータグループとオプショングループで決めます。先にこれらを作っておけば、DB インスタンスの作成画面では選ぶだけで済みます。接続はエンドポイントの DNS 名で行うので、アプリケーションの接続先にもこの名前を使います。
コメント