手軽に学ぶ！初心者向けJavaアプリのAWSデプロイ方法。Eclipse、Tomcat、Apacheで始めるクラウド運用。

# 1. イントロダクション
この記事は、JavaアプリのAWSデプロイにおける手順を分かりやすく解説しています。初心者にとってはハードルが高いかもしれませんが、心配しないでください。ステップバイステップで進めるように、具体的なコマンドを使いながらAWSデプロイの手順を詳しく説明しています。
記事は大きく２つに分かれています。まず、AWSを用いたVPC（Virtual Private Cloud）の作成方法を解説します。その次に、ApacheおよびTomcatを用いたWebサーバーの環境構築方法を解説します。この記事を読むことで、AWSデプロイの手順を理解し、実際にJavaアプリをAWS上でデプロイすることができるようになります。


# 2. AWSを用いたVPC(Virtual Private Cloud)の作成
この章ではでは、1つのアベイラビリティーゾーン(AZ)にVPC、インターネットゲートウェイ、インターネットへのパブリックルートがあるルートテーブル、１つのパブリックサブネットを作成します！
今回用いる環境の概要図は以下の通りです。
![スクリーンショット 2023-06-18 22.10.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648527/1925c459-9aa9-ed9e-f654-56b675c43a5c.png)


## 2.1 VPC、ルートテーブル、インターネットゲートウェイを作成
1.AWSマネジメントコンソール上部の検索ボックスで「VPC」を検索する
2.「VPCを作成」を押す
3.左側の「VPCの設定」セクションの中の「作成するリソース」セクションで「VPCなど」を選択する
4.「自動生成」オプションの下にあるテキストボックスに指定したいVPCの名前を入力する。ここでは「test」とする。
5.「IPv4 CIDRブロック」セクションに「10.0.0.0/16」と入力する。
6.「アベイラビリティゾーン (AZ) の数」セクションに「１」を入力する。
7.「パブリックサブネットの数」セクションで「１」を入力する。
8.「プライベートサブネットの数」セクションで「０」を入力する。
9.「VPCエンドポイント」セクションで「なし」を選択する。
10.「プレビュー」セクションが以下の図と同じか確認する。

![スクリーンショット 2023-06-18 20.37.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648527/db5a717f-8e95-b8a8-ffed-4395b69c3817.png)
11.「VPCを作成」を選択する。以下の図と同じように成功と表示されるはずです。
![スクリーンショット 2023-06-18 20.39.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648527/f96b93b1-0358-e65a-d317-dc23e21de6ae.png)

12.「VPCを表示」を選択する。
以上でVPCの設定は終了です！

## 2.2 パブリックルートをルートテーブルに追加する
この作業を通じて先ほど作成したパブリックサブネットを外部のインターネットからアクセスできるようにします！
1.「詳細」セクションでメインルートテーブルのURLを選択する。
2.表示されたルートテーブルのチェックボックスを選択します。
3.下部に表示された画面の中から「ルート」タブをクリックします。
4.「ルートを編集」をクリックする。
5.「ルートを追加」をクリックする。
6.「送信先」列に「0.0.0.0/0」と入力する。
7.「ターゲット列」のテキストボックスを選択する。オプションから「インターネットゲートウェイ」を選択する。「test-igw」という名前のインターネットゲートウェイIDを選択する。（ご自身でつけたVPCの名前によって適宜操作を行なってください。）
8.「変更を保存」をクリックします。
以上で作成したVPCに適切なルートテーブルを設定することができました！

## 2.3 VPCセキュリティグループを作成する
これまでの作業でネットワークの環境構築が完了しました。この説ではセキュリティグループを作成することで、関連づけられているリソースに出入りできるようトラフィックを制御します。
1.左側のナビゲーションペインの「セキュリティ」セクションから「セキュリティグループ」を選択します。
2.「セキュリティグループの作成」をクリックします。
3.「セキュリティグループ名」に任意の名前を登録します。今回は「testGroup」とします。
4.「VPC」テキストボックスから初期値を消去し、先ほど作成した「test-vpc」を選択します。
5.「インバウンドルール」セクションで、「ルール追加」を選択します。
[詳しい手順を加える]
6. 下の図のように設定を行います。
![スクリーンショット 2023-07-07 17.34.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648527/a61db6aa-610e-6d96-8a4b-cf5893bc3ad8.png)
「説明-オプション」以外は全てプルダウンから選択します。「説明-オプション」は以下をコピペしてください。
Allow ping from anywhere
Allow 8080 requests from anywhere
Allow ssh connection from anywhere
Allow HTTP web requests from anywhere
Allow HTTPS web requests from anywhere

7.「Create security group」ウィンドの下部に移動し、「セキュリティグループを作成」を選択します。
以上でセキュリティグループの設定は完了です！このルールがないとEC2インスタンスはあらゆるリクエストを受け付けられません。

## 2.4 EC2 インスタンスの作成
AWSの環境設定はEC２のみとなりました。あとちょっとです😃

1. AWSマネジメントコンソール上部の検索ボックスで「EC2」と検索します。
2. 左側のナビゲーションペインの「インスタンス」セクションで、「インスタンス」を押します。
3. 「インスタンスを起動」を選択します。
4. 名前を設定します。ここでは「Web Application」としました。
5. 「Amazonマシンイメージ(AME)」ドロップダウンの一覧から「Amazon Linux 2 AMI(HVM)」を選択します。
6. 「キーペア（ログイン）」セクションで「キーペアなしで続行（推奨されません）」を選択します。
7.「ネットワーク設定」セクションで、「編集」を選択します。
8.VPCドロップダウンから「test-vpc」を選択します。
9.パブリックIPの自動割り当てドロップダウンの一覧を特定し、「有効」を選択します。
10.「ファイアウォール（セキュリティグループ）」セクションで「既存のセキュリティグループ」を選択します。
11.共通のセキュリティーグループから「testGroup」を選択します。
12.「インスタンスを起動」をクリックする。
お疲れ様です！以上でAWSの環境を整えることができました！


# 3.Webサーバーの環境構築(Apache/Tomcat)
ここまでくれば半分は終了です！頑張りましょう！
## 3.1EC2と接続する
1. AWSマネジメントコンソール上部の検索ボックスで「EC2」と検索します。
2. 左側のナビゲーションペインの「インスタンス」セクションで、「インスタンス」を押します。
3. 「Web Application」のチェックボックスにチェックをつけ、「接続」をクリックする。
4. 遷移後の画面で再度「接続」をクリックする。
EC2に接続することが完了しました！

## 3.2JDK(Java Development Kit)のインストール
JDKとはJavaのプログラムを作るときに必要な、あるいは、あると便利なあれやこれやを詰め合わせたものです。
インストールする際に、開発に使用したJavaのバージョンと同じものを指定します。私の場合は17でした。
```shell-session:JDKのインストール
$ sudo yum install java-17-amazon-corretto
//-develの方は必要ないかもしれません🙇 
//入れても特に問題はないと思うので、入れておくことを推奨します。
$ sudo yum yum install java-17-amazon-corretto-devel
```
(-develと無印の違い等が気になった方はぜひ[学び編](https://qiita.com/ShunyaTabata0812/items/18317b7fc51d30b74bf4)の記事も参照ください！)

Javaがインストールされているか、確認します。
```shell-session:JDKの確認
$ sudo java -version
openjdk version "17.0.7" 2023-04-18 LTS
OpenJDK Runtime Environment Corretto-17.0.7.7.1 (build 17.0.7+7-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.7.7.1 (build 17.0.7+7-LTS, mixed mode, sharing)
```
これでJDKの準備は完了です！

## 3.3Apache
webサーバーとしてHTTP通信を担うApacheをインストールします。
```shell-session:Apacheのインストール
$ sudo yum install -y httpd
```
Apachがインストールされているか確認します。
```shell-session:Apachの確認
$ sudo httpd -v
Server version: Apache/2.4.57 ()
Server built:   May  3 2023 16:00:14
```
(あれ、Apacheをインストールしたのにバージョン確認はhttpdを使うの？と思った人は[学び編](https://qiita.com/ShunyaTabata0812/items/18317b7fc51d30b74bf4)へ)


起動及び動作確認を行います。

```console:Apache起動
$ sudo systemctl start httpd.service
```

```shell-session:Apache起動確認
$ sudo systemctl status httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2023-06-17 08:44:48 UTC; 5h 30min ago
~(略)~
```
EC2インスタンスにローカルPCのブラウザからパブリックIpv4DNSアクセスすることで、Apacheのテストページが表示出来ることを確認します。
(追記：なぜか、パブリックIpv４DNSへのアクセスができない事例がありました。その際は代わりにPublic IP Addressにアクセスすると解決することがあります。)
例)http://ec2-54-178-72-250.ap-northeast-1.compute.amazonaws.com	


```console:Apache停止
$ sudo systemctl stop httpd.service
```

```shell-session:Apache停止確認
$ sudo systemctl status httpd.service 
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2023-06-17 14:21:19 UTC; 16s ago
~(略)~
```

EC2インスタンスが起動した際に自動でApacheサービスも起動するよう設定します。

```console:Apache自動起動設定
$ sudo systemctl enable httpd.service
```

自動起動設定が反映されているか確認します。
`Loaded`の`(/usr/lib/systemd/system/httpd.service;`の後が`enabled`であれば自動起動が有効です。

```shell-session:Apache自動起動設定確認
# sudo systemctl status httpd.service 
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2023-06-17 14:21:19 UTC; 1min 20s ago
~(略)~
```
これでApacheの設定は完了です！

## 3.4Tomcat
Javaサーブレットを取り扱うTomcatをインストールします。こちらのバージョンも手元で開発したアプリのものと同じものを用意してください。私の場合はver9でした。

(2023/06/17現在)amzn2-coreのyumリポジトリでのTomcatバージョン9が用意されています。しかし、今回はあえてパッケージ管理ソフトを使わない場合のインストール方法について学習してみます。
[Apache Tomcat 9 のダウンロードページ](https://tomcat.apache.org/download-90.cgi)からApache Tomcat 9 本体をダウンロードして使用します。

```shell-session:参考：yumリポジトリTomcatバージョン確認
# sudo yum info tomcat
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Available Packages
Name        : tomcat
Arch        : noarch
Version     : 7.0.76

# sudo amazon-linux-extras list | grep tomcat
 23  tomcat8.5                available    \
 52  tomcat9                  available    [ =stable ]
```

Tomcatを実行する専用ユーザを作成します。
(え、どうしてそんなユーザを用意する必要があるのと疑問に思った人は[学び編](https://qiita.com/ShunyaTabata0812/items/18317b7fc51d30b74bf4)もぜひ！)

```console:Tomcatユーザの作成
$ sudo useradd -s /sbin/nologin tomcat
```
-s /sbin/nologinにより、ログインできないユーザーを作成しています。

Tomcat本体をダウンロードします。CoreでOKです！
※最新のバージョンのURLを確認の上で適宜変更して実行してください。

```console:Tomcatダウンロード
# sudo cd ~
# sudo wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.76/bin/apache-tomcat-9.0.76.tar.gz
```

ダウンロードしたtarファイルを解凍して配置します。

```console:Tomcatを解凍して配置
$ sudo tar -xzvf ~/apache-tomcat-9.0.76.tar.gz
$ sudo mv ~/apache-tomcat-9.0.76 /opt
$ sudo chown -R tomcat:tomcat /opt/apache-tomcat-9.0.76
```

yumを用いたインストールを行っていない為、将来手動でTomcatバージョンを変更する際にも設定に影響が少なくなるようにシンボリックリンクを作成します。

```console:Tomcatのシンボリックリンク作成
$ sudo ln -s /opt/apache-tomcat-9.0.76 /opt/apache-tomcat
$ sudo chown -h tomcat:tomcat /opt/apache-tomcat
```

一度シンボリックリンクを作成した後、将来Tomcatバージョンを変更する場合等には以下コマンドでシンボリックリンクのリンク先を変更してください。

```console:apache-tomcatシンボリックリンクのリンク先変更
$ sudo ln -nfs [変更後のディレクトリのパス] /opt/apache-tomcat
```

展開したTomcat本体内に生成されるログファイルを他ミドルウェアと同階層のディレクトリ（/var/log 配下）にて参照できるようにシンボリックリンクを生成

```console:Tomcatログシンボリックリンク作成
$ sudo ln -s /opt/apache-tomcat/logs /var/log/tomcat
$ sudo chown -h tomcat:tomcat /var/log/tomcat
```

TomcatをOSにサービスとして登録する為、ルート権限でUnitを作成します。viコマンド等を使ってください！

```console:/usr/lib/systemd/system/tomcat.service(新規作成)
$ sudo vi /usr/lib/systemd/system/tomcat.service
```

```console:/usr/lib/systemd/system/tomcat.service（中身）
# Systemd unit file for default tomcat
#
# To create clones of this service:
# DO NOTHING, use tomcat@.service instead.

[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=oneshot
PIDFile=/opt/apache-tomcat/tomcat.pid
RemainAfterExit=yes
#EnvironmentFile=/etc/tomcat/tomcat.conf
#Environment="NAME="
#EnvironmentFile=-/etc/sysconfig/tomcat
ExecStart=/opt/apache-tomcat/bin/startup.sh
ExecStop=/opt/apache-tomcat/bin/shutdown.sh
ExecReStart=/opt/apache-tomcat/bin/shutdown.sh;/opt/apache-tomcat/bin/startup.sh
SuccessExitStatus=143
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target
```

EC2インスタンスが起動した際に自動でTomcatサービスが起動するよう設定します。

```console:Tomcat自動起動設定
$ sudo systemctl enable tomcat.service
Created symlink from /Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /usr/lib/systemd/system/tomcat.service.
```

自動起動設定が反映されているか確認します。
`Loaded`の`(/usr/lib/systemd/system/tomcat.service;`の後が`enabled`であれば自動起動が有効です。

```shell-session:Tomcat自動起動設定確認
$ sudo systemctl status tomcat.service 
● tomcat.service - Apache Tomcat Web Application Container
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited) since Sat 2023-06-17 14:38:06 UTC; 7s ago
~(略)~
```

ダウンロードしたTomcatのバージョンを確認します。

```shell-session:Tomcatバージョン確認
$ sudo /opt/apache-tomcat/bin/version.sh
Using CATALINA_BASE:   /opt/apache-tomcat
Using CATALINA_HOME:   /opt/apache-tomcat
Using CATALINA_TMPDIR: /opt/apache-tomcat/temp
Using JRE_HOME:        /
Using CLASSPATH:       /opt/apache-tomcat/bin/bootstrap.jar:/opt/apache-tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
Server version: Apache Tomcat/9.0.76
Server built:   Jun 5 2023 07:17:04 UTC
Server number:  9.0.76.0
OS Name:        Linux
OS Version:     5.10.179-171.711.amzn2.x86_64
Architecture:   amd64
JVM Version:    17.0.7+7-LTS
JVM Vendor:     Amazon.com Inc.
```

起動及び動作確認を行います。

```console:Tomcat起動(先にApacheを起動)
$ sudo systemctl start httpd.service
$ sudo systemctl start tomcat.service
```

```shell-session:Tomcat起動確認
$ sudo systemctl status tomcat.service
● tomcat.service - Apache Tomcat Web Application Container
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited) since Sat 2023-06-17 14:38:06 UTC; 4min 52s ago
~(略)~
```

EC2インスタンスにブラウザからアクセスし、Tomcatのページが表示出来る事を確認します。

例）http://ec2-54-178-72-250.ap-northeast-1.compute.amazonaws.com:8080/
![Tomcat.JPG](https://qiita-image-store.s3.amazonaws.com/0/269716/97a181f3-41cb-a4f5-22b7-93e02380c3ba.jpeg)

# おわりに

今回の作業で作成したWebアプリは[これ](プロキシサーバー)です。よかったらどうぞ！



# 参考

https://it-jog.com/java/intro/install-openjdk-onec2

https://weblabo.oscasierra.net/installing-tomcat9-centos7-1/

http://ossfan.net/setup/tomcat-02.html

https://code-kakikaki.com/amazon-linux-2-java17-tomcat9/

https://fullstacklife.net/aws/amazon-linux2-setup-nginx-tomcat-postgresql/

https://qiita.com/hayate_h/items/de517d3efc82d4e308b4

https://teratail.com/questions/255847

https://teratail.com/questions/13337

https://pasomaki.com/tomcat-port-change/

https://qiita.com/egoa56/items/c932a627e54e626a2b97

https://qiita.com/yasushi-jp/items/a19ccabb53ef0997dfbf


https://qiita.com/hiren/items/2a4f1b55c99ebfb3fd08

http://kawara-tan.blogspot.com/2012/01/ec2tomcat.html