[WIP][AWS]EC2でSpringBootアプリケーションを実行する

SpringBootで開発したWebアプリケーションをEC2で実行するまでの手順をまとめます。

jarファイルとwarファイルの2通りの実行方法がありますので両方まとめます。主な違いは以下の通りです。

jarファイル 通常のJavaアプリケーションをパッケージングした内容で、SpringBootの場合、tomcatを内包している。そのため、jarファイル単独で実行できる。
warファイル Webアプリケーション向けにパッケージングされている。tomcat上にデプロイして実行する。

なお、EC2の構築については以下記事で構築したものを使います。
https://www.s-watanabe.work/2023/05/awsamazon-ec2.html

環境について

EC2プラットフォーム Ubuntu 22.04.3 LTS
ローカルビルド環境 Gradle 8.3
JDKバージョン
(ローカル/EC2)
openjdk version "17.0.9" 2023-10-17

jarファイルでの実行方法

ローカル(WSL)での作業

gradleインストール

sudo add-apt-repository ppa:cwchien/gradle
sudo apt update
sudo apt upgrade gradle
sudo apt autoremove
確認
$ gradle -v

------------------------------------------------------------
Gradle 8.3
------------------------------------------------------------

jarファイル作成

build.gradle修正

以下を追加する。Main-Classはmainメソッドを持つクラスを指定する。

jar {
  manifest {
    attributes 'Main-Class': 'TestApplication'
  }
}
ビルド実行
gradle build

ビルドが完了すると build/libs/ 配下にjarファイルが作成される。

$ ls build/libs/
application-0.0.1-SNAPSHOT.jar

jarファイルをEC2インスタンスへアップロード

scp -i test-key.pem build/libs/application-0.0.1-SNAPSHOT.jar ubuntu@ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com:~

EC2での作業

SSHログイン

scp -i test-key.pem ubuntu@ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com

ホームディレクトリにjarファイルがアップロードされていることを確認する。

Apacheアンインストール

WebサーバーにはTomcatを使用するので、前回の記事で動作確認のためにインストールしたApacheは削除する。

sudo systemctl stop apache2
sudo apt purge apache2

java17インストール

sudo apt install -y openjdk-17-jre
確認
$ java -version
openjdk version "17.0.9" 2023-10-17

jarファイル実行

java -jar ~/application-0.0.1-SNAPSHOT.jar

セキュリティグループの編集

SpringBootをjarファイルで実行した場合、ポート番号は8080が使用されるため、アクセスできるようにインバウンドルールを追加する。ここではひとまず動作確認のためなのですべてのトラフィックを許可している。

動作確認

ブラウザ上でアクセスしてトップページが開ければOK
http://ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com/{context-path}

nohupコマンドで実行

セッションを離れても裏で実行したままにしておくには、nohupコマンドを使用する。

実行方法

nohup java -jar application-0.0.1-SNAPSHOT.jar &

終了方法

終了する場合は、psコマンドでプロセスIDを確認し、killするばOK

$ ps
    PID TTY          TIME CMD
   6309 pts/0    00:00:00 bash
   6485 pts/0    00:00:07 java
   6499 pts/0    00:00:00 ps

$ kill 6485

$ ps
    PID TTY          TIME CMD
   6309 pts/0    00:00:00 bash
   6520 pts/0    00:00:00 ps
[1]+  Exit 143                nohup java -jar application-0.0.1-SNAPSHOT.jar

warファイルでの実行方法

ローカル(WSL)での作業

warファイル作成

build.gradle修正

pluginsに以下を追加

id 'war'

適当なところに以下を追加

bootWar {
  archiveFileName = 'application.war'
}
ビルド実行
gradle build

ビルドが完了すると build/libs/ 配下にjarファイルが作成される。

$ ls build/libs/
application.war

warファイルをEC2インスタンスへアップロード

scp -i test-key.pem build/libs/application.war ubuntu@ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com:~

EC2での作業

SSHログイン

scp -i test-key.pem ubuntu@ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com

ホームディレクトリにwarファイルがアップロードされていることを確認する。

Tomcat10のインストール

curl -O http://ftp.riken.jp/net/apache/tomcat/tomcat-10/v10.1.16/bin/apache-tomcat-10.1.16.tar.gz
tar xvzf apache-tomcat-10.1.16.tar.gz
sudo mv apache-tomcat-10.1.16/ /usr/libexec/tomcat10
sudo useradd -M -d /usr/libexec/tomcat10 tomcat
sudo chown -R tomcat. /usr/libexec/tomcat10

設定ファイル作成

sudo vi /usr/lib/systemd/system/tomcat10.service
[Unit]
Description=Apache Tomcat 10
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/libexec/tomcat10/bin/startup.sh
ExecStop=/usr/libexec/tomcat10/bin/shutdown.sh
RemainAfterExit=yes
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

ポート番号変更

sudo vim /usr/libexec/tomcat10/conf/server.xml

8080 → 80

tomcatサービススタート

sudo /usr/libexec/tomcat10/bin/startup.sh
確認

ブラウザ上でアクセスしてTomcatのトップページが開ければOK
http://ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com

※ネットワークセキュリティグループの「すべてのトラフィック」を許可する設定はセキュリティの観点から削除しておく。

TODO

※tomcatからwarファイルでの実行方法については作成中

Tomcat Webアプリケーションマネージャ

Tomcat Webアプリケーションマネージャは、webapps配下のWEBアプリケーションの管理を行うことができる。TomcatのトップページからManager Appで開くことができるが、デフォルトの状態では403エラーになってしまう。

EC2上で起動するための設定

tomcatユーザーのパスワードを設定

sudo passwd tomcat

パスワードは任意のものを設定する。

パスワードとロールの設定

設定したパスワードをTomcatユーザー設定ファイルに記載する。

sudo vim /usr/libexec/tomcat10/conf/tomcat-users.xml

以下を追加

  <role rolename="manager-gui"/>
  <user username="tomcat" password="{設定したパスワード}" roles="manager-gui"/>

Webアプリケーションマネージャのアクセス許可IPリストの設定

デフォルトの状態では実行中のサーバー、つまりEC2インスタンス上のブラウザからしかアクセスできないようになっている。そんなことは不可能なのでこの設定を取り払ってやる。

sudo vim /usr/libexec/tomcat10/webapps/manager/META-INF/context.xml

以下のようにRemoteAddrValueの設定をコメントアウトする。

<!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->

Tomcatのリスタート

sudo /usr/libexec/tomcat10/bin/shutdown.sh
sudo /usr/libexec/tomcat10/bin/startup.sh

確認

TomcatのトップページからManager Appをクリックし、以下のような画面が開ければOK

なお、初回起動時は接続ユーザーとパスワードを聞かれるので、tomcatと設定したパスワードを入力する。

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

docker-compose で起動したweb、MySQLに接続できない事象

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)