【AWS⑤】 プライベートサブネットにDB用サーバーを構築する
どうもoreoです。
前回までの記事で、AWS上にWebサーバーを構築し、HTTPの動きについて学びました。今回の記事では、インターネットから接続できないプライベートサブネットを作成し、そこにDB用のサーバーを構築します。
【AWS③】EC2インスタンスにWebサーバーをインストールしてアクセスできるようにする
自分へのメモ的な記事になりますが、普段インフラを触らない人の参考になれば幸いです!
1 概要
前回までの記事で作成したパブリックサブネット(下図)では、インターネットゲートウェイを経由してインターネットに接続することが可能です。
DBなどインターネットと接続したくないものは、プライベートサブネットと呼ばれるインターネットに接続できないサブネットに配置することで、システムの安全性を高めることができます。
今回の記事では下記のようにプライベートサブネットを作成し、DB用のインスタンスを配置します。
※この記事ではDBサーバー用のインスタンスを作成するまで行い、今後の記事でインスタンスにMariaDBをインストールしたいと思います。
2 プライベートサブネットを構築する
プライベートサブネット(10.0.2.0/24)を作成していきます。AWSマネジメントコンソールにログインし、「サブネット」>「サブネットを作成」を選択します。
「VPC ID」をVPC領域、「サブネット名」をプライベートサブネット、「アベイラビリティーゾーン(AZ)」をap-northeast-1c、「IPv4 CIDORブロック」を10.0.2.0/24に設定し、サブネットを作成します。
ここで、AZとはリージョン(データセンターの場所)をグループ化したものです。パブリックサブネットのWebサーバーとプライベートサブネットのDBサーバーのAZが異なると、距離による通信遅延が発生することがあるため、AZを同じものに設定します。下図のように「サブネット」>「パブリックサブネット」からAZを確認すると「ap-northeast-1c」に設定されているので、プライベートサブネットもそれに合わせます。
作成したプライベートサブネットのルートテーブルを確認すると、VPC領域(10.0.0.0/16)、つまり自身のネットワークに対してだけルーティングが設定されていることが確認できます。
3 プライベートサブネットにDB用サーバーを構築する
3-1 DB用サーバーを構築
Webサーバーを構築した時と同じように、DB用のサーバーを構築します(細かい部分は前回の記事を同じです)。
インスタンス名
DBサーバーとします。
ネットワーク設定
「VPC」をVPC領域、「サブネット」をプライベートサブネットに設定します。また、インターネットに接続させたくないので、「パブリックIPの自動割り当て」を無効化とします。
セキュリティグループ
「セキュリティグループ名」をDB-SGとし、「インバウンドセキュリティグループのルール」でDBサーバーにインストール予定であるMariaDBのポートである3306への通信を設定します。
プライベートIPアドレスを設定するために、「プライマリIP」を10.0.2.10として
DB用のインスタンスを起動
作成したインスタンスを起動すると、プライベートIPアドレスなどを確認することができます。
ping
コマンドで疎通確認
3-2 ping
コマンドを使用して、WebサーバーからDBサーバーにアクセスできるか確認します。ping
コマンドでは、ICMPというプロトコルを用いて、ホストに対して「ICMPエコー要求」というパケットを送信し、ホストから「ICMPエコー応答」というパケットを受け取ることで、疎通確認することができます。
ファイアウォールでDBサーバーに対してICMPでの接続を許可
「インスタンス」>「DBサーバー」から「セキュリティグループ」を選択します。
「インバウンドのルールを編集」を選択します。
「タイプ」をすべてのICMP-IPv4、「ソース」をAnywhere-IPv4としてインバウンドルールを追加します。
WebサーバーからDBサーバーへの疎通確認
ssh -i ~/.ssh/my-key.pem ec2-user@[パブリックIPアドレス or パブリックDNS名]
でWebサーバーに接続し、ping 10.0.2.10
を実行します。疎通していると下記図の「64 bytes from〜」のような返答が得られます。通信を止める際は、Ctrl + Cで終了できます。
ローカルからWebサーバーへの疎通確認
ローカルからWebサーバーへping
コマンドを実行すると、timeoutとなり疎通が確認できません。
これはWebサーバーのセキュリティグループでICMPが許容されてないからです。そこでDBサーバーと同じように、ファイアウォールでWebサーバーへのICMPの接続を許可します。
そうすると、webサーバーへの疎通が確認できます。
このようにping
で応答がない時は、サーバーが停止しているorファイアウォールでICMPプロトコルが阻まれているのどちらかの可能性があるので、応答がないからと言ってサーバーが停止しているとは必ずとも判断できません。
4 踏み台サーバーを経由してSSHでDBサーバーに接続
DBサーバーにはインターネットから接続できないため、WebサーバーにSSH接続した後にDBサーバーにSSH接続して、DBのソフトウェアをインストールしたいと思います。この場合のWebサーバーのように接続時の踏み台にするサーバーを踏み台サーバーと言います。
DBサーバーにSSH接続する場合、秘密鍵が必要のため、ファイル転送プロトコル(SCP)を使って、ローカルに保存しているmy-key.pem
をWebサーバーに配置します。
scp -i ~/.ssh/my-key.pem ~/.ssh/my-key.pem ec2-user@ec2-user@[パブリックIPアドレス or パブリックDNS名]
WebサーバーにSSHアクセスし、秘密鍵のファイルパーミッションを自分しか読めないように変更します(下記画像①の部分)。
ssh -i ~/.ssh/my-key.pem ec2-user@[パブリックIPアドレス or パブリックDNS名]
chmod 400 my-key.pem
WebサーバーからDBサーバーに接続すると下記画像②の部分のようにDBサーバーに接続できることが確認できます!
ssh -i my-key.pem ec2-user@10.0.2.10
5 最後に
プライベートサブネットをうまく活用すれば、システムの保守性を向上させることができますね。次回はNATを構築して、プライベートサブネットからインターネットの向きの通信だけを許可したいと思います。
6 参考
Discussion