【Spring】AWSデプロイで初心者がぶち当たる疑問に答える

# 概要
ローカル環境（Eclipse）でSpring Boot（Java）アプリケーションを開発し、その後AWSでデプロイに挑戦しようとする初心者がぶち当たるであろう疑問と、その解決策を順を追って説明します。

私自身、AWSやその周辺知識ゼロの状態から独学でデプロイに成功できましたが、知っている人からすれば当たり前でも初心者ゆえにわからないことが多く、解決に時間を要しました。本記事では、初心者なら私と同じような疑問をもつのでは？と感じた部分に触れていきます。

# 本記事のゴール
- DBを利用するローカルのSpringアプリケーションをjar化し、デプロイできるようになる（具体的には下記）
    - Eclipseからjarファイルを作成しEC2に配置できるようになる
    - EC2で環境変数を適切に設定し、RDSのDBに接続できるようになる
- AWSデプロイという、初心者が尻込みしがちな未知の作業に対するハードルを下げる

# 本題
こちらの記事を参考にデプロイに挑戦、またデプロイに必要な周辺知識について調べていたところ疑問点が複数出てきました。

- [【初心者必見】Eclipseで作成したJavaWebアプリケーションをAWSにデプロイする。その①](https://qiita.com/AIM-Z/items/4848e061f21eacf0e815)
- [【初心者必見】Eclipseで作成したJavaWebアプリケーションをAWSにデプロイする。その②](https://qiita.com/AIM-Z/items/4f94257bca30beec2cea)
- [【初心者必見】Eclipseで作成したJavaWebアプリケーションをAWSにデプロイする。その③（最終回）](https://qiita.com/AIM-Z/items/97d52b7ed45bcc7e66be)
- [【AWS】入門その⑧　EC2とRDSを利用して簡易Webアプリを構築してみる](https://www.wantanblog.com/entry/2019/09/21/190819)

## 1つ目の疑問：WAR? JAR?
### なんやねん、それ？
Springアプリケーションのデプロイ方法について調べると、間違いなく出てくる専門用語が"WAR"と"JAR"ではないでしょうか。両社とも、つまるところデプロイに必要なファイルを一つにまとめて圧縮したものですが、結局どっちにすべき？というのが1つ目の疑問です。

まず両社の違いについて、最低限AWS初心者が認識しておくべきは下記の点かと思います。

- WAR：デプロイ時にTomcatが必要
- JAR：デプロイ時にTomcatは不要（JARにTomcatを内包している）

参考までに、こちらは色々な観点からWARとJARの違いをうまく説明していると感じました。
[Spring Bootで実行jarを使うデメリット（warのデプロイとの比較）](https://teratail.com/questions/107234)

### で、どっち使うべき？
両社の違いを踏まえたうえで、どちらを使うべきなのかと言いますと、
- WARを使うべき人
    - 何らかの事情によりすでにTomcatが準備された環境にSpringアプリをデプロイしたい方
    - 勉強のためにご自身でTomcatをEC2にインストール、配置してみたい方
- JARを使うべき人
    - 少しでもシンプルな作業でサクッとデプロイしてみたい方
    - Spring Boot内蔵のTomcatに是非とも働いていただきたいと思う方

どちらにするかはお好みですが、本記事では"JAR"の使用を前提に話を進めさせていただきます。

## 2つ目の疑問：どうやってJAR作るの？
### ビルドする
JARファイルの作り方は、Gradleに記述を追加する方法など情報が錯乱してますが、なんてことはない、シンプルな方法でできました。Eclipse（STS）でプロジェクト名を右クリックからターミナルを開き、

![1_ターミナルを開く.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1643541/e6b613fd-d765-e1a4-bd27-8615b9d6a6ba.png)

下記コマンドを実行するだけです！！

```
gradlew build

//BUILD SUCCESSFULと表示されれば成功！！
```

（参考）[【Gradle/SpringBoot】jarファイルを作成する方法](https://www.nyamucoro.com/entry/2020/06/29/220606)

### どこにできるか？
`[プロジェクトを配置しているパス]\build\libs`の中にjarファイルが作成されます。このjarファイルを、Tera Termを利用してEC2に転送（配置）します。

## 3つ目の疑問：環境変数の設定？
### 何を設定すべきか？
jarファイルをEC2に配置後、RDSに設定したDBにアクセスするため、jarを起動する前に環境変数を設定する必要があります。
（参考）[AWS(EC2,RDS(MySQL))環境にSpringBootで作成したアプリをデプロイ](https://kumagoro-95.hatenablog.com/entry/2021/02/26/122812)

設定すべき環境変数は下記の4つです。
- `SPRING_DATASOURCE_URL`=`jdbc:mysql://[エンドポイント名]:3306/[RDSでDB作成時の「最初のデータベース名」]?serverTimezone=Asia/Tokyo`
- `SPRING_DATASOURCE_USERNAME`=`[RDSでDB作成時のマスターユーザー名]`
- `SPRING_DATASOURCE_PASSWORD`=`[RDSでDB作成時のマスターパスワード]`
- `SPRING_DATASOURCE_DRIVER_CLASS_NAME`=`com.mysql.cj.jdbc.Driver`

この4つの環境変数、おそらくローカルで開発しているときに`application.properties`で設定しているのではないでしょうか？

ただし、当たり前ですがローカル開発時の情報ではなく、RDS（DB）作成時の情報を設定しなければなりません。初心者ゆえに最初このことに気がつかず、RDSに接続できずにかなり悩んでしまいました。。。

### AWSマネジメントコンソールから確認
それではAWSマネジメントコンソールからログインし、RDSで新しくDBを作成しましょう。DB作成時の以下の情報を後ほど環境変数に記述します。

![2_最初のDB名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1643541/42156eb4-0596-3bd1-3f64-f9a794c5f9fc.png)

![3_ユーザー名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1643541/8bc621c8-0c23-4bbc-09d7-061998816839.png)

### SPRING_DATASOURCE_URLに注意
特にSPRING_DATASOURCE_URL設定時は下記の点に注意しましょう。

- 「エンドポイント名」は自動で作成されます（DB作成完了後に確認できます）
- 「最初のデータベース名」というのは「DB識別子」とは別物です

## 4つ目の疑問：どうやって環境変数を書き込むの？
### Vimを使う
ここまでで環境変数に何を設定すればよいかまではわかりました。が・・・EC2にある環境変数設定ファイルにどうやって書き込んでいくかがわかりませんでした。

調べてみて初めてVimというものでファイル編集ができると知りました。コマンドライン上でファイル編集ができるテキストエディタです。デプロイ時にはEC2にTera Termなどのツールからリモート接続するのが一般的かと思うので、コマンドラインで操作を完結できるVimが重宝されるわけですね。

Tera TermからEC2に接続し、さっそく編集していきましょう。

```
//ホームディレクトリに移動
$ cd ~

//.bash_profileの存在を確認
$ls -a

//.bash_profileを開く
$vim .bash_profile

//--------------------以下vimで編集--------------------
export SPRING_DATASOURCE_URL=jdbc:mysql://sample-rds.xxx.ap-northeast-1.rds.amazonaws.com:3306/sample-db-name?serverTimezone=Asia/Tokyo
export SPRING_DATASOURCE_USERNAME=sample-name
export SPRING_DATASOURCE_PASSWORD=sample-password
export SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver
//--------------------vimここまで--------------------

//設定した環境変数を反映させる
$source .bash_profile

//環境変数が正しく設定されているか確認
$printenv | grep SPRING
```

疑問点の解決は以上です。お疲れ様でした！

# まとめ
SpringアプリケーションをAWSでデプロイするときに初心者が感じるであろう疑問点とその回答をまとめてきました。デプロイする手順をまとめた記事は多くありますが、そういった記事でさらっと前提として流されており、かつ躓きそうなポイントに触れました。

AWSでデプロイというとハードルが高そうで尻込みしてしまいますが、わかってしまえばそれほど難しいことはやっていません。今後AWSでのアプリデプロイに挑戦する方の一助になれば幸いです。