AWSを避けていたPGがALBとEC2を利用してWEBアプリケーション環境を構築してみた

# 初めに

最近流行りというわけではないですが、AWSを~~ついに~~学びました。

自分はフロントのあれやこれやが好みで、インフラは避けて生きていたのですが

今回学ぶ機会があり、いろいろ調べて実際に構築してみたのでそれを書いていきたいと思います。

すごいですねAWS（小並感）

全体で3部構成の記事になります。

第1部　「[AWSを避けていたPGがALBとEC2を利用してWEBアプリケーション環境を構築してみた](http://qiita.com/tiwu_official/items/220e00c9a18c6c8adb54)」←今ここ

第2部　「LambdaとCloud WatchによるEC2の夜間停止」

第3部　「ALBによるパスルーティング」

# 前置き

[0から始めるAWS入門：概要](http://qiita.com/hiroshik1985/items/6433d5de97ac55fedfde)を基本的に参考にして構築をしております。


解釈や説明の誤りなど、コメント欄に記載していただけると幸いです。

# 構成図

自分が今回構築するのは下記のような環境です。

VPC内にEC2を構築し、ALBによるルーティング制御を行います。

![AW_AWS.png](https://qiita-image-store.s3.amazonaws.com/0/81308/d3126e2a-5fed-930f-8ffa-fd1a954c488b.png)


# VPC

まず初めにVPCの構築をしていきたいと思います。

最近HOME画面が変わったのかわかりませんがHOME画面からVPCを選択。

![AWS Management Console.jpeg](https://qiita-image-store.s3.amazonaws.com/0/81308/e3dd9d8b-611f-5b45-1fc7-b47a9c0c6003.jpeg)

左のメニューから「Your VPCs」を選択して「Create VPC」ボタンをクリック。

<img width="1256" alt="スクリーンショット 2016-11-23 16.46.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/74f7cde6-f476-8fd2-8e1f-ad58e938c091.png">

Create VPCというポップアップが出るので項目を埋めていきます。

<img width="712" alt="スクリーンショット 2016-11-23 17.02.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/cd17cdff-9ac3-fc84-8e56-a56058813f1b.png">


| 項目 | 値 |
|:-:|:-:|
| Name Tag | 適当に |
| CIDR block  | 10.0.0.0/16  |
|  tenancy |  Default |

埋め終わったら「Yes,Create」をクリックして完了。

## Internet Gateways

VPCはAWSにある独立した環境なのでこのままではインターネット等でアクセスができません。

そのためインターネットとVPCを繋げるInternet Gatewaysを作成します。

VPCの画面の左のメニューから「Internet Gateways」を選択し、「Create Internet Gateways」ボタンをクリック。

<img width="1263" alt="スクリーンショット 2016-11-23 17.22.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/c2803b62-0874-367e-17ec-4a784839c2d3.png">

Create Internet Gatewaysというポップアップが出るので項目を埋めていきます。

<img width="718" alt="スクリーンショット 2016-11-23 17.23.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/206b2ff8-4844-6242-5942-5972b12b6f1b.png">


| 項目 | 値　 |
|:-:|:-:|
| Name Tag  |  適当に |

埋め終わったら「Yes,Create」をクリックして完了。

その後、「Attach to VPC」ボタンをクリック。

<img width="1051" alt="スクリーンショット 2016-11-23 17.26.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/83381b10-f717-3ce4-9752-94b45db6b427.png">

Attach to VPCポップアップが出るので項目を埋めていきます。

<img width="720" alt="スクリーンショット 2016-11-23 17.27.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/05e63a42-2b5e-be6e-b576-e4c16b17a789.png">


| 項目 | 値 |
|:-:|:-:|
| VPC  |  先程作成したVPC |

埋め終わったら「Yes,Attach」をクリックして完了。


## Route Tables

最後にRoute Tablesにルーティングの設定をして、インターネットの接続が完了します。

<img width="1258" alt="スクリーンショット 2016-11-26 19.50.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/7d315e70-b593-bc1a-e739-3071e993c6c2.png">


VPCの画面の左のメニューから「Route Tables」を選択し、先程作成したVPCのRoute Tablesを選択し、下部に表示されるタブから「Routes」を選択し、「Edit」をクリックします。

<img width="1267" alt="スクリーンショット 2016-12-04 14.54.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/446d706e-d53d-be47-ce2c-594a22be2ec2.png">

「Edit」をクリック後ルーティングの追加ができるため、項目を埋めていきます。

| 項目 | 値 |
|:-:|:-:|
| Destination | 0.0.0.0/0 |
| Target | 先程作成したInternet Gateways（補完で出るかと思います）  |

埋めたら「Save」をクリックして完了。

# Subnet

VPCの構築が終わったら次にSubnetを作成します。

SubnetはALBで2つ紐付けるのが必須のため、Availability Zoneで分けて2つ作成します。

VPCの画面の左のメニューから「Subnets」を選択し、「Create Subnet」ボタンをクリック。

<img width="1265" alt="スクリーンショット 2016-11-23 17.05.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/8ed4bc2a-4ae7-db51-7257-c9e5842c8e12.png">

Create Subnetというポップアップが出るので項目を埋めていきます。

<img width="718" alt="スクリーンショット 2016-11-23 17.10.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/a9877cb2-795c-9b6b-fb86-1ebbbe0fd9f0.png">


### 1つ目

| 項目 | 値 |
|:-:|:-:|
|  Name tag | 適当に  |
| VPC  |  先程作成したVPC |
|  Availability Zone |  ap-northeast-1a |
|  CIDR | 10.0.0.0/24  |

### ２つ目

| 項目 | 値 |
|:-:|:-:|
|  Name tag | 適当に  |
| VPC  |  先程作成したVPC |
|  Availability Zone |  ap-northeast-1c |
|  CIDR | 10.0.1.0/24  |


埋め終わったら「Yes,Create」をクリックして完了。


# EC2

VPCとSubnetの作成が終わったらいよいよEC2を作成します。

HOME画面からEC2を選択します。

<img width="1262" alt="スクリーンショット 2016-11-27 23.25.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/45aba162-0e6d-0b66-5188-a27498e78cf4.png">


左のメニューから「Instances」を選択して「Launch Instance」をクリックします。

<img width="1260" alt="スクリーンショット 2016-11-27 23.29.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/4520b369-9699-7939-0402-6f0e898042ff.png">

## Step 1: Choose an Amazon Machine Image (AMI)

Step 1でOSを選択します。

Amazon Linuxの右側の「Select」ボタンをクリック。

<img width="1264" alt="スクリーンショット 2016-11-27 23.31.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/5b1f8b99-6210-7a57-ceb2-e8b4f913afdf.png">

## Step 2: Choose an Instance Type

次にStep 2としてインスタンスタイプを選択します。

デフォルトでチェックがついていると思いますが、t2.microの左側にチェックをいれ右下の「Next: Configure Instance Details」をクリック。


<img width="1264" alt="スクリーンショット 2016-11-27 23.34.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/13831e8d-3557-2580-cc08-73ca5b08bbe0.png">

## Step 3: Configure Instance Details

次にStep 3としてEC2の詳細設定をしていきます。

下記項目と値を埋めていきます。

| 項目 | 値 |
|:-:|:-:|
|  Number of instances | 1  |
| Purchasing option  | オフ |\
|  Network | 先程作成したVPC  |
|  Subnet | 先程作成したSubnet  |
|  Auto-assign Public IP | Enable|
|  IAM role | None|
|  Shutdown behavior | Stop|
|  Enable termination protection | オフ|
| Monitoring | オフ|
|  Tenancy| Shared|

下部のNetwork interfacesやAdvanced Detailsはそのままで右下の「Next: Add Storage」をクリック。

<img width="1269" alt="スクリーンショット 2016-11-27 23.45.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/a85b2975-8711-04a9-0589-c7d73bdf153b.png">

## Step 4: Add Storage


次にStep 4としてストレージを設定します。

下記項目と値を埋めていきます。

SizeもVolume Typeもデフォルトのまま右下の「Next: Add Tags」をクリック。

| 項目 | 値 |
|:-:|:-:|
| Size (GiB) | 8  |
|Volume Type| General Purpose(SSD)|


<img width="1257" alt="スクリーンショット 2016-11-28 0.13.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/ba20c325-f363-342f-2965-0be69f479986.png">


## Step 5: Add Tags

次にStep 5としてタグを指定します。

KeyはデフォルトのままNameにして、Valueにわかりやすいインスタンス名を入力して右下の「Next: Configure Security Group」をクリック。

| 項目 | 値 |
|:-:|:-:|
| Key | Name  |
|Value|  適当に|


<img width="1268" alt="スクリーンショット 2016-11-28 21.47.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/302ed7d3-fafe-e0f3-1a86-8b945f2bcc30.png">

## Step 6: Configure Security Group


次にセキュリティグループの設定をします。

今回EC2はALBからのみHTTPアクセスを受け付け、インターネット経由で直接アクセスされた場合はブロックするよう設定していきます。

また、SSHは自分のPCからのみ受け付けるよう設定します。

デフォルトではルールは一つだけのため「Add Rule」をクリックしてルールを増やします。

入力したら右下の「Review and Launch」をクリック。


※開発者がテストのため直接HTTPでアクセスしたい場合はHTTPのルールをMY IPに変更してください

### SSH

| 項目 | 値 |
|:-:|:-:|
| Type | SSH  |
| Protocol |  TCP |
|Port Range|  22|
|Sorce|  My IP  （自動でIPが設定されます）|


### HTTP

| 項目 | 値 |
|:-:|:-:|
| Type | HTTP  |
| Protocol |  TCP |
|Port Range|  80|
|Sorce| Custom （10.0.0.0/16）|




<img width="1265" alt="スクリーンショット 2016-11-28 22.08.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/ece43289-70ef-4154-02ad-7c6bbb0f7c5a.png">

## Step 7: Review Instance Launch

設定の確認をして、右下の「Launch」をクリック。

※画像は各タブを全て閉じています。


<img width="1266" alt="スクリーンショット 2016-11-28 22.24.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/15c84c74-cd22-d9df-c9e1-28db16401f7f.png">

## 公開鍵、秘密鍵

最後にEC2のSSH接続のための公開鍵、秘密鍵の設定をします。

「Create a new key pair」を選択して新しい公開鍵、秘密鍵を作成します。

「Key pair name」に適当に名前を入力して「Download Key Pair」をクリックして、秘密鍵をダウンロードしてください。

秘密鍵は失くすと再発行はできないため、絶対に失くさないでください。

秘密鍵をダウンロードしたら「Launch Instances」をクリックして完了です。

<img width="725" alt="スクリーンショット 2016-11-28 22.34.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/8242c872-7212-f7a2-f03d-99f37570e038.png">

## SSH

インスタンスはEC2の左のメニューのInstancesから一覧で見れます。

作成したEC2を選択して「Description」タブで詳細な情報が見れます。

SSHに必要なIPは右下の「Public IP」に記載されています。

<img width="1264" alt="スクリーンショット 2016-11-28 23.08.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/b5368a6c-e393-d75a-fcbf-0bf0d9afd050.png">

SSHは秘密鍵があるディレクトリに移動して下記コマンドを叩きます。

`ssh ec2-user@【EC2のIP】 -i hoge.pem`

初回時は「Are you sure you want to continue connecting (yes/no)?」と聞かれるため「yes」と入力して、SSH接続をします。

※「WARNING: UNPROTECTED PRIVATE KEY FILE!」と聞かれたら「sudo」をつけてSSHコマンドを叩いてみてください。

無事アクセスできたら、nginxをインストールして実際にEC2が起動しているのをブラウザからテストします。（テストのためセキュリティグループのHTTPにMy IPを付与している場合）

```
sudo yum install -y nginx
sudo /etc/init.d/nginx start
```

インストールして、起動したらブラウザにEC2のIPを入力して下記画面が出たらテスト完了です。

<img width="1262" alt="スクリーンショット 2016-11-28 23.30.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/14324fd6-2942-e515-56e6-83af1111bc31.png">


# ALB

EC2も作成できたので次はALBを構築していきます。

ALBはApplication Load Balancerと呼ばれ最近発表された新しい機能です。

ELBと比べ、L7の機能が強化されています（HTTP2やWeb Socketに対応していたり、URLのパスによるルーティングを実装していたり）

ALBはELBと違ってロードバランサーにEC2を紐付けるのではなく、EC2をターゲットグループというグループでグループ化して、ターゲットグループをロードバランサーに紐付けます。

そのため、まずはターゲットグループを作成していきます。


## Target Group

EC2の左のメニューから「Target Group」を選択し、「Create Target group」をクリック。


<img width="1270" alt="スクリーンショット 2016-11-28 23.42.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/a9e63e70-9fde-40b3-7082-147f280c52a6.png">


Create target groupというポップアップが出るので項目を埋めていきます。

Health check settingsとAdvanced health check settingsはそのままで「Create」をクリックして完了です。


| 項目 | 値 |
|:-:|:-:|
| Target group name | 適当に |
| Protocol |  TCP |
|Port|  80|
|VPC| 先程作成したVPC|

<img width="1280" alt="スクリーンショット 2016-12-04 15.03.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/f6c8c890-8155-b4c0-5bff-b735ab5d7f41.png">

ターゲットグループを作成したらターゲットグループにEC2を紐付けます。

ターゲットグループを選択してTargetsタブから「Edit」をクリック。

<img width="1272" alt="スクリーンショット 2016-12-04 15.05.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/e54849a9-7673-1409-e005-673b945ee056.png">

Register and deregister instancesポップアップが出ます。

上部リストには現在紐付いているEC2の一覧、下部リストには現在起動してるEC2の一覧が表示されます。

<img width="1278" alt="スクリーンショット 2016-12-04 15.08.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/54ae0fdc-7360-2246-6cf1-f77acfbb3fe0.png">

下部リストから紐付けるEC2を選択して「Add to registerd」をクリックします。（下記画像はAdd to registerdクリック後）

EC2を紐付けたら右下の「Save」をクリックして完了です。

<img width="1280" alt="スクリーンショット 2016-12-04 15.10.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/f5ec60c8-a5ea-b924-38f0-e357b3546992.png">



## ALB

最後にALBを作成してALBにターゲットグループを紐付けて環境構築は完了です。

EC2の左のメニューから「Load Balancers」を選択し、「Create Load Balancer」をクリック。

<img width="1270" alt="スクリーンショット 2016-12-04 15.14.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/a76db42b-0edc-4845-4409-33a4da5c2ed5.png">

ALBかELB（Classic Load Balancer）のどちらか聞かれるのでALBを選択して「Continue」をクリック（デフォルトでALBが選択されていると思います）

<img width="1280" alt="スクリーンショット 2016-12-04 15.15.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/aff03d64-176d-13e9-f113-865c3b56407a.png">

### Step 1: Configure Load Balancer

まず、NameとSchemeを埋めます。

| 項目 | 値 |
|:-:|:-:|
| Name | 適当に |
| Scheme |  internet-facing |

ListenersはHTTPを選択します。


| 項目 | 値 |
|:-:|:-:|
| Load Balancer Protocol | HTTP |
| Load Balancer Port |  80|

<img width="1270" alt="スクリーンショット 2016-12-04 15.19.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/2b9cf1db-6776-a24b-32fd-4cfb1cc36e83.png">

Availability Zonesはまず、先程作成したVPCを選択します。



| 項目 | 値 |
|:-:|:-:|
| VPC | 先ほど作成したVPC |

VPCを選択すると、Available subnetsに先ほど作成したSubnetが2つ表示されます。

subnetの左側の「＋」アイコンをクリックしてサブネットをSelected subnetsに移動させます。

<img width="1266" alt="スクリーンショット 2016-12-04 15.22.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/a13e27cb-05d5-fc5c-090c-47738a8163fb.png">

移動後

<img width="1273" alt="スクリーンショット 2016-12-04 15.24.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/d0380aa6-c38f-980b-fb36-e1878c7504b8.png">

移動させたら右下の「Next: Configure Security Settings」をクリック。

### Step 2: Configure Security Settings

ここはListenersでHTTPSを選択した際の証明書を設置するところです。

今回はHTTPを選択しているので何もせず右下の「Next: Configure Security Groups」をクリック。

<img width="1266" alt="スクリーンショット 2016-12-04 15.27.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/d4490268-fb9f-e63f-9b8e-dc8f180d0d3c.png">

### Step 3: Configure Security Groups

次にALB用のセキュリティグループを設定します。

今回はテストのため自分のIPのみ許可します。（Anywhere 0.0.0.0/0で誰からも受け付けたり良しなに変えてください）


| 項目 | 値 |
|:-:|:-:|
| Type | HTTP |
| Protocol |  TCP |
|Port Range|  80|
|Sorce|  My IP  （自動でIPが設定されます）|

作成したら右下の「Next: Configure Routing」をクリック。

<img width="1261" alt="スクリーンショット 2016-12-04 15.31.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/a5f7d7e0-8696-52df-b767-e5a44168ec9d.png">


### Step 4: Configure Routing

次にALBにターゲットグループを紐付けます。

| 項目 | 値 |
|:-:|:-:|
| Target group | Existing target group |
| Name | 先程作成したターゲットグループ |
|Protocol|  HTTP|
|Port|  80|

Health checksとAdvanced health check settingsはそのままで右下の「Next: Register Targets」をクリック。

<img width="1261" alt="スクリーンショット 2016-12-04 15.33.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/e104e501-02d5-90e3-d719-acb873ef0e14.png">


### Step 5: Register Targets

ここでは登録されたEC2の一覧が表示されます。

ターゲットグループに登録されているEC2が表示されているのを確認したら右下の「Nexｔ: Review」をクリック。

<img width="1270" alt="スクリーンショット 2016-12-04 15.36.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/4a0c0d93-7c7e-4d98-4c86-0d971a3ce2b5.png">


### Step 6: Review

最後に設定の確認をして、右下の「Create」をクリックしてALBの作成は完了です。


<img width="1272" alt="スクリーンショット 2016-12-04 15.38.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/196bbf81-88fe-6328-4cba-cd0b1d3593c7.png">



## 確認

ALBのStateがactiveになっているのを確認したらALBのDescriptionタブのDNS nameをブラウザから叩けば先程作成したEC2にアクセスにでき、nginxのwelcomeページが表示されると思います。


<img width="1264" alt="スクリーンショット 2016-12-04 15.45.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/a91b364f-4e4c-2ab3-8532-37e5b9ecdcf1.png">



# 最後に

長くなりましたがこれで、基本的なWEBアプリケーション環境の構築は完了です。

まだ、サーバー構成などの知識はないですが、この環境にSSHの踏み台としてEC2を立ち上げたり、現状ALBがあまり役に立っていないのでターゲットグループに2つ目のEC2を紐付けたりいろいろやれることはありそうだなと実感しました。

次回はLambdaによるEC2の夜間停止を書いていきたいと思います〜。


※EC2やALBは起動していると料金が発生するので立ち上げたEC2は停止し、ALBは削除してください