AWSでWEB3層構造の構築にチャレンジしてみました。
前回の記事の続きです。
作りたい環境は以下の図の通りです。
1.AWSアカウントを作成
AWSでサーバを構築する際はAWSアカウントが必要になります。
アカウントを持っていない場合は、下記URLからアカウントを作成します。
2.VPC(VirtualPrivateCloud)の作成
アカウント作成後はVPCを作成します。
VPCとはクラウド上に作成することが出来る、作成者が自由にアクセスをコントロールすることが可能な空間です。
このVPC内にAZ(アベイラビリティーゾーン)があり、AZとは一つ以上のデータセンターがネットワークでつながったデータセンター群です。AWSでサーバを立ち上げると、AZの中で起動します。
AZの配下にサブネットがあり、今回はそのサブネット内にWEBサーバ、APサーバ、DBサーバを設置します。
まずはVPCを作るリージョンを決め、コンソール右上にある特定のリージョン(東京・大阪・オレゴン等・・)を選択します。リージョンとは、データセンターが集積されている国や地域の事で、今回は「東京リージョン」に作成していきます。
続いて、以下の手順でVPCを作成していきます。
①左上の検索窓から「VPC」を選択→VPCを作成
②VPCのみを選択
③VPCの名前を入力:今回はWeb3tier
④IPv4 CIDRブロックの指定:今回は10.0.0.0/16
※下記のプライベートIPアドレスの範囲内でCIDRを指定
・10.0.0.0 – 10.255.255.255
・172.16.0.0 – 172.31.255.255
・192.168.0.0 – 192.168.255.255
⑤以上を入力して、作成をクリックする
3.サブネットを作成
サブネットとはIPネットワークを細分化したもののことで、「大きなネットワーク(VPC)」の中の「小さなネットワーク(サブネット)」のことです。インターネット接続用サブネット(PublicSubnet)と内部接続用サブネット(PrivateSubnet)の2種類ありますので、それぞれ作成します。
①左サイドバーで「サブネット」を選択し、「サブネットの作成」をクリック。
②以下を入力し「作成」をクリックし、PublicSubnetとPrivateSubnetが作成される。
・VPC ID:サブネットを作成するVPCを選択する。
・サブネット名:サブネットの名前(PublicSubnetとPrivateSubnet)
・アベイラビリティーゾーン(AZ):今回は東京リージョン1aを選択
・IPv4 CIDRブロック:PublicSubnetは10.0.1.0/24、PrivateSubnetは10.0.3.0/24、
※両方のSubnetともに、VPCのアドレスレンジ内である必要がある
4.インターネットGWを作成し、VPCにアタッチ
インターネットから接続するためのGWを作成し、以下の手順でVPCにくっつけます(アタッチ)。
①左サイドバーで「インターネットゲートウェイ」を選択し、「インターネットGWの作成」をクリック。
②インターネットGWの名前(今回はInternetGW)を入力し「作成」をクリック。
③「アクション」の「VPNのアタッチ」で作成したVPCを選択。
5.ルートテーブルの作成と関連付け
PublicSubnetはインターネットへ接続できるよう設定する必要があります。
そこで、以下の手順でインターネット接続用のルートテーブルを作成しPublicSubnetへ適用します。
①左サイドバーで「ルートテーブル」を選択し、「ルートテーブルの作成」をクリック。
②以下を入力し「作成」をクリック。
・名前タグ:ルートテーブルの名前(今回はpbrpute)
・VPC:今回作成したVPCを選択
ルートテーブルができたら、中身を編集して以下の項目を入力。
[ルート]タブから[ルートの編集]
[ルートの追加]で以下を入力。
・送信先:0.0.0.0/0(すべてのネットワーク)
・ターゲット:今回作成したInternetGW
・変更を保存
次はルートテーブル(箱)とサブネットを関連付けさせる。
[サブネットの関連付け]タブの[サブネットの関連付けの編集]から、
ルートテーブルとPublicSubnetを関連付けし、保存する。
6.EC2を作成 (サーバをたてる)
まずはWEBサーバから構築します。
①検索窓でEC2を検索し、「インスタンスを起動」をクリック。
②以下を入力。未記載部分はデフォルトでOK。入力したら「確認と作成」をクリック。
・名前:サーバ名(今回はWEBServer)
・Amazonマシンイメージ (AMI):OSの種類(無料枠のAmazonLinux2を選択)
・インスタンスタイプの選択:インスタンスのスペック(無料枠のt2.microを選択)
③キーペア(サーバにSSH接続する際に必要)を作成して、ダウンロードする。キーペア名は任意のものでOK(今回はMykey.pem)。
④以下のとおりネットワーク設定を行う
・VPC:作成したVPCを選択。
・サブネット:作成したPublicSubnetを選択。
・パブリックIPの自動割り当て:有効化しインターネットから接続するためのグローバルIPを割り当てる
・ファイアウォール:セキュリティグループを作成する。名前は任意のものでOK。
インバウンドセキュリティグループのルールを追加する。
以下プロトコルをフルオープン(0.0.0.0/0)で設定する。
・HTTP(80)
・HTTPS(443)
・SSH(22)
・ICMP(疎通確認ping用)
以上でWEBサーバの土台が作成されました。
続いて、APサーバとDBサーバもそれぞれ作成します。
APサーバとDBサーバは、プライベートサブネット(インターネットに接続できないサブネット)に配置することで、システムの安全性を高めることができます。
手順①〜③については、WEBサーバの作成と同様ですので、スクリーンショットは省略します。
①検索窓でEC2を検索し、「インスタンスを起動」をクリック。
②以下を入力。未記載部分はデフォルトでOK。入力したら「確認と作成」をクリック。
・名前:サーバ名(APServerとDBServer)
・Amazonマシンイメージ (AMI):OSの種類(無料枠のAmazonLinux2を選択)
・インスタンスタイプの選択:インスタンスのスペック(無料枠のt2.microを選択)
③WEBサーバと同じキーペアを選択する。
④以下のとおりネットワーク設定を行う。
・VPC:作成したVPCを選択。
・サブネット:作成したPrivateSubnetを選択。
・パブリックIPの自動割り当て:無効化
・ファイアウォール:既存のセキュリティグループ(WEBサーバと同じ)を選択。
※本来であれば、PrivateSubnetのセキュリティグループは22番ポート(SSHのポート)とICMPを設定するのが正しいとのこと。この辺の理解が浅いので、条件を変えて構築しながら勉強していきたい。
上記を入力し終えたら「インスタンスを起動」を選択
7.サーバにSSH接続
7-(1). WEBサーバにSSH接続
作成した秘密鍵(今回はMykey.pem)をローカルホストの~/.ssh下に配置し、まずはWEBサーバにSSH接続します。
$ cd Downloads
ローカルホストのDownloadsに秘密鍵がダウンロードされています。
$ mv 秘密鍵の名前.pem ~/.ssh
秘密鍵(Mykey.pem)を~/.ssh配下に移動
$ cd ~/.ssh
$ ssh -i "Mykey.pem" ec2-user@WEBサーバのパブリックIPアドレス
AWSコンソールで「インスタンスに接続」をクリックすると新しいページが開くので、パブリックIPアドレスを確認しましょう。
$ ssh -i "Mykey.pem" ec2-user@54.250.240.52
The authenticity of host '54.250.240.52 (54.250.240.52)' can't be established.
ED25519 key fingerprint is SHA256:rzNn8teNpmQ6o3f8g5CgWJmOqRIKc2Qh7b+B6VNY08U.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yesを入力
Warning: Permanently added '54.250.240.52' (ED25519) to the list of known hosts.
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-10-0-1-182 ~]$
上記の表示が出れば、WEBサーバへのSSH接続は成功です。
7-(2). APサーバ、DBサーバに多段SSH接続
プライベートサブネットに属しているAPサーバとDBサーバは、インターネットに繋がらないプライベートIPアドレスしか持っていないので、ローカルホストのターミナルやTeraTermからSSH接続できません。
調べたところ、以下の解決方法が見つかりました。
①パブリックサブネットにNATゲートウェイを配置する。ただし金銭コストがかかる。
②EIP(Elastic IP Address、AWSアカウントに紐づけられた静的なグローバルIPアドレス)をインスタンスに付与する。プライベートサブネットを無理やりパブリックサブネットに変える魔法。ただし条件によっては金銭コストがかかる。
③インターネットに接続するWEBサーバを踏み台サーバとして、APサーバとDBサーバにアクセスする。金銭コストはかからない。
金欠の私は迷わず③を選択しました。
踏み台サーバの設定方法
APサーバ、DBサーバに踏み台サーバ(WEBサーバ)を通ってログインする際、踏み台サーバーにSSH接続した後に、また入りたいサーバーにSSH接続するのは手間がかかります。
そこで、ローカルホストの~/.ssh配下に設定ファイル(config)を作成することで、二度手間を踏むことなく、一発で簡単にAP(DB)サーバにログインできるようになります。
$ vi ~/.ssh/config
configファイルに以下を記述
# 踏み台サーバ用設定
Host bastion
Hostname 54.250.240.52 WEBサーバのパブリックIPアドレス
User ec2-user WEBサーバのユーザー名
IdentityFile ~/.ssh/Mykey.pem 秘密鍵のファイル名
# APサーバ用設定
Host APServer
Hostname 10.0.3.8 APサーバのプライベートアドレス
User ec2-user
IdentityFile ~/.ssh/Mykey.pem
ProxyCommand ssh bastion -W %h:%p
# DBサーバ用設定
Host DBServer
Hostname 10.0.3.151 DBサーバのプライベートアドレス
User ec2-user
IdentityFile ~/.ssh/Mykey.pem
ProxyCommand ssh bastion -W %h:%p
※ProxyCommandはサーバに接続するときに利用されるコマンドを指定するもので、「ssh -W」を使うとクライアントの入出力を指定したホストに送る事が出来ます。
~/.ssh/configの中では%hがHostName、%pがPort(上記の記述ではポート指定がないので、デフォルトの22)に変換されます。
上記のように、踏み台サーバの設定をローカルホストの~/.ssh/configに書いておくと、
$ ssh APServer
または
$ ssh DBServer
と入力するだけで、本来直接アクセス出来ないAPサーバとDBサーバに直接ログイン出来ます。
以上で、WEBサーバ・APサーバ・DBサーバの土台を作成しそれぞれにSSH接続することが出来ましたので、次の記事からいよいよ本格的に構築していきます。
参考