AWSでWEB3層構造の構築②(VPC、サブネット、NW設定、インスタンス起動、SSH接続)

AWSでWEB3層構造の構築にチャレンジしてみました。

前回の記事の続きです。
- [AWSでWEB3層構造の構築①(WEB3層構造の基礎)](https://qiita.com/lucifer22/items/44906506f48d99d14a3e)

作りたい環境は以下の図の通りです。

![スクリーンショット 2023-01-24 20.25.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/193ebb8a-2b90-02cb-fabc-68f0ece22955.png)

# １.AWSアカウントを作成

AWSでサーバを構築する際はAWSアカウントが必要になります。
アカウントを持っていない場合は、下記URLからアカウントを作成します。

https://aws.amazon.com/jp/register-flow/

# 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
⑤以上を入力して、作成をクリックする

![スクリーンショット 2023-01-15 19.27.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/17dbc5bc-e0dd-a23e-1d43-2c6a9dfe85f0.png)


# 3.サブネットを作成

サブネットとはIPネットワークを細分化したもののことで、「大きなネットワーク(VPC)」の中の「小さなネットワーク(サブネット)」のことです。インターネット接続用サブネット（PublicSubnet）と内部接続用サブネット（PrivateSubnet）の２種類ありますので、それぞれ作成します。

- [AWSのプライベートサブネットとパブリックサブネットの違い](https://tech.excite.co.jp/entry/2022/06/14/132710)

①左サイドバーで「サブネット」を選択し、「サブネットの作成」をクリック。
②以下を入力し「作成」をクリックし、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のアドレスレンジ内である必要がある

![スクリーンショット 2023-01-15 20.15.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/e2bec7c7-2126-a91c-9d91-bd32284977f3.png)


# 4.インターネットGWを作成し、VPCにアタッチ

インターネットから接続するためのGWを作成し、以下の手順でVPCにくっつけます(アタッチ)。

①左サイドバーで「インターネットゲートウェイ」を選択し、「インターネットGWの作成」をクリック。
②インターネットGWの名前(今回はInternetGW)を入力し「作成」をクリック。
③「アクション」の「VPNのアタッチ」で作成したVPCを選択。

![スクリーンショット 2023-01-15 20.19.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/7c9fda4c-e069-18d7-0391-ba561d31664d.png)

![スクリーンショット 2023-01-15 20.21.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/b47b633b-baa8-8592-e87d-df661a65689f.png)

![スクリーンショット 2023-01-15 20.21.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/817d09ad-60fa-efa9-4311-fb8fb21f3d0c.png)

# 5.ルートテーブルの作成と関連付け
PublicSubnetはインターネットへ接続できるよう設定する必要があります。
そこで、以下の手順でインターネット接続用のルートテーブルを作成しPublicSubnetへ適用します。
①左サイドバーで「ルートテーブル」を選択し、「ルートテーブルの作成」をクリック。
②以下を入力し「作成」をクリック。
・名前タグ：ルートテーブルの名前(今回はpbrpute) 
・VPC：今回作成したVPCを選択

![スクリーンショット 2023-01-15 20.33.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/21ca48a1-e9be-af30-68b9-ca90d475cc46.png)

ルートテーブルができたら、中身を編集して以下の項目を入力。
[ルート]タブから[ルートの編集]
[ルートの追加]で以下を入力。
・送信先：0.0.0.0/0（すべてのネットワーク）
・ターゲット：今回作成したInternetGW
・変更を保存

![スクリーンショット 2023-01-15 20.38.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/21feca5a-39ab-a200-5001-f08250bb153b.png)

次はルートテーブル(箱)とサブネットを関連付けさせる。

[サブネットの関連付け]タブの[サブネットの関連付けの編集]から、
ルートテーブルとPublicSubnetを関連付けし、保存する。

![スクリーンショット 2023-01-15 20.41.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/ead3a6bc-812a-e7da-02b0-8fc3d625fb6f.png)
![スクリーンショット 2023-01-15 21.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/85a43cd5-492b-0b75-8a96-3cb796f054f1.png)


# 6.EC2を作成　（サーバをたてる）
まずはWEBサーバから構築します。

①検索窓でEC2を検索し、「インスタンスを起動」をクリック。
②以下を入力。未記載部分はデフォルトでOK。入力したら「確認と作成」をクリック。
・名前：サーバ名(今回はWEBServer)
・Amazonマシンイメージ (AMI)：OSの種類(無料枠のAmazonLinux2を選択)
・インスタンスタイプの選択：インスタンスのスペック(無料枠のt2.microを選択）
![スクリーンショット 2023-01-24 15.33.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/fd1c2cfb-a18e-12c7-43c9-f66885560d3c.png)



③キーペア（サーバにSSH接続する際に必要）を作成して、ダウンロードする。キーペア名は任意のものでOK(今回はMykey.pem)。

![スクリーンショット 2023-01-15 22.08.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/d0199f52-883f-869a-1ca8-3d4640004cf5.png)

④以下のとおりネットワーク設定を行う
・VPC：作成したVPCを選択。
・サブネット：作成した**PublicSubnet**を選択。
・パブリックIPの自動割り当て：有効化しインターネットから接続するためのグローバルIPを割り当てる
・ファイアウォール：セキュリティグループを作成する。名前は任意のものでOK。

![スクリーンショット 2023-01-15 22.16.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/2724531f-db06-ab80-8eda-87618d0136e6.png)

インバウンドセキュリティグループのルールを追加する。
以下プロトコルをフルオープン(0.0.0.0/0)で設定する。
・HTTP(80)
・HTTPS(443)
・SSH(22)
・ICMP(疎通確認ping用)

![スクリーンショット 2023-01-15 22.21.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/306c6f28-166a-100c-e6d0-4fa0ac4b176a.png)
![スクリーンショット 2023-01-15 22.21.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/d2ef1add-50b0-b0de-c59c-d52f5dc17470.png)

上記を入力し終えたら「インスタンスを起動」を選択
![スクリーンショット 2023-01-15 22.54.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/a5b6ef96-1263-9a2b-b17e-322f0d86f608.png)

以上で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を設定するのが正しいとのこと。この辺の理解が浅いので、条件を変えて構築しながら勉強していきたい。
![スクリーンショット 2023-01-24 20.14.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/2701fce9-82b6-6ee7-e202-c59fc9f8ed92.png)

上記を入力し終えたら「インスタンスを起動」を選択



# 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サーバにアクセスする。金銭コストはかからない。

金欠の私は迷わず③を選択しました。

##### :computer: 踏み台サーバの設定方法

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接続することが出来ましたので、次の記事からいよいよ本格的に構築していきます。

- [AWSでWEB3層構造の構築③(WEBサーバ、APサーバの構築と連携)](https://qiita.com/lucifer22/items/10b4cbd22b921dacd001)

### 参考

https://qiita.com/shinichi_yoshioka/items/7226b9ebaad06c569c80

https://qiita.com/ynh_noob/items/5f7462e574edc74c49b4

https://rcmdnk.com/blog/2014/06/08/comptuer-linux-windows-putty/