[WIP] 2. Javaで開発したWebアプリケーションの実行環境をAWSに構築する(EC2初期設定)

# 概要

Java(Spring-Bootを使用)で開発するWebアプリケーションの実行環境をAWS上に構築した作業内容のまとめです。
この記事は[Javaで開発したWebアプリケーションの実行環境をAWSに構築する(VPC&EC2作成)] (http://qiita.com/rubytomato@github/items/329e6c44627d0fa6e3fe)からの続きになります。この記事では「EC2初期設定」を書きました。

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

## sshクライアント

WindowsからEC2インスタンスへsshログインできるように設定を行います。
この記事ではPuTTYをsshクライアントとして使用しますが、そのためにはPUTTYGEN.exeを使ってEC2インスタンスのプライベートキーファイル(pem)を、ppkファイルへ変換する必要があります。

### ppkファイルの作成

PUTTYGEN.exeを起動し「Load」ボタンをクリックしてプライベートキーファイルを読み込みます。

![37-ppk-01.png](https://qiita-image-store.s3.amazonaws.com/0/22772/6b594631-6564-912f-77df-3488ccc48787.png)

「Save private key」ボタンをクリックし、ppkファイルとして保存します。

![38-ppk-02.png](https://qiita-image-store.s3.amazonaws.com/0/22772/a77b60a7-18d1-3284-2d56-c5cb3caa6994.png)

### PuTTYの設定

「Host Name」にPublicサブネットにあるEC2インスタンスのpublic IPアドレスを入力します。
「Saved Sessions」には、セッション名を入力します。(この例では"my-aws-20160503"としています。)

![session.png](https://qiita-image-store.s3.amazonaws.com/0/22772/b1c07169-f1c7-861d-e9be-f5489a9a8ec5.png)

セッションのタイムアウト(秒)を入力します。

![connection.png](https://qiita-image-store.s3.amazonaws.com/0/22772/5604ffbd-e434-da1c-10e4-509b12ef7d5a.png)

ログインするユーザー名を入力します。

![data.png](https://qiita-image-store.s3.amazonaws.com/0/22772/1a793e8d-9470-ca0a-4a04-51b5e9f7797a.png)

「Browse...」ボタンをクリックし作成したppkファイルを指定します。

![auth.png](https://qiita-image-store.s3.amazonaws.com/0/22772/f37f3b50-188e-979b-e5a2-976fa7fcf7a2.png)

Session画面へ戻り「Save」ボタンをクリックしてセッションを保存します。
このセッションで「Open」ボタンをクリックするとEC2へsshログインします。

```bash
Using username "ec2-user".
Authenticating with public key "imported-openssh-key"
Last login: Tue May  3 10:01:36 2016 from xxxxxxx.xxxxx.xxxxxxxxxxx.xxx.xxx

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2016.03-release-notes/
[ec2-user@ip-10-0-1-196 ~]$
```

### PrivateサブネットにあるEC2へログインする

PublicサブネットにあるEC2インスタンスはインターネットへ接続しており、且つマイIP(`自宅のIPアドレス`)からsshログインができるようにセキュリティグループで設定していますが、PrivateサブネットにあるEC2インスタンスはインターネットへ接続していないためWindowsから直接sshログインすることができません。
このため、一度PublicサブネットのEC2インスタンスへsshログインし、プライベートキーファイルを使ってPrivateサブネットにあるEC2インスタンスへsshログインします。

事前にWinSCPなどを使ってプライベートキーファイルをPublicサブネットのEC2インスタンスへアップロードしておきます。
あとは、下記のようにsshコマンドでPrivateサブネットにあるEC2インスタンスへsshログインすることができます。

```bash
$ ssh -i my-aws-keypair-20160503.pem ec2-user@10.0.2.111
```

#### 新しく認証鍵ファイルを用意する

上記の方法でPrivateサブネットにあるEC2へログインできるのですが、このプライベートキーファイルはEC2インスタンスに紐づいているため、なるべく複製しない方が
そこで、EC2インスタンス間でsshログインするための認証鍵ファイルを別途作成しそれを使うようにします。

```bash
$ cd .ssh
$ ssh-keygen -t rsa
```

上記で作成したid_rsa.pubを、scpコマンドでPrivateサブネットのEC2インスタンスへコピーします。

```bash:public
$ scp -i my-aws-keypair-20160503.pem id_rsa.pub ec2-user@10.0.2.111:
id_rsa.pub                                                                                      100%  404     0.4KB/s   00:00
```

プライベートキーファイルを使ってPrivateサブネットのEC2へログインします。

```bash:public
$ ssh -i my-aws-keypair-20160503.pem ec2-user@10.0.2.111
```

id_rsa.pubをauthorized_keysへ追加します。追加後はid_rsa.pubは不要なので削除します。

```bash:private
$ cat id_rsa.pub >> .ssh/authorized_keys
$ rm id_rsa.pub
$ exit
```

PublicサブネットのEC2へ戻り、プライベートキーファイルも削除します。

```bash:public
$ rm my-aws-keypair-20160503.pem
```

新しく作成した認証鍵でログインできるか確認します。

```bash:public
[ec2-user@ip-10-0-1-196 ~]$ ssh 10.0.2.111
Last login: Wed May  3 11:44:55 2016 from ip-10-0-1-196.ap-northeast-1.compute.internal

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2016.03-release-notes/
1 package(s) needed for security, out of 1 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-2-111 ~]$
```


## EC2の初期設定

EC2へログインできるようになったら、下記の設定を行います。(この設定はPublic/Privateサブネットの両方のEC2インスタンスで行いました。)

*/etc/sysconfig/i18n*

```bash
LANG=en_US.UTF-8
```
　　↓ 変更

```bash
LANG=ja_JP.UTF-8
```

*/etc/sysconfig/clock*

```bash
ZONE="UTC"
UTC=true
```
　　↓ 変更

```bash
ZONE="Asia/Tokyo"
UTC=false
```

*/etc/localtime*

```bash
$ sudo cp /etc/localtime /etc/localtime.org
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

*yum update*

```bash
$ sudo yum -y update
```


### MySQLのインストール (Public/PrivateサブネットのEC2)

EC2インスタンスよりRDSへMySQL Clientで接続するためにインストールします。

```bash
$ sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
```

```bash
$ sudo yum -y install mysql mysql-devel mysql-utilities
```

```bash
$ mysql --version
mysql  Ver 14.14 Distrib 5.6.30, for Linux (x86_64) using  EditLine wrapper
```


### nginxのインストール (PublicサブネットのEC2)

```bash
$ sudo yum -y install nginx
```

```bash
$ sudo service nginx status
nginx は停止しています
```

```bash
$ sudo chkconfig nginx on
```

```bash
$ sudo service nginx start
nginx を起動中:                                            [  OK  ]
```


### OpenJDKのインストール (PrivateサブネットのEC2)

Javaで開発したWebアプリケーションをビルド及び実行するのに必要になります。

```bash
$ sudo yum -y install java-1.8.0-openjdk-devel
```

**java**

```bash
$ sudo alternatives --config java

2 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2
```

```bash
$ java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
```

**javac**

```bash
$ sudo alternatives --config javac

2 プログラムがあり 'javac' を提供します。

  選択       コマンド
-----------------------------------------------
   1           /usr/lib/jvm/java-1.8.0-openjdk.x86_64/bin/javac
*+ 2           /usr/lib/jvm/java-1.7.0-openjdk.x86_64/bin/javac

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:1
```

```bash
$ javac -version
javac 1.8.0_91
```


### Mavenのインストール (PrivateサブネットのEC2)

Webアプリケーションのビルドで必要になります。

```bash
$ sudo wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
$ sudo sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo
$ sudo yum install -y apache-maven
```

```bash
$ mvn --version
Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T20:57:37+09:00)
Maven home: /usr/share/apache-maven
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-0.b14.10.amzn1.x86_64/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "4.4.5-15.26.amzn1.x86_64", arch: "amd64", family: "unix"
```

* [Install Maven with Yum on Amazon Linux] (https://gist.github.com/sebsto/19b99f1fa1f32cae5d00)


### gitのインストール (PrivateサブネットのEC2)

githubのリポジトリよりソースコードをcheckoutするのに必要になります。

```bash
$ sudo yum -y install git
```

```bash
$ git --version
git version 2.7.4
```

```bash
$ git config --global user.email "YOUR_MAIL_ADDRESS"
$ git config --global user.name "rubytomato"
```