[WIP] 1. Javaで開発したWebアプリケーションの実行環境をAWSに構築する(VPC&EC2作成)

# 概要

Java(Spring-Bootを使用)で開発するWebアプリケーションの実行環境をAWS上に構築した作業内容のまとめです。
AWSの勉強を目的とした自宅での作業になりますので色々詰めの甘いところがあると思いますがご容赦ください。(ご指摘頂ければ喜びます。)
内容が長くなったので下記のように分割し、この記事では「VPC&EC2作成」を書きました。

* 1. Javaで開発したWebアプリケーションの実行環境をAWSに構築する(VPC&EC2作成)
* 2. [Javaで開発したWebアプリケーションの実行環境をAWSに構築する(EC2初期設定)] (http://qiita.com/rubytomato@github/items/42d490de16b5f5eb9f07)
* 3. [Javaで開発したWebアプリケーションの実行環境をAWSに構築する(RDS)] (http://qiita.com/rubytomato@github/items/4ba375dfa1977a104098)
* 4. Javaで開発したWebアプリケーションの実行環境をAWSに構築する(Webアプリケーションのbuild&deploy) (未)

## Webアプリケーションのイメージ

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/22772/2ade610a-374d-ac6d-a748-1ce18f3e4e01.png)


## AWSに構築する実行環境

実行環境の概要図です。

![AWS Design.png](https://qiita-image-store.s3.amazonaws.com/0/22772/ae71888f-770f-2c91-cf08-1c83263ea974.png)

### サブネット

**Publicサブネット (概要図の左上)**

* nginx、MySQL clientをインストールしたEC2インスタンスを1つ配置します。
* クライアントからのhttpリクエストはこのnginxが受け取り、PrivateサブネットにあるEC2インスタンス上で実行するWebアプリケーションへ送ります。
* このEC2インスタンスへWindowsからsshログイン(踏み台サーバーの役目)が出来るようにします。
* このEC2インスタンスはルートテーブルに設定したInternet Gatewayを通じてインターネットへ接続できるようにします。
* Nat Gatewayを配置します。

**Privateサブネット (概要図の右上)**

* Java、Maven、MySQL client、gitをインストールしたEC2インスタンスを1つ配置します。
* このEC2インスタンスでJavaで開発したWebアプリケーションを実行します。
* WebアプリケーションはGitHubからソースコードをcheckoutしmavenでビルドします。
* このEC2インスタンスはルートテーブルに設定したNat Gatewayを経由してインターネットへ接続できるようにします。

**DB サブネットグループ (概要図の下半分)**

* 2つのPrivateサブネット(1a/1c)からなるサブネットグループにRDSインスタンスを配置します。
* Public/PrivateサブネットにあるEC2インスタンスからの接続できるようにします。


## 実行環境の構築手順

* VPCの作成
* Internet Gatewayの作成
* EIPの作成
* Publicサブネットの作成
 * ルートテーブルの作成
     * Publicサブネットのルートテーブルの付け替え
 * Nat Gatewayの作成
* Privateサブネットの作成
 * ルートテーブルの作成
     * Privateサブネットのルートテーブルの付け替え
* EC2インスタンスの作成 (Publicサブネットに配置)
 * セキュリティグループの作成
 * キーペアの作成 
* EC2インスタンスの作成 (Privateサブネットに配置)
 * セキュリティグループの作成 

(RDSは別の記事に書いてあります。)


### VPCの作成

まずVPCから作成します。
CIDRブロックは`10.0.0.0/16`としました。

![02-vpc-02.png](https://qiita-image-store.s3.amazonaws.com/0/22772/4e4d04ed-8f4f-b27e-2928-6b570d56e366.png)

![03-vpc-03.png](https://qiita-image-store.s3.amazonaws.com/0/22772/f5be0e69-51d6-17da-8767-21ee521532a7.png)

VPCを作成した直後の状態です。
ルートテーブルやネットワークACLなども同時に作成されていますが、ルートテーブルは用途別に新しく作成することにします。

![04-vpc-04.png](https://qiita-image-store.s3.amazonaws.com/0/22772/01fa2de4-e367-f371-ae5d-219be9ebd3e9.png)

DNSホスト名が無効(いいえ)になっているので、有効化します。
アクションボタンをクリックして「DNSホスト名の編集」から変更できます。

![04-vpc-04-b.png](https://qiita-image-store.s3.amazonaws.com/0/22772/1b376f3d-9a1a-3304-87cf-ae7372660cda.png)

![04-vpc-04-c.png](https://qiita-image-store.s3.amazonaws.com/0/22772/b3f861eb-a9c4-2292-4836-392f6f2177d3.png)


### Internet Gatewayの作成

次にInternet Gatewayを作成します。
後でPublicサブネットのルートテーブルに設定します。

![05-igw-01.png](https://qiita-image-store.s3.amazonaws.com/0/22772/181b7e0a-508f-0559-4570-c505c79ff215.png)

![06-igw-02.png](https://qiita-image-store.s3.amazonaws.com/0/22772/6c6324b3-91d3-ad18-aed4-a3ce523cf94b.png)

上記で作成したVPCにアタッチします。

![07-igw-03.png](https://qiita-image-store.s3.amazonaws.com/0/22772/b940302c-0a11-19f7-38d8-c784edd8f26b.png)

![08-igw-04.png](https://qiita-image-store.s3.amazonaws.com/0/22772/1bb8e59f-d835-515e-7502-faaa18267a72.png)


### EIPの作成

EIPを1つ確保します。このEIPはこの後に作成するNAT Gatewayで使用します。

![09-eip-01.png](https://qiita-image-store.s3.amazonaws.com/0/22772/ff7dfb8b-2433-7df8-f711-4a701f72aa6d.png)

![10-eip-02.png](https://qiita-image-store.s3.amazonaws.com/0/22772/42651b79-3e2c-3bda-51de-76f93788cd67.png)


### Publicサブネットの作成

AZ 1aにPublicサブネットを作成します。(Public = インターネットへ接続できるという意味)
CIDRブロックは`10.0.1.0/24`としました。
このサブネットにはnginxをインストールするEC2を配置することにします。

![11-public-subnet-http-01.png](https://qiita-image-store.s3.amazonaws.com/0/22772/897e8a37-bfee-85f0-39e9-1399c7583152.png)

![12-public-subnet-http-02.png](https://qiita-image-store.s3.amazonaws.com/0/22772/d3772e9f-a586-2666-6c9c-6d1cf387fd1e.png)

サブネットを作成した直後の状態です。
ルートテーブルにはVPCのデフォルトが設定されているので、この後で新しく付け替えます。

![13-public-subnet-http-03.png](https://qiita-image-store.s3.amazonaws.com/0/22772/d53d8c09-62e5-f0a1-29c4-bd8968749a10.png)

自動割り当てパブリックIPが無効になっているので有効化します。
サブネットのアクションボタンをクリックして「自動割り当てパブリックIPの変更」から変更できます。

![14-public-subnet-http-04.png](https://qiita-image-store.s3.amazonaws.com/0/22772/d8618f9c-a693-47d0-bae3-bdf81fac88ce.png)

![15-public-subnet-http-05.png](https://qiita-image-store.s3.amazonaws.com/0/22772/4f5dc051-4184-eb8b-4d53-c4172f4a63fd.png)


#### ルートテーブルの作成

上記で作成したPublicサブネットのルートテーブルを作成します。

![16-public-subnet-http-06-rtb.png](https://qiita-image-store.s3.amazonaws.com/0/22772/e1a4da8d-ba08-96b3-d33f-64aa762a298e.png)

送信先が`0.0.0.0/0`はInternet Gatewayへ送るようにルートを追加します。

![17-public-subnet-http-07-rtb.png](https://qiita-image-store.s3.amazonaws.com/0/22772/9b989c32-b413-5dcb-1cd1-d716936b9135.png)

##### Publicサブネットのルートテーブルの付け替え

上記で作成したルートテーブルで、Publicサブネットのデフォルトのルートテーブルと付け替えます。
これでこのサブネット内の通信は送信先がVPC向け(`10.0.0.0/16`)以外はインターネットへ向くようになります。

![18-public-subnet-http-08-rtb.png](https://qiita-image-store.s3.amazonaws.com/0/22772/bbb64c0e-9030-1a41-f17a-3b411e32c238.png)


#### Nat Gatewayの作成

Nat Gatewayを作成します。
後でPrivateサブネットのルートテーブルに設定します。

![19-public-subnet-http-09-nat.png](https://qiita-image-store.s3.amazonaws.com/0/22772/3b16f782-5fb5-6740-2cd9-7c9a9378e576.png)

作成するには、サブネットにPublicサブネットを指定するのとEIPが必要になります。

![20-public-subnet-http-10-nat.png](https://qiita-image-store.s3.amazonaws.com/0/22772/e2fe3c1f-20e8-6bea-7e03-7fece12ef883.png)

![21-public-subnet-http-11-nat.png](https://qiita-image-store.s3.amazonaws.com/0/22772/4a7e7870-a7f4-4a6e-1bec-8a5d49ad74bc.png)

* [NAT ゲートウェイ] (http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html)
* [NAT インスタンスと NAT ゲートウェイの比較] (http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-nat-comparison.html)


### Privateサブネットの作成

AZ 1cにPrivateサブネットを作成します。(Private = インターネットへ接続できないという意味)
CIDRブロックは`10.0.2.0/24`としました。
このサブネット内にWebアプリケーションを実行するEC2を配置することにします。

![22-private-subnet-web-01.png](https://qiita-image-store.s3.amazonaws.com/0/22772/c59745cb-c6c1-b541-c360-cf48ff6da427.png)

サブネットを作成した直後の状態です。
ルートテーブルにはVPCのデフォルトが設定されているので、この後で新しく付け替えます。

![23-private-subnet-web-02.png](https://qiita-image-store.s3.amazonaws.com/0/22772/d5812931-1bab-164e-9221-404b7a64dbb1.png)


#### ルートテーブルの作成

上記で作成したPrivateサブネットのルートテーブルを作成します。

![24-private-subnet-web-03-rtb.png](https://qiita-image-store.s3.amazonaws.com/0/22772/ad76ae2d-a812-b43d-a5d8-79590b330c3c.png)

送信先が`0.0.0.0/0`はNat Gatewayへ送るようにルートを追加します。

![25-private-subnet-web-04-rtb.png](https://qiita-image-store.s3.amazonaws.com/0/22772/ad96f21f-3faa-5950-a8b3-8e4ce148d514.png)

##### Privateサブネットのルートテーブルの付け替え

上記で作成したルートテーブルで、Privateサブネットのデフォルトのルートテーブルと付け替えます。
これでこのサブネット内の通信は送信先がVPC向け(`10.0.0.0/16`)以外はNat Gatewayを経由してインターネットへ向くようになります。

![26-private-subnet-web-05-rtb.png](https://qiita-image-store.s3.amazonaws.com/0/22772/445556c3-4a43-a3a1-26d8-38a0389860aa.png)


### EC2インスタンスの作成 (Publicサブネットに配置)

nginxを実行するためのEC2インスタンスをPublicサブネットへ作成します。
AMIには`Amazon Linux`、インスタンスタイプは`t2.micro`を選びました。

サブネットにPublicサブネットを選びます。

![30-shurink.png](https://qiita-image-store.s3.amazonaws.com/0/22772/39d6d4ff-6465-ed71-2a4b-6ae3e417c0c2.png)

#### セキュリティグループの作成

このEC2インスタンス用のセキュリティグループを作成します。
sshはマイIP(`自宅のIPアドレス`)からのみ接続できるようにします。
httpは任意の場所(`0.0.0.0/0`)から接続できるようにしました。

![33-shurink.png](https://qiita-image-store.s3.amazonaws.com/0/22772/e8156ec5-9d24-600c-a983-5f1117a32b8b.png)

#### キーペアの作成

新しくキーペアを作成します。この後に作成するEC2インスタンスでもこのキーペアを使用します。
プライベートキーファイル(pem)をダウンロードするとEC2インスタンスの作成が進められるようになります。

![35-ec2-http-08-keypair.png](https://qiita-image-store.s3.amazonaws.com/0/22772/8e032d32-22ea-d5b0-66d4-76a7f5c48977.png)

EC2インスタンスを作成した直後の状態です。

![39-ec2-http-10.png](https://qiita-image-store.s3.amazonaws.com/0/22772/3548f840-8729-2d03-63f3-4a3cf4ededd4.png)


### EC2インスタンスの作成 (Privateサブネットに配置)

Webアプリケーションを実行するためのEC2インスタンスをPrivateサブネットへ作成します。
サブネットにPrivateサブネットを選びます。

![40-shurink.png](https://qiita-image-store.s3.amazonaws.com/0/22772/32cf4110-dc21-1f60-f3fa-3038bafeef2d.png)

#### セキュリティグループの作成

このEC2インスタンス用のセキュリティグループを作成します。
sshはPublicサブネットのEC2からのみ接続できるようにします。
カスタムTCPポート9000はJavaで開発したWebアプリケーションの接続ポートです。これもsshと同様にPublicサブネットのEC2からのみ接続できるようにします。
(厳密に言えば、送信元に設定したセキュリティグループ(ID:`sg-961c99f2`)に属するEC2インスタンスからの接続が可能になります。)

![42-shurink.png](https://qiita-image-store.s3.amazonaws.com/0/22772/8469f411-f60a-b212-71d1-ffff2b4f66b8.png)

EC2インスタンスを作成した直後の状態です。
キーペアは、1つ目のEC2インスタンスで作成したときの`my-aws-keypair-20160503`を使用しました。

![45-ec2-web-06.png](https://qiita-image-store.s3.amazonaws.com/0/22772/3b9fa6f3-906b-5a96-6493-4a479d37a8db.png)