Elastic BeanstalkでSpring Bootのアプリをデプロイしたときの手順と遭遇したエラー

表題の通りです。
Elastic Beanstalk(以下EB)でのデプロイ時の基本的な流れと、遭遇したエラーを紹介します。
遭遇したエラーというか、ローカル環境のソースをそのままデプロイしてみたときのエラーです。。。
設定漏れ等の参考になれば幸いです。

# 手順
## 事前準備
デプロイしたいアプリケーションのjarかwarを作っておきます。

## 各種設定
今回は、基本的にAWSマネジメントコンソールから操作します。
まず、AWSにログインしたあとのhome画面から、`Elastic Beanstalk`と検索。
<img width="80%" alt="スクリーンショット 2020-03-30 11.25.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/85b92d77-0441-556e-52d0-c620d8565944.png">

初回利用時は以下の画面が表示されます。「今すぐ始める」ボタン押す。
<img width="80%" alt="スクリーンショット 2020-03-30 11.31.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/86520d80-f7dc-3634-3099-db7b1f32cf8c.png">

アプリケーションの基本設定です。各設定値は画像の通り。
プラットフォームの選択について、コードアップロード時のファイルが
　・warの場合→Tomcat
　・jarの場合→Java SE
　を選択するようです。
Java SE プラットフォームを利用する場合、設定ファイルの追記が必要なので以下を参考にしてみてください。
参考：https://spring.pleiades.io/spring-boot/docs/current/reference/html/deployment.html#cloud-deployment-aws

<img width="80%" alt="スクリーンショット 2020-03-30 13.50.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/3378c127-d14e-46ee-4fdc-7486925bc77e.png">

「コードのアップロード」を押すとこんな画面になります。設定値等は画像の通り。
ソースバンドルって何だろう、と思いながらFinder内のフォルダごとアップロードしようとしたら全然できなかった、、、
要件は以下ですって。
>
・単一の ZIP ファイルまたは WAR ファイルで構成される (WAR ファイル内に複数の ZIP ファイルを含めることが可能)
・512 MB 以下
・親フォルダまたは最上位ディレクトリを含まない（サブディレクトリを除く）
引用：https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.managing.vpc.html

<img width="80%" alt="スクリーンショット 2020-03-30 11.53.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/28d4e59e-ec05-4748-8e6c-7d53b3d5f93f.png">

「アップロード」を押すと、基本設定の画面に戻ります。
そして、「より多くの設定」を押すと、以下の画面になります。
<img width="80%" alt="スクリーンショット 2020-03-31 16.50.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/970688aa-975c-c7ce-e72f-9a94a62a54ec.png">

セキュリティのフィールドがあるので、「変更」押すと以下の画面に。
リモートでssh接続するためにキーペアを指定しました。
私の場合、既存のキーを利用しています。新規作成する方は、すみませんググってみてください。。。
<img width="80%" alt="スクリーンショット 2020-03-30 13.55.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/802b23a8-75bd-a0ff-1ecd-1a70bb1997d1.png">

次は、データベースを利用している場合のみの設定です。
データベースフィールドの、「変更」押すと以下の画面に。設定値は画像の通り。
保持期間について、`削除`だとインスタンスを停止する度にDBのデータ消えてしまいます。今回は学習用なので`削除`を選択しました。
残しておきたい方は`スナップショットの作成`にする必要がありますが、課金されるようです。
<img width="513" alt="スクリーンショット 2020-03-30 13.54.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/2bd5a92a-34d8-113d-c68e-638f723a9c98.png">

「より多くの設定」画面で「環境の作成」を押すと、以下の画面になります。頑張ってくれています。
<img width="80%" alt="スクリーンショット 2020-03-30 11.56.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/3f65989e-80a7-1f17-255e-6f08bf2dac6b.png">

作成が終わると、以下の画面になります。
「最近のイベント」の種類にERRORがなければ、環境の設定はほぼ完成。
<img width="80%" alt="スクリーンショット 2020-03-30 14.36.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/ce7bcba4-ff89-de36-7014-4146bcd13579.png">

### DBを利用している場合
データベースとテーブルを作成します。
そのために、
EC2のインスタンス一覧ページに先ほど作成した環境のインスタンスが作成されているので、パブリック DNSを確認し、ssh接続します。
ssh接続の手順は以下を参考にしてください。
https://dev.classmethod.jp/articles/aws-beginner-ec2-ssh/

次に、仮想サーバー上でmysqlコマンドが打てるようにインストールします。
`sudo yum install -y mysql`を実行。
そのあと、mysqlにログインし、ローカルで開発したときのように、作成したデータベースやテーブルを作成します。

## 本当は最初にしたい準備(DB利用時のみ)
jdbcの接続先を、RDS向けに変更します。
公式によると、`System.getProperty()`を使って環境変数から自動的に接続先のURIを生成してくれるそうなのですが、よくわからなかったので今回は設定ファイルにベタ書きで修正します。

application.propatiesの`spring.datasource.url`の値を以下のフォーマットに沿ってに変更し、warファイルを作成します。

```
jdbc:driver://hostname:port/dbName?user=userName&password=password
```
driver→mysql
port→3306
dbName→作成したDB名
userName→RDS作成時のユーザ名
password→RDS作成時のパスワード
参考：https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/java-rds.html

２回目以降のデプロイはこちらからできます。
<img width="80%" alt="スクリーンショット 2020-03-31 19.17.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/a487411a-fa07-722c-ee07-f38a0c040985.png">
jdbc接続先を変更したwarファイルをデプロイし直します。
この方法、不可能ではないですが良くないので、もっと良い方法が見つかり次第、記事更新します。:bow_tone1:

## 確認
デプロイ後の画面(下の画像)、上部中央にURLが記載されているので、そこにアクセスできたら完成！
<img width="80%" alt="スクリーンショット 2020-03-30 14.36.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/ce7bcba4-ff89-de36-7014-4146bcd13579.png">

※私の場合、Spring Securityを利用してログイン機能を実装しているためか、自動的にログイン画面にリダイレクトされるので、デフォルトページ（Springで言うとindexページ）の設定方法については後日追記します。


# 遭遇したエラー
振り返るとしょうもないエラーだなぁと思いますが勉強になりました。。。
## No default VPC found for this user(デフォルトVPCがない)
デプロイ時に出ました。
<img width="80%" alt="スクリーンショット 2020-03-30 11.58.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/c1722ef9-e081-e7ff-22a6-67ba8a93e9c3.png">

VPCを指定しない場合、デフォルトVPCが割り当てられます。
今回はVCP未指定かつデフォルトVPCが存在していないため、エラーが発生したようです。
以前学習したときに、デフォルトVPCを削除してたのを忘れてました。。。
ちなみに、デフォルトVPC作成したら、画像の3つのエラー全て消えました。:innocent:
参考：https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudformation-cloudformer-default-vpc/

## 500エラー（セッションテーブルがない）

```
There was an unexpected error (type=Internal Server Error, status=500).
PreparedStatementCallback; bad SQL grammar [INSERT INTO SPRING_SESSION(SESSION_ID, CREATION_TIME, LAST_ACCESS_TIME, MAX_INACTIVE_INTERVAL, PRINCIPAL_NAME) VALUES (?, ?, ?, ?, ?)]; nested exception is java.sql.SQLSyntaxErrorException
```

デプロイ後、URLにアクセスしたら出ました。
セッション使っているのにテーブルが無いよ、とのこと。
application.propatiesに`spring.session.jdbc.initialize-schema=always`を追記で解決。自動でセッションテーブルを作成してくれます。
以下のsqlを実行するという手もあります。
https://github.com/spring-projects/spring-session/tree/master/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc
(そういえばローカルで作業してた時にこちらを実行したのを忘れてました。)



おわり。