SpringBootアプリケーションをEC2にデプロイする手順備忘

## はじめに
SpringBootアプリケーションをEC２にデプロイした手順をまとめる
#### ご参考

https://qiita.com/sai-i/items/00fc6e27235f94fcd0fa

https://qiita.com/sai-i/items/c7786653bfbd3f00218b

## 作業
<dl>
  <dt>AWS環境構築</dt>
  <dd>VPCの作成 から EC2インスタンスの起動</dd>
  <dd>インバウンドセキュリティグループの設定変更</dd>
  <dt>EC2にミドルウェアのインストール</dt>
  <dd><a　link="https://httpd.apache.org/">Apache HTTP Server</a>のインストール</dd>
  <dd><a　link="https://tomcat.apache.org/">Apache Tomcat</a>のインストール</dd>
  <dd><a　link="https://dev.mysql.com/doc/refman/8.0/ja/linux-installation-yum-repo.html">Mysql</a>のインストール</dd>
  <dt>デプロイ後各種設定を変更</dt>
  <dd>デプロイ</dd>
  <dd>Apacheの設定を変更</dd>
  <dd>Tomcatの設定を変更</dd>
  <dd>動作確認</dd>
  <dd>AWSのインバウンドセキュリティグループの設定変更</dd>
</dl>

## AWS環境構築
### VPCの作成 から EC2インスタンスの起動
![test.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785898/26acec2a-6d53-d709-6357-667bbc767884.png)
※ 柔軟にシステムを拡張できるように複数のサブネットを作成
※ 動作を確認できればいいのでEC2インスタンス内にDBを作成

```
# OSバージョン情報
$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2023"
ID="amzn"
ID_LIKE="fedora"
VERSION_ID="2023"
PLATFORM_ID="platform:al2023"
PRETTY_NAME="Amazon Linux 2023.5.20240624"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2023"
HOME_URL="https://aws.amazon.com/linux/amazon-linux-2023/"
DOCUMENTATION_URL="https://docs.aws.amazon.com/linux/"
SUPPORT_URL="https://aws.amazon.com/premiumsupport/"
BUG_REPORT_URL="https://github.com/amazonlinux/amazon-linux-2023"
VENDOR_NAME="AWS"
VENDOR_URL="https://aws.amazon.com/"
SUPPORT_END="2028-03-15"
```

### インバウンドセキュリティグループの設定変更
![スクリーンショット 2024-06-28 23.34.19（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785898/a3bbf3b2-7cf6-9274-d09f-900d5f610bd5.png)
※ 8080ポートへの通信を許可を追加

## EC2にミドルウェアをインストール
### Apache HTTP Serverのインストール
```
# Apacheのインストール
$ sudo yum -y install httpd

# Apacheの起動
$ sudo systemctl start httpd.service

# Apacheの起動確認
$ sudo systemctl status httpd.service

# サーバー接続時に自動でApacheが起動するよう設定
$ sudo systemctl enable httpd.service

# 動作確認
$ curl "http://{ドメイン}/"
<html><body><h1>It works!</h1></body></html>
```

### Apache Tomcatのインストール
```
# Tomcatのインストール
$ sudo yum -y install tomcat9
$ sudo yum -y install tomcat9-webapps tomcat9-admin-webapps

# Tomcatの起動確認
$ sudo systemctl start tomcat9.service

# Tomcatの起動確認
$ sudo systemctl status tomcat9.service

# サーバー接続時に自動でTomcatが起動するよう設定
$ sudo systemctl enable tomcat9.service

#　動作確認
$ curl "http://{ドメイン}:8080"

<!DOCTYPE html>
<html lang="en">
  :
 省略
  :
</html>
```
※ Amazon Linux 2023のリポジトリ

https://docs.aws.amazon.com/ja_jp/linux/al2023/release-notes/relnotes-2023.3.20240108.html#amis-2023.3.20240108.repository

### Mysqlのインストール
```
# MySQL公式リポジトリの追加 (AmazonLinux2023はRHEL9系)
sudo yum localinstall -y https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm

# mysqlをインストール
$ sudo yum -y install mysql-community-server

# mysqlの起動
$ sudo systemctl start mysqld

# mysqlの起動確認
$ sudo systemctl status mysqld

# サーバー接続時に自動でmysqlが起動するよう設定
$ sudo systemctl enable mysqld
```
※ 対応OSの確認

https://qiita.com/miriwo/items/eb09c065ee9bb7e8fe06#%E8%A9%B3%E7%B4%B0

https://dev.mysql.com/downloads/repo/yum/

## デプロイ後各種設定を変更
### デプロイ
```
# warファイルの配置位置を確認
$ ls /usr/share/tomcat9/webapps/

# 権限付与(あまり良くないがめんどくさいので全アクセス権限を付与)
$ sudo chmod 777 /usr/share/tomcat9/webapps

# 転送するとtomcatがwarファイルを展開し自動デプロイする
$ scp -i *.pem {アプリ名}.war ec2-user@xxx.xxx.xxx.xxx:/usr/share/tomcat9/webapps/

$ curl "http://{ドメイン}:8080/{アプリ名}/"
sucess access!!! <-　ご自身のアプリケーションの応答
```

### Apacheの設定を変更
- webサーバーが受け付けたリクエストをアプリケーションサーバーに連携するため、mod_proxy_ajp及びmod_proxyモジュールを有効にする
- また、どのパスにアクセスされた場合、Tomcatと連携するのかを設定する
![apache_tomcat.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785898/7ce5db5a-d489-6aea-2941-432be13cad2b.png)
```
$ cat /etc/httpd/conf.modules.d/00-proxy.conf
# This file configures all the proxy modules:
LoadModule proxy_module modules/mod_proxy.so <- コメントアウトされていたら外す
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so <- コメントアウトされていたら外す
# Apacheで受け付けた全てのリクエストをTomcatで処理
ProxyPass / ajp://localhost:8009/ <-　追記する
```

### Tomcatの設定を変更
```
$ cat /usr/share/tomcat9/conf/server.xml

    <!-- 自動デプロイをtrueにする。 -->
    <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">

    <!-- コメントアウトを外して設定ONにする。 -->
    <!-- アドレス部分を変更する。 -->
    <Connector protocol="AJP/1.3"
               address="127.0.0.1"
               port="8009"
               redirectPort="8443"
               maxParameterCount="1000"
               secretRequired="false"
            />
    <!-- コメントアウトして、8080番ポートへのHTTP通信を不可とする。 -->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
               />
    -->
```
- `secretRequired="false"`はセキュリティの観点から非推奨ですので、必要に応じて設定してください
- VPCの設定に応じて、ipv4を使用するかipv6を使用するか判断してください

http://labo-blog.aegif.jp/2020/05/tomcat9webapacheajp.html


### 動作確認
```
# 各種設定の読み込み
$ sudo systemctl restart tomcat9.service
$ sudo systemctl restart httpd.service

$ curl "http://{ドメイン}/{アプリ名}/"
sucess access!!! <-　ご自身のアプリケーションの応答
```

### AWSのインバウンドセキュリティグループの設定変更
- 8080ポートへの通信設定を削除する

## 終わり
初めて書いたので、ご指摘頂けますと幸いです