EC2+RDS+SpringBootアプリケーションでwebページを公開する。

概要
---
EC2、RDS、MYSQL、SpringBootを使ったwebページ公開の方法がネットに転がってなかったので、自分がやってできた方法をメモ代わりに書いておきます。


本記事のゴール
---
SpringBootで作ったデータベースを使うアプリケーションをwebに公開できるようにします。

本記事は以下の環境や知識がある前提で進めます
---
- AWSアカウント
- eclipse2019 4.14
- maven
- JDK1.8
- Java8
- spring boot 2.1.1
- すでにデータベースを使うアプリケーションを作成済み
- EC2インスタンスを作成済み
- RDSインスタンスを作成済み
- RDSインスタンスにデータベース作成済み
- teratermでEC2にSSH接続済み

1.eclipseにAWS Toolkit for Eclipseをインストール
---
eclipseからRDSに接続するためにAWS Toolkit for Eclipseをインストールします。
(これをしないとアプリケーションをjarファイルにするときにエラーが起きます。)

①ヘルプ（H）」>「Eclipse マーケットプレイス（M）...」を選択。
![tool機能画像1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670576/a06ba18f-4660-015f-b2cf-12ea4539ab63.jpeg)


②「AWS Toolkit for Eclipse 2.0」の「インストール」をクリック。
![tool画像２.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670576/493955fd-3f82-2091-6711-9e88a4cbbd57.jpeg)

③インストールするツールを選択する画面が表示されるので、すべてにチェックが付いていることを確認し、「確認（C）>」をクリック。

![tool画像３.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670576/ce9286cb-bfc2-8b54-e769-1508d32872c4.jpeg)

④「使用条件の条項に同意します（A）」にチェックを付け、「完了（F）」。
![tool4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670576/e6824951-7d9a-c033-cc09-6d39ecff0b36.jpeg)

⑤インストールが完了すると、再起動を促されるので、「はい（Y）」を選択。
![tool5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670576/013fba02-211a-8b65-237a-0c7245ca8070.jpeg)

⑥「AWS Toolkit for Eclipse」のアイコンが追加されます。
![tool6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670576/3aad0240-774c-c569-62ae-48ace063c42d.jpeg)

2.eclipseとEC2を接続する
---
①AWS toolkit for Eclipseのアイコンの横の▼をクリックし、「Open AWS Management Perspective」を選択。
![toool7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670576/6b4c316b-e16e-2d86-6e49-feb68811afd3.jpeg)
「AWS Management」という「パースペクティブ」に切り替わります。

②「AWS Exploer」の「AWS Account not Configured」を選択した状態で右クリックし、「Configure AWS Accounts」を選択。
![tool8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670576/e6003060-40bc-0ed0-8b3a-cc3e1e4e49ff.jpeg)

「アクセス・キーID（A）：」「秘密アクセス・キー（S）：」を入力します。

「アクセス・キーID（A）：」「秘密アクセス・キー（S）：」は、AWS側のコンソールの「すべてのサービス」>「IAM」を選択し、「ユーザー」でユーザーを選んだあとに、「認証情報」タブに切り替えて、

![9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670576/3ace38d2-006a-354f-beb3-54fcb7bb0f62.jpeg)

「アクセスキー」の項目の「アクセスキー ID」で「アクセス・キーID（A）：」は確認できます。
![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670576/c15dd868-8c7f-ac32-91ca-f05f399d6832.jpeg)

アクセスキーがなければ「アクセスキーの作成」を押して作成しましょう。

「アクセス・キーID（A）：」「秘密アクセス・キー（S）：」を入力したらOKをおして接続完了となります。


3.Springアプリケーションの設定
---
①Pom.xmlを更新する
packingをjarにする(groupIdなどは各自で違います）

```
	<groupId>com.example</groupId>
	<artifactId>SpringSample</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

```

spring-boot-maven-pluginの下にtrueを加える

```
<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
                    <executable>true</executable>
                </configuration>
			</plugin>
		</plugins>
	</build>
```

②application.propertiesの更新

```
spring.datasource.url=jdbc:mysql://RDSのエンドポイント:3306/RDSにあるデータベース名?serverTimezone=JST
spring.datasource.username=RDSのユーザー名
spring.datasource.password=RDSのパスワード
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.jpa.database=MYSQL
spring.datasource.initialize=true
spring.datasource.sql-script-encoding=utf-8
server.port=50000
```
RDSのエンドポイントなどは各自調べでお願いします。
server.port=50000はポート番号のルールに沿っていれば何番でも大丈夫です。
このポート番号がURLの一部になります。



4.アプリケーションをjarファイル化する
---
プロジェクトを右クリック ＞ 実行 ＞ install
![11.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670576/ab89dfd6-a9bc-4e43-75a7-e4953a444ac9.jpeg)


プロジェクト内に「target」というフォルダが現れ、そこにビルドしたjarファイルがあるはずです.

5.jarファイルをEC2にデプロイする
---
jarファイルのデプロイはteratermのGUIで簡単にできます。

ファイル→SSH SCP...→Fromにデプロイしたいファイルを指定→Send

詳しくはこちら↓
https://qiita.com/go-to/items/409e32116213bdf4b1ce

6.jarファイル化したアプリケーションの起動
---
デプロイされたjarファイルは/home/ユーザー名のところに配置されているので
以下のコマンドで実行してみましょう。

```
java -jar /home/ユーザー名/jarファイル名
```
するとEC2ないでSpringアプリケーションが実行されるので試しにブラウザ上で表示してみましょう。

http://EC2で用意されているIPv4パブリックIP:設定したポート番号/表示したいHTMLファイル名

で表示できます。
例：http://32.890.424.24:50000/login

7.アプリケーションのサービス化
---
問題なくブラウザ上で表示ができたら今度はアプリケーションをEC2サーバーの中でサービス化しましょう。

今の状態だとSSHの接続を切るとアプリケーションの起動も止まってしまうので、
バックグラウンド上で常に起動状態にするために行うのがサービス化です。
(LinuxOSの場合デーモン化とも呼びます。)

①サービス登録
サービス登録するためにEC2サーバー上で「アプリケーション名.service」ファイルを作ります。

```
vi /etc/systemd/system/アプリケーション名.service


[Unit]
Description = ファイルの説明文
After=syslog.target

[Service]
ExecStart = jarファイルのパス(例：/home/ec2-user/SpringSample-0.0.1-SNAPSHOT.jar）
Restart = always
Type = simple
User = jarファイルのユーザー
Group = jarファイルのグループ
SuccessExitStatus = 143

[Install]
WantedBy = multi-user.target
```
jarファイルのユーザーとグループは以下のコマンドで調べられます。

```
ls -l jarファイルのパス
```
②反映
ファイルを作成したらリロードして反映させます。

```
# systemctl daemon-reload
```

③自動起動有効
サーバーが立ち上がったら自動的に起動するようにします。

```
# systemctl enable アプリケーション名.service
```
④サービスの権限変更

```
chmod 744 jarファイルのパス
```

⑤サービスを起動

```
systemctl start アプリケーション名.service 
```

⑥サービスの状態の確認

```
systemctl status アプリケーション名.service -l
```
以下のように表示れたらサービス化成功です。

```
● アプリケーション名.service - アプリケーション名
   Loaded: loaded (/etc/systemd/system/アプリケーション名.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-07-08 11:07:05 UTC; 19h ago
 Main PID: 22142 (SpringSample-0.)
   CGroup: /system.slice/アプリケーション名.service
           tq22142 /bin/bash /home/ユーザー名/アプリケーション名
           mq22156 /usr/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /home/ユーザー名/アプリケーション名
```

SSH接続を切ってもブラウザ上で表示できるようになっていると思います。