1. イントロダクション
この記事は、JavaアプリのAWSデプロイにおける手順を分かりやすく解説しています。初心者にとってはハードルが高いかもしれませんが、心配しないでください。ステップバイステップで進めるように、具体的なコマンドを使いながらAWSデプロイの手順を詳しく説明しています。
記事は大きく2つに分かれています。まず、AWSを用いたVPC(Virtual Private Cloud)の作成方法を解説します。その次に、ApacheおよびTomcatを用いたWebサーバーの環境構築方法を解説します。この記事を読むことで、AWSデプロイの手順を理解し、実際にJavaアプリをAWS上でデプロイすることができるようになります。
2. AWSを用いたVPC(Virtual Private Cloud)の作成
この章ではでは、1つのアベイラビリティーゾーン(AZ)にVPC、インターネットゲートウェイ、インターネットへのパブリックルートがあるルートテーブル、1つのパブリックサブネットを作成します!
今回用いる環境の概要図は以下の通りです。
2.1 VPC、ルートテーブル、インターネットゲートウェイを作成
1.AWSマネジメントコンソール上部の検索ボックスで「VPC」を検索する
2.「VPCを作成」を押す
3.左側の「VPCの設定」セクションの中の「作成するリソース」セクションで「VPCなど」を選択する
4.「自動生成」オプションの下にあるテキストボックスに指定したいVPCの名前を入力する。ここでは「test」とする。
5.「IPv4 CIDRブロック」セクションに「10.0.0.0/16」と入力する。
6.「アベイラビリティゾーン (AZ) の数」セクションに「1」を入力する。
7.「パブリックサブネットの数」セクションで「1」を入力する。
8.「プライベートサブネットの数」セクションで「0」を入力する。
9.「VPCエンドポイント」セクションで「なし」を選択する。
10.「プレビュー」セクションが以下の図と同じか確認する。
11.「VPCを作成」を選択する。以下の図と同じように成功と表示されるはずです。
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. 下の図のように設定を行います。
「説明-オプション」以外は全てプルダウンから選択します。「説明-オプション」は以下をコピペしてください。
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の環境設定はEC2のみとなりました。あとちょっとです😃
- AWSマネジメントコンソール上部の検索ボックスで「EC2」と検索します。
- 左側のナビゲーションペインの「インスタンス」セクションで、「インスタンス」を押します。
- 「インスタンスを起動」を選択します。
- 名前を設定します。ここでは「Web Application」としました。
- 「Amazonマシンイメージ(AME)」ドロップダウンの一覧から「Amazon Linux 2 AMI(HVM)」を選択します。
- 「キーペア(ログイン)」セクションで「キーペアなしで続行(推奨されません)」を選択します。
7.「ネットワーク設定」セクションで、「編集」を選択します。
8.VPCドロップダウンから「test-vpc」を選択します。
9.パブリックIPの自動割り当てドロップダウンの一覧を特定し、「有効」を選択します。
10.「ファイアウォール(セキュリティグループ)」セクションで「既存のセキュリティグループ」を選択します。
11.共通のセキュリティーグループから「testGroup」を選択します。
12.「インスタンスを起動」をクリックする。
お疲れ様です!以上でAWSの環境を整えることができました!
3.Webサーバーの環境構築(Apache/Tomcat)
ここまでくれば半分は終了です!頑張りましょう!
3.1EC2と接続する
- AWSマネジメントコンソール上部の検索ボックスで「EC2」と検索します。
- 左側のナビゲーションペインの「インスタンス」セクションで、「インスタンス」を押します。
- 「Web Application」のチェックボックスにチェックをつけ、「接続」をクリックする。
- 遷移後の画面で再度「接続」をクリックする。
EC2に接続することが完了しました!
3.2JDK(Java Development Kit)のインストール
JDKとはJavaのプログラムを作るときに必要な、あるいは、あると便利なあれやこれやを詰め合わせたものです。
インストールする際に、開発に使用したJavaのバージョンと同じものを指定します。私の場合は17でした。
$ sudo yum install java-17-amazon-corretto
//-develの方は必要ないかもしれません🙇
//入れても特に問題はないと思うので、入れておくことを推奨します。
$ sudo yum yum install java-17-amazon-corretto-devel
(-develと無印の違い等が気になった方はぜひ学び編の記事も参照ください!)
Javaがインストールされているか、確認します。
$ 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をインストールします。
$ sudo yum install -y httpd
Apachがインストールされているか確認します。
$ sudo httpd -v
Server version: Apache/2.4.57 ()
Server built: May 3 2023 16:00:14
(あれ、Apacheをインストールしたのにバージョン確認はhttpdを使うの?と思った人は学び編へ)
起動及び動作確認を行います。
$ sudo systemctl start httpd.service
$ 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のテストページが表示出来ることを確認します。
(追記:なぜか、パブリックIpv4DNSへのアクセスができない事例がありました。その際は代わりにPublic IP Addressにアクセスすると解決することがあります。)
例)http://ec2-54-178-72-250.ap-northeast-1.compute.amazonaws.com
$ sudo systemctl stop httpd.service
$ 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サービスも起動するよう設定します。
$ sudo systemctl enable httpd.service
自動起動設定が反映されているか確認します。
Loaded
の(/usr/lib/systemd/system/httpd.service;
の後がenabled
であれば自動起動が有効です。
# 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 のダウンロードページからApache Tomcat 9 本体をダウンロードして使用します。
# 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を実行する専用ユーザを作成します。
(え、どうしてそんなユーザを用意する必要があるのと疑問に思った人は学び編もぜひ!)
$ sudo useradd -s /sbin/nologin tomcat
-s /sbin/nologinにより、ログインできないユーザーを作成しています。
Tomcat本体をダウンロードします。CoreでOKです!
※最新のバージョンのURLを確認の上で適宜変更して実行してください。
# sudo cd ~
# sudo wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.76/bin/apache-tomcat-9.0.76.tar.gz
ダウンロードしたtarファイルを解凍して配置します。
$ 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バージョンを変更する際にも設定に影響が少なくなるようにシンボリックリンクを作成します。
$ sudo ln -s /opt/apache-tomcat-9.0.76 /opt/apache-tomcat
$ sudo chown -h tomcat:tomcat /opt/apache-tomcat
一度シンボリックリンクを作成した後、将来Tomcatバージョンを変更する場合等には以下コマンドでシンボリックリンクのリンク先を変更してください。
$ sudo ln -nfs [変更後のディレクトリのパス] /opt/apache-tomcat
展開したTomcat本体内に生成されるログファイルを他ミドルウェアと同階層のディレクトリ(/var/log 配下)にて参照できるようにシンボリックリンクを生成
$ sudo ln -s /opt/apache-tomcat/logs /var/log/tomcat
$ sudo chown -h tomcat:tomcat /var/log/tomcat
TomcatをOSにサービスとして登録する為、ルート権限でUnitを作成します。viコマンド等を使ってください!
$ sudo vi /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サービスが起動するよう設定します。
$ 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
であれば自動起動が有効です。
$ 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のバージョンを確認します。
$ 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.
起動及び動作確認を行います。
$ sudo systemctl start httpd.service
$ sudo systemctl start tomcat.service
$ 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/
おわりに
今回の作業で作成したWebアプリはこれです。よかったらどうぞ!
参考