🔑

【AWS⑤】 プライベートサブネットにDB用サーバーを構築する

2022/09/12に公開

どうもoreoです。

前回までの記事で、AWS上にWebサーバーを構築し、HTTPの動きについて学びました。今回の記事では、インターネットから接続できないプライベートサブネットを作成し、そこにDB用のサーバーを構築します。

【AWS①】ネットワークを構築してみる

【AWS②】サーバーを構築してみる

【AWS③】EC2インスタンスにWebサーバーをインストールしてアクセスできるようにする

【AWS④】 HTTPの動きについて理解を深める

自分へのメモ的な記事になりますが、普段インフラを触らない人の参考になれば幸いです!

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アドレスなどを確認することができます。

3-2 pingコマンドで疎通確認

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 参考

https://bookplus.nikkei.com/atcl/catalog/17/261530/

Discussion