AWSでWebサイトを作ってみた(2) サーバー構築編

[前回の記事はこちら](https://qiita.com/alksoho/items/13d37bcc497a33a53cd2)
[次回の記事はこちら](https://qiita.com/alksoho/items/d29239cf48efe18fbe2e)


今回は[AWS](https://aws.amazon.com/jp/)を利用し、自身でサーバーを立て、記事のキーワードを自動抽出するWebアプリケーションを作成してみました。

# 目次
* [概要](#概要)
    * [利用しているサービス](#利用しているサービス)
        * [ドメイン取得](#ドメイン取得)
        * [ローカルネット、サブネット構築関連](#ローカルネット、サブネット構築関連)
        * [Webサーバー構築](#Webサーバー構築)
        * [DBサーバー構築](#DBサーバー構築)
        * [DNS](#dns(domain-name-system))
* [サーバー構築](#サーバー構築)
    * [VPC作成](#vpc作成)
    * [Webサーバー構築](#Webサーバー構築)
    * [DBサーバー構築](#DBサーバー構築)
    * [DNS](#dns)
* [終わりに](#終わりに)
* [参考文献](#参考文献)

# 概要

今回はAWSを使用してWebサーバー、DBサーバー、それらを置くローカルネット、外部からインターネットからアクセスできるようDNSの設定を行っていきます。

まずは全体の概要図です。
![abstract.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426076/12c9834e-222f-52ba-dd1e-ad738d00467f.png)



* AWS上にローカルネット(右 VPC 10.0.0.0/16)を作成し、2つのサブネットを作成します。
    * パブリックサブネット(10.0.10.0/24)
        * Webサーバーでありインターネットからアクセス可能
    * プライベートサブネット(10.0.20.0/24)
        * DBサーバーでありパブリックサブネット以外アクセス不可能
* AWSのDNSサービスであるRoute 53を使用し、グローバルIPアドレスとドメイン名を紐づけ

このような構成を作成しています。



## 利用しているサービス
### ドメイン取得
[お名前.com](https://www.onamae.com/)

### ローカルネット、サブネット構築関連

VPC

### Webサーバー関連

| 仮想マシン導入|WebサーバーOS導入 |Webサーバー用ソフトウェア |
|---|---|---|
|EC2 |AMI |Apache |

### DBサーバー関連

| DBサーバー構築|DB用ソフトウェア | 
|---|---|
|RDS |MySQL |

### DNS(Domain Name System)
Route53


## VPC作成
[VPC](https://aws.amazon.com/jp/vpc/)(Virtual Private Cloud)はAWS上に仮想ネットワークを作成できるサービスです。
今回はWebサーバーはインターネットから接続できるようにしたい。しかし、DBサーバーはWebサーバーからしか接続できないようにしたいので、VPC内のサブネットを2つ作成することにしました。


![VPC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426076/ea03deef-dfa8-e73f-8a21-fb1c0a1e6e49.png)

### VPCを作成
まずは、下記のようにVPCを選択し、**VPCを作成** をクリックし作成してください。
* リージョンを作りたいところに選択しましょう。(どこでもいいなら東京リージョンでOK)
![vpc_select.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426076/851e1316-266a-93fd-9948-3e305b7cfd59.png)

作成したVPCの設定
| 作成するリソース|名前(任意) |IPv4 CIDR(任意) |IPv6 CIDR |タグ |
|---|---|---|---|---|
|VPCのみ |aws-and-infra-vpc |手動で 10.0.0.0/16 |IPv6 CIDRブロックなし|タグなし|

今回ローカルIPアドレスはCIDR形式で記述しています。これをサブネットマスク形式で書くと10.0.0.0/255.255.0.0になります。
CIDR形式をもっと知りたい人は[こちらの記事](https://dev.classmethod.jp/articles/what-is-cidr/)に詳しく書いてありますので参考にしてください。

### サブネットを作成
今回はパブリックサブネットとプライベートサブネットの2つを作成していきます。

まずは、下記のようにVPCを選択し、**サブネットを作成** をクリックし作成してください。
![makkesbnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426076/bb1016fb-7a06-9eb1-0810-636887f1d800.png)

今回は先程作成したVPC内でサブネットを作成するため以下のようにVPC IDを設定します。

![sbnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426076/dbc0281c-4e15-2b59-3d53-92ed7246596e.png)



Webサーバーを置くサブネットの設定
| サブネット名(任意)|アベイラビリティーゾーン(後述) |IPv4 CIDR(任意) |タグ |
|---|---|---|---|
|aws-and-infra-public-subnet-1a |アジアパシフィック(東京)/ap-northeast-1a |10.0.10.0/24 |タグなし|


DBサーバーを置くサブネットの設定
| サブネット名(任意)|アベイラビリティーゾーン(後述) |IPv4 CIDR(任意) |タグ |
|---|---|---|---|
|aws-and-infra-private-subnet-1a |アジアパシフィック(東京)/ap-northeast-1a |10.0.20.0/24 |タグなし|

* アベイラビリティーゾーン(AZ)とはリージョンよりも小さな区分けで、特定エリア内のデータセンターの集まりのこと。
    * これにより、AZで障害が発生しても他のAZは利用可能なため、可用性の高いサーバーを構築できる。


### ルーティング設定
上記でVPCとサブネットを作成しましたが、現状ではインターネットに接続できません。なのでVPC内のルーティングテーブルにインターネットゲートウェイを登録し、インターネットと接続できるようにします。

まず、左側のメニューからインターネットゲートウェイを選択し、**インターネットゲートウェイの作成** をクリックし作成してください。

インターネットゲートウェイの設定
|名前タグ(任意)|
|-|
|aws-and-infra-igw|

作成したインターネットゲートウェイを上記で作成したVPCへアタッチしてください。

そしてルートテーブルを作成していきます。

まず、左側のメニューからインターネットゲートウェイを選択し、**ルートテーブルを作成** をクリックし作成してください。

ルートテーブルの設定

|名前タグ(任意)|VPC|
|-|-|
|aws-and-infra-igw|aws-and-infra-vpc|

作成したルートテーブルを選択し、下記の図の**ルート**からルートの編集、**サブネットの関連付け**からパブリックサブネットに関連付けを行います。

![rt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426076/d3babf84-3eda-c9f8-747c-b8ea85aea3a5.png)


ルートの編集(下記を追加)
|送信先|ターゲット|
|-|-|
|0.0.0.0/0|先程作成したインターネットゲートウェイ|
* 0.0.0.0/0は指定されていない通信すべてを指す。

サブネットの関連付け
* パブリックサブネット(aws-and-infra-public-subnet-1a )

を実行してください。

  

これでAWS上に仮想ネットワークが構築され、インターネットゲートウェイを通じてインターネットと通信が可能になりました。

## Webサーバー構築 
[EC2](https://aws.amazon.com/jp/ec2/)を使用して、WebサーバーをVPC内のパブリックサブネット上に作成しました。
EC2とはAWSクラウド上の仮想サーバーを作成できるサービスです。様々なマシンスペック、OSなど細かく設定でき、サーバーの追加・削除・仕様変更などを簡単に操作することができます。

基本的な流れは
* EC2インスタンスを設置する
    * 基本的に無料枠を選択
* SSHでEC2に接続
* Apacheのインストール
* ファイアウォールの設定
    *  基本的な方針
        * インバウンド通信はSSHのみ
        * アウトバウンド通信はすべて
* ElasticIPアドレス
    * 固定グローバルIPを取得

です。
詳細は[こちらの記事](https://qiita.com/machiryu/items/aa64458f4f051c079a37)を参考にしてください。



## DBサーバー構築
[RDS](https://aws.amazon.com/jp/rds/)を使用して、DBサーバーをVPC内のプライベートサブネット上に作成しました。
RDSとはフルマネージドなリレーショナルデータベースを作成できるAWSのサービスです。具体的にはOSインストールやアップデートスケーリングなどの構築・運用の手間を軽減することが出来ます。また、DBサーバーに必要な可用性(DBサーバーを継続的に運用する能力)を簡単に獲得することも可能です。

基本的な流れ
* プライベートサブネット作成(マルチAZにする人)
    * 注意
        * DBサーバーを置くサブネットは前回作成しているので必要ないです。
        * マルチAZにするためなのでAZを違うところに置いておくことに注意してください。
* セキュリティグループ設定
    * セキュリティグループはDB専用を設定
* RDSでDB作成
    * 注意
        * マルチAZにしない限り無料枠を使いましょう。
        * 費用が2000円ぐらいになるため、ちょっときつい。
* Webサーバーから接続確認



## DNS
DNSとはDomain Name Systemというドメイン名の管理システムです。具体的な処理としてはドメイン名をIPアドレスに変換する作業を行っています。AWSには[Route 53](https://aws.amazon.com/jp/route53/)というDNSサービスがあり、今回はそれを使用して取得したドメイン名をIPアドレスに変更するシステムを構築していきます。

執筆途中

Elastic IP

# 終わりに
本記事では主にVPC,EC2,RDSなどを使いWebサイトのサーバーを構築してきました。このあたりまで終えるとWebサイトを立ち上げることができ、とても実感がわきます。

注意点ですが、無料枠を使用していないRDSの料金が思った以上にかかりました...マルチAZにしないのであれば、無料枠を使用したほうがいいかと思います。

次の記事ではWebサイト上に記事のキーワード抽出ができるサービスを実装していきます。


# 参考文献
* [AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-and-infra/)