EC2にApache Tomcatをインストールしてみた

EC2にApache Tomcatをインストールしてみた
この記事をシェアする

はじめに

こんにちは、スカイアーチHRソリューションズのsugawaraです。

みなさんはApache Tomcatをご存じでしょうか?自分はこれまで何度か名前だけ聞いたことがありましたが、正直なにそれ??というレベルでした。。

今回はそんなApache Tomcatについて少し調べてみて、実際にEC2にインストールしてみたのでそれをまとめていきたいと思います。

Apache Tomcatってなに?

Apache TomcatはJava Servletを実行するためのソフトウェア(webサーバ兼サーブレットコンテナ)です。軽量で高性能なため、小規模~大規模アプリケーションまで幅広く利用されています。

名前にApacheとついていますが、Apache HTTP Serverとはまったく別物です。ただし、Apache HTTP Serverとは相互補完的な関係であり、三層構造を作るうえでいっしょに利用されることが多いです。つまり、Apache HTTP Serverは静的コンテンツのwebサーバとして機能し、Apache Tomcatは動的コンテンツ(Javaアプリケーション)の実行を担います。

事前準備

EC2にApache Tomcatをインストールする部分のみにフォーカスします。今回は東京リージョンのデフォルトVPCのパブリックサブネットを利用します。EC2の詳細は下記となります。

項目設定値
OSAmazon Linux 2
インスタンスt2.micro
パブリックIPアドレスあり
キーペアなし(セッションマネージャを利用)

Apache Tomcatはアプリケーションサーバのため、本来はプライベートサブネットに配置してブラウザから直接アクセスされることはありません。WebサーバであるApacheをパブリックサブネットに構築して、通信を連携させるべきでしょう。

しかし、今回はTomcatだけをインストールして、TomcatのWelcome画面が表示されることだけを確認します。したがって、Tomcatで使用される8080ポートをセキュリティグループはあけておきます。

インストール手順

まずはセッションマネージャで対象のEC2インスタンスに入ります。rootユーザのホームディレクトリで作業するために移動します。

$ sudo su
# cd ~

まずはインスタンスにJavaがインストールされていないことを確認します。

# java -version
bash: java: command not found

今度はインストールできるJavaのバージョンを確認します。

# yum list | grep java-
java-1.7.0-openjdk.x86_64                1:1.7.0.321-2.6.28.2.amzn2.0.2
java-1.7.0-openjdk-accessibility.x86_64  1:1.7.0.321-2.6.28.2.amzn2.0.2
java-1.7.0-openjdk-demo.x86_64           1:1.7.0.321-2.6.28.2.amzn2.0.2
java-1.7.0-openjdk-devel.x86_64          1:1.7.0.321-2.6.28.2.amzn2.0.2
java-1.7.0-openjdk-headless.x86_64       1:1.7.0.321-2.6.28.2.amzn2.0.2
java-1.7.0-openjdk-javadoc.noarch        1:1.7.0.321-2.6.28.2.amzn2.0.2
java-1.7.0-openjdk-src.x86_64            1:1.7.0.321-2.6.28.2.amzn2.0.2
java-1.8.0-openjdk.x86_64                1:1.8.0.382.b05-1.amzn2.0.2  amzn2-core
java-1.8.0-openjdk-accessibility.x86_64  1:1.8.0.382.b05-1.amzn2.0.2  amzn2-core
java-1.8.0-openjdk-accessibility-debug.x86_64
java-1.8.0-openjdk-debug.x86_64          1:1.8.0.382.b05-1.amzn2.0.2  amzn2-core
java-1.8.0-openjdk-demo.x86_64           1:1.8.0.382.b05-1.amzn2.0.2  amzn2-core
java-1.8.0-openjdk-demo-debug.x86_64     1:1.8.0.382.b05-1.amzn2.0.2  amzn2-core
java-1.8.0-openjdk-devel.x86_64          1:1.8.0.382.b05-1.amzn2.0.2  amzn2-core
java-1.8.0-openjdk-devel-debug.x86_64    1:1.8.0.382.b05-1.amzn2.0.2  amzn2-core
java-1.8.0-openjdk-headless.x86_64       1:1.8.0.382.b05-1.amzn2.0.2  amzn2-core
java-1.8.0-openjdk-headless-debug.x86_64 1:1.8.0.382.b05-1.amzn2.0.2  amzn2-core
java-1.8.0-openjdk-javadoc.noarch        1:1.8.0.382.b05-1.amzn2.0.2  amzn2-core
java-1.8.0-openjdk-javadoc-debug.noarch  1:1.8.0.382.b05-1.amzn2.0.2  amzn2-core
java-1.8.0-openjdk-javadoc-zip.noarch    1:1.8.0.382.b05-1.amzn2.0.2  amzn2-core
java-1.8.0-openjdk-javadoc-zip-debug.noarch
java-1.8.0-openjdk-src.x86_64            1:1.8.0.382.b05-1.amzn2.0.2  amzn2-core
java-1.8.0-openjdk-src-debug.x86_64      1:1.8.0.382.b05-1.amzn2.0.2  amzn2-core
java-11-amazon-corretto.x86_64           1:11.0.21+9-1.amzn2          amzn2-core
java-11-amazon-corretto-headless.x86_64  1:11.0.21+9-1.amzn2          amzn2-core
java-11-amazon-corretto-javadoc.x86_64   1:11.0.21+9-1.amzn2          amzn2-core
java-17-amazon-corretto.x86_64           1:17.0.9+8-1.amzn2.1         amzn2-core
java-17-amazon-corretto-devel.x86_64     1:17.0.9+8-1.amzn2.1         amzn2-core
java-17-amazon-corretto-headless.x86_64  1:17.0.9+8-1.amzn2.1         amzn2-core
java-17-amazon-corretto-javadoc.x86_64   1:17.0.9+8-1.amzn2.1         amzn2-core
java-17-amazon-corretto-jmods.x86_64     1:17.0.9+8-1.amzn2.1         amzn2-core
java-atk-wrapper.x86_64                  0.30.4-5.amzn2.0.2           amzn2-core
libdb-java-devel.x86_64                  5.3.21-24.amzn2.0.4          amzn2-core
libguestfs-java-devel.x86_64             1:1.36.10-6.amzn2.2.4        amzn2-core
libvirt-java-devel.noarch                0.4.9-4.amzn2                amzn2-core
libvirt-java-javadoc.noarch              0.4.9-4.amzn2                amzn2-core
openmpi-java-devel.x86_64                4.0.1-11.amzn2.0.1           amzn2-core
xz-java-javadoc.noarch                   1.3-3.amzn2                  amzn2-core

今回は最新版でLTSのJava 17をインストールします。

# yum install java-17-amazon-corretto.x86_64

無事にインストールが完了したら、下記のコマンドで確認します。

# rpm -qa | grep java-
java-17-amazon-corretto-17.0.9+8-1.amzn2.1.x86_64
java-17-amazon-corretto-headless-17.0.9+8-1.amzn2.1.x86_64
# java -version
openjdk version "17.0.9" 2023-10-17 LTS
OpenJDK Runtime Environment Corretto-17.0.9.8.1 (build 17.0.9+8-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.9.8.1 (build 17.0.9+8-LTS, mixed mode, sharing)

次に、Java 17と互換性のある最新版のApache Tomcat 10を/tmpへインストールします。他のバージョンをダウンロードする場合にはこちらを参照してください。

# cd /tmp
# wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.16/bin/apache-tomcat-10.1.16.tar.gz
# ll
-rw-r--r-- 1 root root 12484310 Nov 10 19:55 apache-tomcat-10.1.16.tar.gz

次にtomcatユーザを追加します。これは特にログインが必要なユーザではなく、Tomcat実行用のユーザとなります。

# useradd -s /sbin/nologin tomcat
# cat /etc/passwd | grep tomcat
tomcat:x:1002:1002::/home/tomcat:/sbin/nologin

tomcatユーザに切り替えできないことも確認しておきます。

# su - tomcat
This account is currently not available.

さきほどダウンロードしておいたapache-tomcat-10.1.16.tar.gzを展開します。

# tar -xzvf apache-tomcat-10.1.16.tar.gz
# ll
drwxr-xr-x 9 root root      220 Nov 29 20:08 apache-tomcat-10.1.16
-rw-r--r-- 1 root root 12484310 Nov 10 19:55 apache-tomcat-10.1.16.tar.gz

展開したフォルダは/opt/へ移動させておきます。

# mv apache-tomcat-10.1.16 /opt/
# cd /opt/
# ll
drwxr-xr-x 9 root root 220 Nov 29 20:08 apache-tomcat-10.1.16

ユーザとグループを変更しておきます。

# chown -R tomcat:tomcat apache-tomcat-10.1.16/
# ll
drwxr-xr-x 9 tomcat tomcat 220 Nov 29 20:08 apache-tomcat-10.1.16

systemctlコマンドで起動などの操作するためにtomcat.serviceファイルを作成します。

# vi /etc/systemd/system/tomcat.service

Tomcat 10.1.16ダウンロードしたのであれば、下記をそのままコピペします。

[Unit]
Description=Apache Tomcat 10
After=network.target
[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/apache-tomcat-10.1.16/ tomcat.pid
RemainAfterExit=yes
ExecStart=/opt/apache-tomcat-10.1.16/bin/ startup.sh
ExecStop=/opt/apache-tomcat-10.1.16/bin/ shutdown.sh
ExecReStart=/opt/apache-tomcat-10.1.16/bin/ shutdown.sh;/opt/apache-tomcat-10.1.16/bin/startup.sh
[Install]
WantedBy=multi-user.target

tomcat.serviceが作成されたか確認し、権限を変更します。

# ll /etc/systemd/system
-rw-r--r-- 1 root root  413 Nov 29 20:18 tomcat.service
# chmod 755 /etc/systemd/system/tomcat.service
# ll /etc/systemd/system/tomcat.service
-rwxr-xr-x 1 root root  413 Nov 29 20:18 tomcat.service

systemdをリロードすることによって、作成したtomcat.serviceを読み込ませます。自動起動の設定はまだdisableの状態です。

# systemctl daemon-reload
# systemctl list-unit-files | grep tomcat
tomcat.service                                disabled

下記のsystemctlコマンドでOS起動時に自動起動するように設定します。

# systemctl enable tomcat.service
Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /etc/systemd/system/tomcat.service.
# systemctl list-unit-files | grep tomcat
tomcat.service                                enabled

実際にTomcatを起動させてみます。

# systemctl start tomcat.service
# ps -ef | grep tomcat
tomcat    7510     1  7 20:59 ?        00:00:03 /usr/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-10.1.16/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 --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 -classpath /opt/apache-tomcat-10.1.16/bin/bootstrap.jar:/opt/apache-tomcat-10.1.16/bin/tomcat-juli.jar -Dcatalina.base=/opt/apache-tomcat-10.1.16 -Dcatalina.home=/opt/apache-tomcat-10.1.16 -Djava.io.tmpdir=/opt/apache-tomcat-10.1.16/temp org.apache.catalina.startup.Bootstrap start
root      8242 20765  0 20:59 pts/0    00:00:00 grep --color=auto tomcat
# systemctl status tomcat.service
● tomcat.service - Apache Tomcat 10
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited) since Wed 2023-11-29 20:59:05 UTC; 1min 12s ago
  Process: 7496 ExecStart=/opt/apache-tomcat-10.1.16/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 7496 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/tomcat.service
           └─7510 /usr/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-10.1.16/conf/logging.properties -Djava.util.logging.manager=org.apache....

Nov 29 20:59:05 ip-172-31-45-197.ap-northeast-1.compute.internal systemd[1]: Starting Apache Tomcat 10...
Nov 29 20:59:05 ip-172-31-45-197.ap-northeast-1.compute.internal systemd[1]: Started Apache Tomcat 10.

EC2インスタンスに割り振られたパブリックIP+:8080でApache Tomcatが表示されることを確認します。下記のようなかわいい(?)ネコが出てきたら問題なくTomcatがインストールできた証拠です。

※あくまで今回はTomcatのインストールをしたかっただけです。最初に書いた通り、通常はwebサーバのApacheとの連携が必要となります。

おわりに

今回は初めてApache Tomcatとというものをちょっと触ってみました。ただ、実際に使用するにはApache HTTP Serverとの連携が必要となるため、そちらの連携方法も追々まとめていければと思います!

この記事をシェアする
著者:sugawara
元高校英語教員。2023&2024 Japan AWS All Certifications Engineers。IaCやCI/CD、Platform Engineeringに興味あり。