【SpringBoot:Maven】Elastic Beanstalkでデプロイするまでの流れ


# 前提
- MySQLに接続したアプリケーションが既にある。
- awsのアカウントを発行済である。

# 対象者
- デプロイをとりあえずしたい人。
- Elastic Beanstalkでデプロイする流れをサクッと知りたい人。
- AWSについて詳しくない人。

# 注意
- くれぐれもくるくるしている間に触らない。1つ1つ読み込み長いです。
- インフラ系は戻るボタンを使わない。

# ざっくりElastic Beanstalkって何？
AWSでデプロイに必要な

- Elastic Load Balancing （ロードバランサー）
 - アプリケーションのデータ量を自動で分散してくれる。
- Amazon Elastic Compute Cloud （Amazon EC2）
 -  仮想サーバーを構築してくれる。これですばやくデプロイできる。
      - Elastic BeanstalkではNginx（エンジンエックス）とTomcatを構築してくれています。
- Amazon Relational Database Service （Amazon RDS）
 - クラウド上に作る性能の高いDB。今回はデータベースエンジンにMySQLを選択。 

をセットで構築してくれて、簡単にデプロイできるようにするためのサービス。
（簡単に、と言っていますが初心者の筆者は1週間悩みましたw）


# Elastic Beanstalkの準備

- Elastic Beanstalkにログイン
- リージョンを東京にしておく。
- いますぐ始めるを押す
- 各項目を入力してアプリケーションの作成
   - アプリケーション名→好きな名前（URLになる）
   - プラットフォーム→Java
![qiitaaws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/5ef92e8c-d629-58b0-11da-c10d0350a343.png)

   - アプリケーションコード→サンプルアプリケーション  
![qiitaaws1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/5c0c1dc3-4f42-6b40-0229-1b585f3abd90.png)


作成まで結構時間がかかります。  

![qiitaaws2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/58b1c8b4-826a-fa5e-c27b-05e49ef670a2.png)
ヘルスチェックが緑になれば無事に作成完了です。
![qiitaaws3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/586a3fad-f68b-12c3-c876-9a2a2822ab67.png)


# DBの作成
![qiitaaws４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/b326d2be-ed0e-de84-c280-ae8ab5dee663.png)


編集を押したら、  

- エンジン→mysql
- ユーザー名→好きな名前(今回はadmin)
- パスワード→好きなパスワード  
そのほかは触らない。
- 適用を押す 
 
DBの作成も時間がかかります。  

![qiitaaws5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/477d516e-34da-17c5-4ffe-13c0cb884dbd.png)
作成されたDBのエンドポイントを確認します。

RDSを見てみると、DBが作成されているのが分かります。
![qiitaaws15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/3036d190-f36b-ca34-4af7-b3643f48c58d.png)


# application.propertiesをYAML形式に変更
MySQLに接続していたこの状態のapplication.propertiesを

```properties
#MySQLのDBのURL
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?serverTimezone=JST

#name、パス指定。
spring.datasource.username=root
spring.datasource.password=xxxxxxxx

#SpringBootを起動したときに実行したいSQL文を記述したパス
spring.datasource.schema=classpath:schema.sql
spring.datasource.data=classpath:data.sql
```
RDSに接続できるようにapplication.ymlに変更

```yml
spring:
  profiles:
    active: dev
  datasource:
    initialization-mode: always
    url: jdbc:mysql://確認したエンドポイント/ebdb
    username: admin
    password: 設定したパスワード
server: 
  port: 5000
```

- プロファイル名dev（今回は開発と本番環境を分ける前提でdevと名前を付ける）
- MySQLでschema.sqlやdatasqlを実行したい場合はinitialization-mode: alwaysにする
- YAMLは:の後に設定がある場合1つスペースを入れます。
- YAMLは一段下がると、前に2つスペースを入れます。（必ず偶数になる）
- ebdbは標準で作成するDB名
- port: 5000は重要です。（いつも8080を使っていたのであまり重要視していませんでした。）

# application.propertiesではまったこと

### dev書き方

参考にしていた書籍では

```yaml
 config: 
  activate:
   on-profile: dev
```
となっていたのですが、これだとRDSと接続エラーとなりました。

>Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
Action:
Consider the following:
	If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
	If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).

公式リファレンスを見てみると書き方が違ったため、

```yaml
  profiles:
    active: dev
```
に変更したらいけました～！
[リファレンスURL](https://spring.pleiades.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config-file-activation-properties)

### ポート番号

最初はポート番号を8080にしており、localhostでは正常な挙動なのにawsのURLだと「502 Bad Gateway」になるという現象に悩まされました。
理由はElastic Beanstalkのデフォルトのポートは5000番だったからです。[aws公式サイト](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/java-se-nginx.html)
nginxがTomcatの5000を参照しに行くので、5000以外だとRDSに接続できなくなります。

# ビルド
pom.xmlのversionを指定しておく。  
今後アプリケーションがバージョンアップして、デプロイし直す度にここを変えていく。
![qiitaaws11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/2f54afec-bb04-28d6-7b75-c8195a9c6351.png)
アプリを選択して実行→Mavenビルド
![qiitaaws6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/35113d24-4f0d-54db-ec95-c5601fcc9830.png)

- ゴール→package  
- プロファイル→ブランク
![qiitaaws7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/090a4925-4a0d-2be0-f637-a01cbf554853.png)

>[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project Qiita210129: There are test failures.

※Junitテストができていないと上記のエラーがでるので、最初からあるcom.example.demoパッケージ内も含めて一旦すべて消してください。

ビルドがうまくできたら、jarファイルがtargetの中にできるので、格納場所を確認しておく。
![qiitaaws8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/08494054-0e72-4445-b0ed-7d46ac243346.png)

# デプロイ
Elastic Beanstalk
![qiitaaws9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/23062ce4-f28a-c2ff-d694-4b4e5be51ea2.png)

![qiitaaws10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/d86dcd38-9b9b-1772-8dec-790711b4e380.png)

このバージョンはpomで指定したversionと同じにしておく。
デプロイはとても時間がかかります。

# Elastic Beanstalkにdevを設定する
Elastic BeanstalkでYAMLに書いたdevの設定をする。
設定→ソフトウエア（一番上）編集
![qiitaaws12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/bbd1900b-2fa6-6169-4335-18089a44d681.png)


# 画面が自動転送されるとき（loginなど）
今回のアプリケーションの仕様にはないですが、最初のページに自動転送されるという仕様があるときに設定が必要になります。
（例えば、/hogeをurlに入力しても、ログインしていないので/loginにリダイレクトされるようなとき）

![qiitaaws13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/e84c0387-c916-7a3c-976b-1c7519214c4e.png)
設定→ロードバランサー→ヘルスチェックパスを最初の画面（/login）にする。
デフォルトでは/になっている。

※何故設定するかというと、ロードバランサーがHTTPのステータスコードが成功だと思って「200」が返ってくると思っているのに、リダイレクトの「301」「302」「303」が返ってきてくるからです。

こちらを参考にしました。
[基礎からのネットワーク&サーバー構築](https://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%EF%BC%86%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89-%E6%94%B9%E8%A8%823%E7%89%88-%E5%A4%A7%E6%BE%A4-ebook/dp/B084QQ7TCF)


# デプロイできているか確認

Elastic Beanstalk
環境に移動
![qiitaaws16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/5d9aa282-8687-f240-9d8c-8be547fcd757.png)
awsのページに飛ぶので、最初のページ（/todos）を末尾に付け足します。（今回はawsのURL/todosが最初のページに指定されているため）
![qiitaaws17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/79159b1c-3539-47e3-20d0-25a2069253b1.png)

controllerの指定が最初から/なのであれば「環境に移動」を選択すればすぐに表示されるので付け足し不要です。

![Inkedqiitaaws14_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/8ddc9c18-4c9c-d786-d821-82f24f0e1200.jpeg)

# 最後に
お疲れさまでした！！
こんなに色々やってくれるElastic Beanstalkすごいですね！
RDSは課金されるので、お気を付けください。

Elastic Beanstalkは簡単にデプロイできるらしい、便利じゃないか！と思いやってみましたが、理解するのはまだまだ難しいです。
これをきっかけにインフラ・ネットワークの仕組みを学習していこうと思います。