RDS インスタンスを作成します。
このページは AWS 基礎入門チュートリアル の一部です。 AWS チュートリアル全体は AWS 基礎入門チュートリアル を参照してください。
目次
RDS とは何か
Amazon RDS は “Amazon Relational Database Service” の略です。 MySQL・MariaDB・PostgreSQL・SQL Server・Oracle などのデータベースエンジンを簡単に立ち上げることができます。また、簡単に起動・終了したり、リプリケーションやリードレプリカ (読み取り専用の複製) を作成したり、定期的なバックアップや任意時点のデータ復旧も可能です。
Amazon RDS を使わないパターンを考えてみましょう。
例えば EC2 が 1台あり、そこに Apache や nginx が入っていて、Web アプリケーションが動いているとします。その EC2 に MySQL・MariaDB・PostgreSQL を追加でインストールすることはもちろん可能です。しかしながら Web サーバ兼 DB サーバになってしまうため、アクセス数が増えた場合など Web サーバを複数台構成にする際に構成が複雑になってしまいます。
では EC2 を新規で立てて、
- EC2 1台目: Web サーバ
- EC2 2台目: DB サーバ
とすればよかというと、環境構築・バックアップ・レプリケーション等の運用面で手間が増えてしまいます。
というわけで、RDS を使ってデータベースを導入してみましょう。
RDS ダッシュボード
AWS コンソール > RDS にて、下記の RDS ダッシュボードが表示されます。 「DB インスタンス (0/40)」とあることから、現在は RDS インスタンスは存在しないことがわかります。
では「データベースの作成」ボタンを押して、RDS インスタンスを作成してみましょう。
データベースエンジンの選択
データベースエンジンの選択です。RDS では下記のデータベースエンジンを選択できます。
- MySQL
- MariaDB
- Amazon Aurora
- PostgreSQL
- SQL Server
- Oracle
最近の AWS は、自分で開発した Amazon Aurora を推しています。 Amazon 社内としても、Amazon.com のシステムを Oracle から Aurora に移行しているとのこと。ただ、Aurora は無料利用枠が設定されていないので有料になってしまいます。
MySQL、MariaDB、PostgreSQL であれば、インスタンスタイプ db.t2.micro かつ Single-AZ という条件が付きますが、毎月 750時間分の無料枠が設定されています。 1インスタンスしか起動しないのであれば、無料で利用可能ということです。ただしこの無料枠は利用開始から 12ヶ月以内であることに注意してください。
MySQL・MariaDB・PostgreSQL などオープンソース系の DB なら何でもいいのですが、 ここではなんとなく利用者が多そうな MySQL を選択します。
ユースケース設定
これは AWS の営業的な画面です。
- Aurora を使ってほしい。
- それがダメなら MySQL を Multi-AZ で運用してほしい。
という願いがにじみ出る画面ですね。しかしながらいずれも有料になってしまうので、 3つめの選択肢「開発/テスト – MySQL」を選んで、「次へ」で先に進みましょう。
DB 詳細指定
DB 詳細設定を行います。 ここでは MySQL のバージョンとして 5.6.xx を指定しました (デフォルトでそうなっていたので、というだけの理由)。 2018/11 現在、MySQL は 5.5・5.6・5.7・8.0 が選択可能です。
下にスクロールすると「DB インスタンスのクラス」が出てきます。 無料利用枠である db.t2.micro を選択してください。 それ以外だとお金がかかります。
「マルチ AZ 配置」とは、RDS 内部で勝手にレプリケーションしてくれて、 障害発生時にはセカンダリに勝手に切り替わってくれるというありがたい機能です。 ただしこれを有効にするとこれまたお金がかかるので、「いいえ」のままとしておいてください。
さらに下にいくと、「DBインスタンス識別子」「マスターユーザの名前」「マスターパスワード」の入力を求められます。
ここでは下記のように入力してみました。
- DB インスタンス識別子: minitwitterrds (あとから変更可能)
- マスターユーザーの名前: minitwitteruser
- マスターパスワード: minitwitterpass (あとから変更可能)
「次へ」押下で先に進みます。
詳細設定
詳細設定です。 「パブリックアクセシビリティ」はデフォルトでは「はい」になっていますが、 「いいえ」にしてください。こうすることで、VPC 外から接続ができなくなり、 セキュリティが向上します。
VPC とは何? という説明はまだしていませんが、とりあえずは EC2 や RDS が含まれるローカルネットワークのことを指すと思っておいてください。
その他は変更不要です。
下にスクロールすると、「データベースの名前」欄が出てきます。 ここでは “minitwitterdb” としておきます。
「DB インスタンス識別子」と「データベースの名前」がわかりづらいので、説明します。
「DB インスタンス識別子」は RDS インスタンスのホスト名です。「データベースの名前」は、その中に入れるデータベースのことです。 初期構築時に
MySQL> CREATE DATABSE mydatabase DEFAULT CHARACTER SET utf8;
とかやるアレです。インスタンス内にデータベースは複数作成できますので下記のようなことも可能です。
- インスタンス1: minitwitter-prod-db (本番用 RDS インスタンス)
- データベース1: twitterDB (ツイート情報データベース)
- データベース2: userDB (個人情報管理用データベース)
- インスタンス2: minitwitter-stg-db (ステージング用 RDS インスタンス)
- データベース1: twitterDB (ツイート情報データベース)
- データベース2: userDB (個人情報管理用データベース)
画面の一番下まで行くと、「データベースの作成」ボタンがあります。これを押すと RDS インスタンスの作成が開始されます。
RDS インスタンス確認
AWS コンソール > RDS > インスタンス に移動してください。 数分待つと下記のように「利用可能」と表示されるはずです (利用可能になるまでは「作成中」と表示されます)。
RDS インスタンス詳細情報確認
上記画面で DB インスタンスの欄 (minitwitterrds) をクリックすると、下記の詳細情報画面に遷移します。
下にスクロールすると、下記のように「エンドポイント」と表示されています。 ここに書かれているのが、MySQL 利用時に接続すべき FQDN です。
接続試験
では早速接続してみましょう。mysql パッケージをインストールします。
% sudo su -
# yum -y install mysql
と言っても、実際にインストールされるのは MariaDB なのですが、 クライアントとしての接続確認においては問題ないような気がするので、 とりあえずはこれで進めます。
mysql 接続時の書式は
mysql -h ホスト名 -P ポート番号 -u ユーザ名 -pパスワード
です。下記のようにして接続しましょう。
% mysql -h minitwitterrds.c9oxz8hpltsg.us-east-2.rds.amazonaws.com \
-P 3306 -u minitwitteruser -pminitwitterpass
ずっと待たされて、つながりませんね。 予想していたかもしれませんが、これまたセキュリティグループです。
セキュリティグループ確認
インスタンスの詳細画面に下記のような記述があります。 インバウンドで 1つの IP アドレスが設定されているのですが、 これは AWS による管理用 IP アドレスです。 EC2 インスタンスから接続可能な設定がないですね。
セキュリティグループ設定画面
上記のセキュリティグループの部分をクリックすると、下記のセキュリティグループ設定画面に移動できます。 「編集」を押してください。
インバウンドルール編集
最初は下記のようになっています。
「ルールの追加」ボタンを押して、下記を追加してください。
- タイプ: MySQL/Aurora を選択
- ソース: カスタム、”sg-xxxxx”
sg-xxxxx には EC2 で使用しているセキュリティグループです。 “sg-” などの先頭部分を入力すると下記のように選択肢が出てきますので、わかりやすいかと思います。
最終形は下記です。最後に「保存」ボタン押下をお忘れなく。
e再び接続試験
今一度、EC2 インスタンスより RDS に接続してみましょう。 MySQL のプロンプトが出れば OK です。
% mysql -h minitwitterrds.c9oxz8hpltsg.us-east-2.rds.amazonaws.com \
-P 3306 -u minitwitteruser -pminitwitterpass
せっかくなので、テーブルを作成し、レコードを突っ込んでみましょう。
テーブル作成。
MySQL [minitwitterdb]> CREATE TABLE testtable (num integer, str text);
Query OK, 0 rows affected (0.03 sec)
レコード INSERT。
MySQL [minitwitterdb]> insert into testtable values (1, 'ほげ');
Query OK, 1 row affected, 1 warning (0.01 sec)
INSERT したレコード内容を確認。
MySQL [minitwitterdb]> select * from testtable;
+------+------+
| num | str |
+------+------+
| 1 | ?? |
+------+------+
1 row in set (0.00 sec)
おっと、文字化けしてしまいました。
これはなぜかというと、RDS 作成時に一緒に作ったデータベース minitwitterdb が、 DEFAULT CHARACTER SET latin1 で作成されており、
MySQL [minitwitterdb]> show create database minitwitterdb ;
+---------------+--------------------------------------------------------------------------+
| Database | Create Database |
+---------------+--------------------------------------------------------------------------+
| minitwitterdb | CREATE DATABASE `minitwitterdb` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+---------------+--------------------------------------------------------------------------+
テーブル作成時にも default charset を指定しなかったため、 データベースの default charset を引き継いでしまっているからです。
MySQL [minitwitterdb]> show create table testtable\G
*************************** 1. row ***************************
Table: testtable
Create Table: CREATE TABLE `testtable` (
`num` int(11) DEFAULT NULL,
`str` text
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
対策としては、下記のようにテーブル作成時に毎回 “DEFAULT CHARSET=utf8” を付けるという手があります。
CREATE TABLE hogehoge (
(略)
) DEFAULT CHARSET=utf8;
しかしながら毎回行うのは面倒なので、データベースを作り直してしまいましょう。
MySQL> drop database minitwitterdb;
Query OK, 6 rows affected (0.03 sec)
MySQL> create database minitwitterdb default character set utf8mb4;
Query OK, 1 row affected (0.01 sec)
再度、テーブル作成して文字化けが発生しないことを確認しましょう。
作成したデータベースに移動。
MySQL [(none)]> use minitwitterdb ;
Database changed
テーブル作成・INSERT・SELECT。
MySQL [minitwitterdb]> CREATE TABLE testtable (num integer, str text);
Query OK, 0 rows affected (0.02 sec)
MySQL [minitwitterdb]> insert into testtable values (1, 'ほげ');
Query OK, 1 row affected (0.01 sec)
MySQL [minitwitterdb]> select * from testtable;
+------+--------+
| num | str |
+------+--------+
| 1 | ほげ |
+------+--------+
1 row in set (0.00 sec)
問題ないですね。
なお、RDS 作成時に生成したデータベースを消したり、 別のデータベースを作成したりすることは全く問題ありません。 RDS が管理するのは RDS インスタンスのみであり、その中のデータベースには一切関与しません。
よって、RDS インスタンス生成時にはデータベースを作らず、自分でデータベースを作成するのも手です。 なお、RDS 生成時の画面でデータベース名を空にしておけば、データベースは作成されません。
次に サンプルアプリケーション mini Twitter を RDS 対応 を行います。