こちらの記事 で AWS の基礎はある程度把握できた気がするので、以下のような構成のサンプルアプリを作ってみることにしました。アプリ自体は、「Web画面で入力したコメントをDBに登録する」だけの超シンプルなものです。
全てをまとめてやるのは大変なので、全三回に分けて順番にやってみます。
今回は part1 ということで、「RDS 環境構築」までをやってみたいと思います。具体的な作業としては、VPC を作成し、RDS で MariaDB のデータベースを作成して、テーブルを作成するところまでです。
- part1: RDS 環境構築(今回)
- part2: EKSでRDSにアクセスするWEB APIサーバを構築
- part3: CodeBuild・CodePipelineを使ってデリバリーパイプラインを導入
今回利用するサービス
-
Amazon VPC
- 今回のシステムを構成するコンポーネント全体を所属させる Virtual Private Cloud を作成する
- 特定IPアドレスからの RDS へのアクセス、https アクセスのみ公開する
-
Amazon RDS
- 今回は MariaDBを使ってみる
-
comments
というテーブルを作るだけ
VPCの作成
こちら を参考に、プライベートサブネットおよびパブリックサブネットを持つ VPC を作成したいと思います。
プライベートサブネットにはDBなどを、パブリックサブネットにはWebサーバなどを割り当てる想定です。
Elastic IP コンソール で Elastic IP アドレスを取得する
-
Elastic IP アドレスの割り当て
をクリック -
パブリック IPv4 アドレスプール
のAmazon の IPv4 アドレスプール
を選択 -
割り当て
をクリックすると、アドレスを取得できる - ちなみに、アドレス一つであれば無料らしい
パブリックとプライベート サブネットを持つ VPC を作成
-
VPC コンソール の
VPC ウィザードを起動
でウィザードを開始する -
パブリックとプライベート サブネットを持つ VPC
を選択 - デフォルト値から以下を修正して、
VPC の作成
を実行- VPC 名:
sample-vpc
- パブリックサブネットのアベイラビリティーゾーン:
us-west-2a
- パブリックサブネット名:
sample-public-subnet
- プライベートサブネットのアベイラビリティーゾーン:
us-west-2a
- プライベートサブネット名:
sample-private-subnet
- Elastic IP 割り当て ID: 先ほど作成した Elastic IP アドレスのID
- VPC 名:
同じルートテーブルを利用するプライベートサブネットを追加
-
VPC コンソール >
サブネット
>サブネットを作成
でサブネット作成画面を表示し、以下を入力してサブネットを作成
- VPC ID: 先ほど作成した VPC のID
- サブネット名:
sample-private-subnet2
- アベイラビリティーゾーン:
us-west-2b
- IPv4 CIDR ブロック:
10.0.2.0/24
- 二つのプライベートサブネットが同じルートテーブルを利用するようにする
- 一つ目のサブネット(sample-private-subnet)のルートテーブルの値をコピー
- 二つ目のサブネットの詳細画面の
ルートテーブル
タブで、ルートテーブルの関連付けを編集
をクリックし、ルートテーブル ID
に先ほどコピーした値を設定して保存
プライベートサブネットのルートテーブルを編集して、インターネットゲートウェイ経由でアクセスするようにする
- 【重要】 チュートリアルにはないがインターネット経由でRDSにアクセスする場合は、この設定が必須
-
VPC コンソール >
サブネット
>sample-private-subnet
のルートテーブルリンク -
ルート
タブ >ルートの編集
- 送信先:
0.0.0.0/0
, ターゲット:igw-xxxx
(Internet Gateway)
パブリック WEB サーバーの VPC セキュリティグループを作成
-
VPC コンソール >
セキュリティグループ
>セキュリティグループを作成
をクリック - 以下を入力して、
セキュリティグループを作成
- セキュリティグループ名:
sample-public-securitygroup
- 説明:
for public access
- VPC: 先ほど作成した VPC のID
-
インバウンドルール
>ルールを追加
- タイプ:
HTTP
, ソース:任意の場所
- タイプ:
HTTPS
, ソース:任意の場所
- タイプ:
- セキュリティグループ名:
プライベート DB インスタンスの VPC セキュリティグループを作成
- パブリック WEB サーバーと同じ手順でセキュリティグループを作成する
- 入力パラメータは以下の通り
- セキュリティグループ名:
sample-private-securitygroup
- 説明:
for private access
- VPC: 先ほど作成した VPC のID
-
インバウンドルール
>ルールを追加
- タイプ:
MySQL/Aurora
, ソース:sample-public-securitygroup
のID - タイプ:
MySQL/Aurora
, ソース:マイIP
- タイプ:
- セキュリティグループ名:
DB サブネットグループを作成
-
RDS コンソール >
サブネットグループ
>DB サブネットグループを作成
- 以下を入力して
作成
- 名前:
sample-db-subnet-group
- 説明:
Sample DB Subnet Group
- VPC: 先ほど作成した
sample-vpc
- サブネットを追加
- アベイラビリティーゾーン:
us-west-2a
とus-west-2b
- サブネット: 先ほど作成した
sample-private-subnet
とsample-private-subnet2
のID
- アベイラビリティーゾーン:
- 名前:
思ったよりだいぶ大変でしたが、おそらくこれで VPC の設定は終わりのはず...
もし設定が足りてなければ後で追記します。
データベース作成
RDS コンソール から、データベースを作成して、テーブルを作成します。
データベース作成
今回は、MariaDBを使ってみることにしました。
- 「データベースの作成」ボタンからデータベース作成を開始する
- デフォルト値以外で以下を入力し、「データベースの作成」ボタンをクリックする(数分かかる)
- 作成方法:
標準作成
- エンジンのタイプ:
MariaDB
- DBインスタンスサイズ :
無料利用枠
- DB インスタンス識別子:
sample-database
- マスタユーザ名:
admin
- パスワード: 適当な値(今回はとりあえず
hogehoge
) - Virtual Private Cloud (VPC): 先ほど作成した
sample-vpc
- サブネットグループ: 先ほど作成した
sample-db-subnet-group
- パブリックアクセス可能: あり(今回は、ローカルPCからDBにアクセスしてテーブル等を作成する予定なので。
なし
のほうがセキュア) - VPC セキュリティグループ:
既存の選択
で、先ほど作成したsample-private-securitygroup
を選択 - 最初のデータベース名:
sampledb
- 作成方法:
- コンソールでデータベース設定を確認する
- エンドポイント:
sample-database.xxxx.us-west-2.rds.amazonaws.com
- ポート: 3306
- エンジンバージョン:
10.4.13
- ARN:
arn:aws:rds:us-west-2:xxxx:db:sample-database
- エンドポイント:
Mac に MariaDB をインストール
brew update
brew info mariadb
brew install mariadb
mariadb --version
> mariadb Ver 15.1 Distrib 10.5.9-MariaDB, for osx10.16 (x86_64) using readline 5.1
アクセス確認
以下のコマンドでアクセスできると思います。
mariadb -h sample-database.xxxx.us-west-2.rds.amazonaws.com -P 3306 -D sampledb -u admin -p
> Welcome to the MariaDB monitor. Commands end with ; or \g.
> Your MariaDB connection id is 33
> Server version: 10.4.13-MariaDB-log Source distribution
> Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
とはいえ、初回うまく接続できない可能性があります。その場合は こちら を参考に一つ一つ設定を確認してみてください。
-
ERROR 2002 (HY000): Can't connect to MySQL server on 'sample-database.xxxx.us-west-2.rds.amazonaws.com' (36)
-
nslookup sample-database.xxxx.us-west-2.rds.amazonaws.com
でserver can't find
エラー- エンドポイントのコピペミス
- パブリックアクセシビリティが
あり
になっていない(デフォルトはいいえ
)
-
telnet sample-database.xxxx.us-west-2.rds.amazonaws.com 3306
ornc sample-database.xxxx.us-west-2.rds.amazonaws.com 3306
でエラー- セキュリティグループのインバウンド設定が足りない
- ルートテーブルが
Internet Gateway
を利用する設定になってない(デフォルトだとNAT Gateway利用) - ネットワーク ACL の設定で、ローカルPCからの経路を拒否している
-
-
ERROR 1045 (28000): Access denied for user 'admin'@'xx.xx.xx.xx' (using password: NO)
-
mariadb
コマンドの-p
オプションつけ忘れ
-
-
ERROR 1049 (42000): Unknown database 'sampledb'
- RDS のデータベースを作成した際に、 Maria DB のデータベースを作成し忘れ。もしくはデータベース名をミスっている
-
mariadb
コマンドの-D
オプションを削除して、SQLでデータベースを作成する - もしくは、RDS データベースを削除して作り直す。
-
- RDS のデータベースを作成した際に、 Maria DB のデータベースを作成し忘れ。もしくはデータベース名をミスっている
テーブルの作成
今回は、id
とcomment
の2カラムのcomments
テーブルを作りたいと思います。
ここまで来れば、テーブル作成自体は一瞬で完了ですね。
MariaDB [sampledb]> create table comments (
id int auto_increment
, comment text not null
, primary key(id)
);
Query OK, 0 rows affected (0.132 sec)
MariaDB [sampledb]> show columns from comments;
+---------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| comment | text | NO | | NULL | |
+---------+---------+------+-----+---------+----------------+
2 rows in set (0.114 sec)
最後に
これで VPC を作成し、RDS で MariaDB のデータベースを作成して、テーブルを作成するところまでの作業が無事完了しました。
RDS にローカル PC から接続できない理由がわからず、時間がかかってしまいましたが、トラブルシューティングをやっているうちに VPC/サブネット/ルートテーブル/インターネットゲートウェイ/セキュリティグループあたりの理解が深まって逆に良かった気がします。
逆に、RDS の方は、あまり難しいところもなく、すんなり導入できたので理解が甘い感じはあります。
次回は、
「EKS で API サーバを立てて、RDS のテーブルにデータを追加する」
ところまでをやってみたいと思います。