AWSで簡易なWebアプリをデプロイ ~ サーバ編 ~

お疲れ様です．Tomです．

AWSで簡易なWebアプリをデプロイ【サーバ編】です．

:::note info
全体概要編は[こちら](https://qiita.com/tomtech_2024/items/fc14e5fe845b7d7d5712)をご覧ください．
:::

スタックを示した構成図でいうところの赤で囲った枠が今回のトピックになります．

![appserver01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918716/6a0840ca-6c0c-77df-4d93-e0a25561569b.png)

ここではサーバの構築と，アプリケーションの **実行** に焦点を当てたいと思います．
※ サーバでアプリが動く仕組みなどはここでは触れないので，興味のある方はご自身で調べてみてください．後日簡易な内容を記事にする予定なので，その際にご説明したいと思います．

`目的としてはアプリケーションを動作させるサーバを構築して，【ユーザにアプリケーションを提供すること】です．`

# サーバ編でやることの概要
1.**データベース接続用にMySQLのクライアントをインストール**
こちらRDSに接続してテーブルを作成するために必要ですので，EC2側にMySQLのクライアントを仕込んでおきます．

https://zenn.dev/sway/articles/aws_publish_create_rds

2.**JDKのインストール**
JDKインストールにつきましては，下記公式Documentをご確認ください．AWS公式のJDKはAmazon Correttoという製品らしく，最新をインストールしてしまったのでその11系を使いました．

https://docs.aws.amazon.com/ja_jp/corretto/latest/corretto-11-ug/amazon-linux-install.html

3.**Apache Mavenのインストール**
詳しくは下記をご覧ください．かなり便利になるので，このとき環境変数のexportもお忘れなく．

https://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/setup-project-maven.html

4.**JARファイルの展開**
`アプリケーション編`でご紹介したJARファイルをそのままscpでEC2インスタンスに送ってあげます．

あとはjavaコマンドで実行してあげるだけですね．
``` :Run application
java -jar <必要であればパス>/<出来上がったJARファイル名>.jar
```
このとき，javaコマンドは頻繁に使用することになると思うので，都度exportするか，bashrcに記載しておくのが良いかと思います．ボリュームも別途Attachしております．

# VM構築時に考慮すべきことと今回の動作環境
・リージョン（サーバを建てる地理的な場所）
・インスタンスタイプやその他のマシンスペック

**リージョン**: TokyoのEC2インスタンス
**インスタンスタイプ**: t2.micro
**AMI**: Amazon Linux

なんかかっこいいからという理由で海外のリージョンを選ぶことはおすすめしません．SSHのコンソール出力にラグがあったりして操作感が悪くなります．

::: note warn
他にも色々設定があったと思うのですが，失念してしまいました…
ただし，今回の用途的にそこまでこだわった記憶がなく，すべてデフォルトの値か，インスタンス稼働にかかる費用を抑える設定にしていたことは覚えています．
:::

# 起きた不具合とその対処法
1.**HTTPサーバとして機能しない問題**
まず疎通そのものを確認するために，裸のEC2にTomcatをおいてみました．(※1)
Unitファイルを書いていざ起動！と思ってもTomcatが立ち上がらなかったのでログを確認します．

``` :Before
# systemctl start tomcat.service
# systemctl status tomcat.service
× tomcat.service - Apache Tomcat Web Application Container
     Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; preset: disabled)
     Active: failed (Result: exit-code) since Sun 2024-05-12 07:17:39 UTC; 4s ago
```
`systemctl status` コマンドの下には下記の通り出力されており，ディレクトリ配下への権限不足であることが確認できました．初歩的な考慮不足でしたね．．．
（※ ログが消えていれば`catalina.log`も覗いてみてください）
``` :Log
May 12 07:21:14 systemd[1]: Starting tomcat.service - Apache Tomcat Web Application Container...
May 12 07:21:14 startup.sh[9877]: touch: cannot touch '/opt/apache-tomcat-10.1.23/logs/catalina.out': Permission denied
May 12 07:21:14 startup.sh[9871]: /opt/apache-tomcat-10.1.23/bin/catalina.sh: line 465: /opt/apache-tomcat-10.1.23/logs/catalina.>
May 12 07:21:14 systemd[1]: tomcat.service: Control process exited, code=exited, status=1/FAILURE
```

``` :Permission status
# ls -la
(中略)
drwxr-xr-x.  9 root root 16384 May 11 08:52 apache-tomcat-10.1.23
```

下記のように対処します．
``` :Counter Measure
chown tomcat:tomcat -R ./apache-tomcat-10.1.23/
```
すると起動することができました．
``` :After
# systemctl start tomcat.service
# systemctl status tomcat.service
● tomcat.service - Apache Tomcat Web Application Container
     Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; preset: disabled)
     Active: active (running) since Sun 2024-05-12 07:25:16 UTC; 5s ago
```
ポートは8080ですので，`http://<EC2のIP>:8080`でアクセスすることをお忘れなきよう．
ただのTomcatが出るだけですが，なんだか興奮しますね．

![Screenshot from 2024-09-07 15-26-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918716/adbe503f-7d04-88ca-fbb1-ee0180302551.png)

2.**DBへ接続ができない**
``` :Before
$ mysql -h <RDSのEndpoint FQDN> -P 3306 -u <構築時に設定した特権ユーザ名> -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'ユーザ名'@'<IPアドレス>' (using password: YES)
```
単にユーザ名とパスワードを間違えていただけでした．
正しく指定して，接続し直すと…
``` :After
$ mysql -h <RDSのEndpoint FQDN> -P 3306 -u <構築時に設定した特権ユーザ名> -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 301
Server version: 8.0.35 Source distribution

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```

※ `データベース編`でも説明したRDSですが，AWSによるフルマネージドサービスでSSH接続とそこからのlocalhost接続ができないようです．したがって，DB接続をするサーバから`mysql`コマンドを叩いて操作してあげる必要があります．

3.**ビルドは完了するもののJARファイルを実行できない**

``` :Before
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2024-06-01 07:23:47.932 ERROR 5763 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Web server failed to start. Port 8080 was already in use.

Action:

Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
```
原因： 書くまでもありませんが，出力の通り，前回起動したTomcatが同じポートで起動しており，競合していたため．
対策： Tomcatを停止して，アプリの再起動を行った．

# 実装を終えて（所感）
もともとアプリ側の人間ではないこともあり，「どうやってサーバ上でアプリを動かすのか」といったところがイメージできていませんでいた．しかしその方法から，いままでよくわからなかったミドルウェアの立ち位置やローカル環境ではなくLinuxサーバ環境でのデプロイのイメージがとても勉強になりました．
次はWebアプリ以外も挑戦してみたいと思います．

お読みいただき，ありがとうございました！

# 出典
(※1) https://blog.jbs.co.jp/entry/2024/02/09/154932