EC2サーバ構築ハンズオン:AWSコンソールでTomcatを構築する手順【EC2 Tomcat / CloudFormation版との比較付き】

AWS Basic
スポンサーリンク
スポンサーリンク

はじめに

「EC2サーバ上でJavaアプリを動かしたい」——ApacheでHTMLを返せるようになったら、次はJavaが実行できるAPサーバー(Tomcat)に挑戦しましょう。

この記事では、AWSコンソール(GUI)のみを使って、Tomcat APサーバーが動作するEC2インスタンスをゼロから手動で構築するハンズオンを紹介します。

インターネット
  ↓ TCP 8080(Tomcat HTTP)← ブラウザでアクセス
  ↓ TCP 22(SSH)          ← ターミナルで接続
セキュリティグループ(ファイアウォール)
  ↓ 自分のIPのみ通過させる
EC2インスタンス(t2.micro / Amazon Linux 2023)
  ├── Java 17(Amazon Corretto)← Tomcatの実行基盤
  ├── Tomcat 10.1(APサーバー)← UserDataで自動インストール
  │     └── /opt/tomcat/latest/webapps/ROOT/index.jsp を返す
  └── IAMロール(Session Manager接続用)

このハンズオンで体験できること:

  • EC2サーバーへのJava 17(Amazon Corretto)とTomcat 10のインストール
  • セキュリティグループによるポートアクセス制御(SSH:22 / Tomcat:8080)
  • UserDataを使ったJava + Tomcatの初回起動時自動インストール
  • JSPが実行されていることをブラウザで確認(Apacheの静的HTMLとの違い)

このハンズオンの特徴:

  • Apache版(Phase 1-1)の次のステップとして、APサーバーとWebサーバーの違いを体験できる
  • 手動操作を通じて、各リソースの役割と依存関係を視覚的に理解できる

この記事は CloudFormation版ハンズオン の比較記事です。
コンソール操作でEC2 Tomcatサーバー構築の全体像を学び、CloudFormationとの違いを比較したい方向けです。


-->

スポンサーリンク

キーワード解説

用語意味
EC2(Elastic Compute Cloud)AWSの仮想サーバーサービス。今回はここにJava + Tomcatをインストールする
TomcatJavaのWebアプリケーション(JSP/Servlet)を実行するAPサーバー。Apacheとは異なりJavaコードを動かすことができる
Amazon CorrettoAWSが提供するOpenJDKのディストリビューション。無償・本番利用可能なJava実行環境
JSP(JavaServer Pages)HTMLにJavaコードを埋め込んで動的なページを生成する技術。Tomcatがサーバー側で実行してHTMLを返す
セキュリティグループEC2への通信を制御するファイアウォール。今回はポート22(SSH)と8080(Tomcat)を開ける
UserDataEC2の初回起動時のみ自動実行されるシェルスクリプト。今回はJava + Tomcatのインストールに使う
IAMロールEC2にAWSサービスを利用する権限を付与する仕組み。今回はSession Manager接続に使う
キーペアSSHでEC2に接続するための鍵ペア(公開鍵+秘密鍵)

スポンサーリンク

Apache(Webサーバー)と Tomcat(APサーバー)の違い

比較項目Apache(前回)Tomcat(今回)
種類WebサーバーAPサーバー(Application Server)
得意なこと静的ファイル(HTML/CSS/画像)の配信Java(JSP/Servlet)の実行
デフォルトポート808080
コンテンツの置き場/var/www/html//opt/tomcat/latest/webapps/ROOT/
インストール方法yum install httpd(1コマンド)Java + Tomcatを手動インストール(複数ステップ)

使用するAWSサービス

サービス役割料金
EC2Java + Tomcatが動作するAPサーバー本体(t2.micro)月750時間まで無料枠あり
セキュリティグループSSH/Tomcatのアクセス制御無料
IAMEC2へのSession Manager接続権限無料
EBSEC2にアタッチされるストレージ(デフォルト8GB)月30GBまで無料枠あり

注意: 無料枠はAWSアカウント開設から12ヶ月間です。期間終了後はEC2インスタンス稼働時間に課金されます。ハンズオン後は必ずリソースを削除してください。


構築するリソース

リソース役割
キーペアSSHでEC2に接続するための認証鍵
IAMロールEC2にSession Manager接続の権限を付与
セキュリティグループSSH(22)・Tomcat(8080)のアクセス制御
EC2インスタンスJava + Tomcatが動作するAPサーバー本体

全体の作業順序

依存関係があるため、必ずこの順番で作成します。

⓪ 自分のIPアドレスを確認する(重要)
      ↓
① キーペアを作成する
      ↓
② IAMロールを作成する
      ↓
③ EC2インスタンスを起動する
  (セキュリティグループ・UserDataも同時に設定)
      ↓
④ 動作確認(ブラウザ・SSH)
      ↓
⑤ リソースを削除する

【重要】⓪ 自分のIPアドレスを確認する

セキュリティグループで自分のIPだけを許可するために、正確なIPアドレスを事前に確認します。

注意: curl https://checkip.amazonaws.com で表示されるIPと、EC2への実際の接続元IPが一致しない場合があります(ISPやプロキシの経路の違いによる)。最も確実な方法はルーター管理画面での確認です。

方法A: ルーター管理画面で確認(推奨)

  1. ブラウザで以下のURLにアクセスします(ルーターによって異なります)
    http://192.168.0.1  または  http://192.168.1.1
  2. 「ネットワークマップ」または「インターネット」項目を開く
  3. **「インターネットIPアドレス」または「WAN IPアドレス」**の値を控えます

方法B: コマンドで確認

curl https://checkip.amazonaws.com

控えておく情報: 自分のIPアドレス(例: 203.0.113.1


① キーペアの作成

キーペアはSSHでEC2に接続するための鍵です。EC2起動時に指定する必要があるため、最初に作成します。

AWSコンソール → EC2 → ネットワーク&セキュリティ → キーペア → 「キーペアを作成」

設定項目
名前my-ec2-tomcat-key
キーペアのタイプRSA
プライベートキーファイル形式.pem

「キーペアを作成」をクリックすると、自動的に my-ec2-tomcat-key.pem がダウンロードされます。

ダウンロードしたキーペアを保存する

ダウンロードされた my-ec2-tomcat-key.pem を以下の場所に移動します。

C:\Users\ユーザー名\.ssh\my-ec2-tomcat-key.pem

注意: .pem ファイルは再ダウンロードできません。紛失した場合は新しいキーペアを作成する必要があります。

前回のキーペアの流用について: EC2 + Apacheハンズオンで作成した my-ec2-apache-key を流用しても動作します。その場合この手順はスキップします。


② IAMロールの作成

Session Manager(ブラウザからEC2に接続できるAWS機能)を使えるようにするためのIAMロールを作成します。

なぜIAMロールが必要か: EC2がAWSのサービス(Session Manager)を利用するには、そのEC2自身に「このサービスを使う権限」を付与する必要があります。この権限の設定がIAMロールです。

AWSコンソール → IAM → ロール → 「ロールを作成」

ステップ1: エンティティタイプとユースケースの選択

設定項目
信頼されたエンティティタイプAWSのサービス
ユースケースEC2

「次へ」をクリック。

ステップ2: 許可ポリシーのアタッチ

検索ボックスに AmazonSSMManagedInstanceCore と入力してチェックを入れます。

「次へ」をクリック。

ステップ3: ロール名の設定

設定項目
ロール名my-ec2-tomcat-role

「ロールを作成」をクリック。


③ EC2インスタンスの起動

キーペアとIAMロールを作成したあと、EC2インスタンスを起動します。
セキュリティグループとUserData(Java + Tomcat自動インストール)も同時に設定します。

AWSコンソール → EC2 → インスタンス → 「インスタンスを起動」

3-1. 基本設定

設定項目
名前my-ec2-tomcat-instance
アプリケーションおよびOSイメージAmazon Linux 2023 AMI(デフォルトで選択済み)
インスタンスタイプt2.micro(無料枠対象)
キーペアmy-ec2-tomcat-key

3-2. セキュリティグループの設定

「ネットワーク設定」→「セキュリティグループを作成する」を選択します。

セキュリティグループ名と説明を設定:

設定項目
セキュリティグループ名my-ec2-tomcat-sg
説明EC2 Tomcat hands-on SG

「インバウンドセキュリティグループのルールを追加」ボタンで以下の2ルールを追加します。

ルール1: SSH接続の許可

設定項目
タイプSSH
ソースタイプカスタム
ソース203.0.113.1/32(⓪で確認した自分のIP + /32)

ルール2: Tomcat HTTPアクセスの許可

設定項目
タイプカスタム TCP
ポート範囲8080
ソースタイプカスタム
ソース203.0.113.1/32(⓪で確認した自分のIP + /32)

ポート8080について: TomcatはデフォルトでHTTP 8080番ポートをListenします。Apacheの80番とは異なるため、セキュリティグループでも8080を明示的に開ける必要があります。

/32 とは: 「このIPアドレス1つだけ」という意味のCIDR表記です。0.0.0.0/0 は全世界に開放することになりセキュリティリスクが高いため、必ず自分のIPのみに制限します。

3-3. IAMロールの設定

「高度な詳細」を開く → 「IAM インスタンスプロファイル」→ my-ec2-tomcat-role を選択します。

3-4. UserDataの設定(Java + Tomcatの自動インストール)

「高度な詳細」の一番下にある「ユーザーデータ」に以下を貼り付けます。

#!/bin/bash
dnf update -y
dnf install -y java-17-amazon-corretto

useradd -m -d /opt/tomcat -U -s /bin/false tomcat

TOMCAT_VERSION="10.1.25"
cd /tmp
wget -q "https://archive.apache.org/dist/tomcat/tomcat-10/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz" \
  -O apache-tomcat.tar.gz
tar xzf apache-tomcat.tar.gz
mv "apache-tomcat-${TOMCAT_VERSION}" /opt/tomcat/latest
chown -R tomcat:tomcat /opt/tomcat
chmod -R u+x /opt/tomcat/latest/bin

cat > /etc/systemd/system/tomcat.service << 'SVCEOF'
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto"
Environment="CATALINA_HOME=/opt/tomcat/latest"
Environment="CATALINA_BASE=/opt/tomcat/latest"
Environment="CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid"
Environment="JAVA_OPTS=-Xms256m -Xmx512m"
ExecStart=/opt/tomcat/latest/bin/startup.sh
ExecStop=/opt/tomcat/latest/bin/shutdown.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
SVCEOF

systemctl daemon-reload
systemctl enable tomcat
systemctl start tomcat

cat > /opt/tomcat/latest/webapps/ROOT/index.jsp << 'JSPEOF'
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Tomcat on EC2</title></head>
<body>
<h1>Hello from Tomcat on Amazon Linux 2023!</h1>
<p>Java Version: <%= System.getProperty("java.version") %></p>
<p>Tomcat Version: <%= application.getServerInfo() %></p>
</body>
</html>
JSPEOF
chown tomcat:tomcat /opt/tomcat/latest/webapps/ROOT/index.jsp

各コマンドの説明:

コマンド意味
dnf update -yOSのパッケージを最新化する(Amazon Linux 2023はdnfを使用)
dnf install -y java-17-amazon-correttoAWSが提供するJava 17ディストリビューションをインストール
useradd -m -d /opt/tomcat -U -s /bin/false tomcatTomcat専用システムユーザーを作成(ログイン不可・セキュリティ対策)
wget -q ... -O apache-tomcat.tar.gzApache公式アーカイブからTomcatをダウンロード
tar xzf apache-tomcat.tar.gzダウンロードしたtar.gzを展開
mv ... /opt/tomcat/latestTomcatを /opt/tomcat/latest/ に配置
chown -R tomcat:tomcat /opt/tomcatTomcatディレクトリの所有者をtomcatユーザーに変更
chmod -R u+x /opt/tomcat/latest/binbinディレクトリのスクリプトに実行権限を付与
cat > /etc/systemd/system/tomcat.serviceTomcatをLinuxサービスとして登録するファイルを作成
systemctl daemon-reloadsystemdにサービス定義ファイルの変更を反映
systemctl enable tomcatOS起動時にTomcatが自動起動するよう設定
systemctl start tomcatTomcatを起動
cat > .../index.jspテスト用JSPページを作成(Javaコード入り)

Amazon Corretto(コレット)とは: AWSが提供するOpenJDKのディストリビューション。無償・本番利用可能で、Amazon Linux 2023のパッケージリポジトリから直接インストールできます。

JAVA_OPTS=-Xms256m -Xmx512m: Javaの使用メモリを制限する設定です。t2.microは1GBのメモリしかないため、最小256MB・最大512MBに制限して他のプロセスと共存できるようにしています。

UserDataはインスタンスの初回起動時のみ実行されます。Tomcatのダウンロードを含むため、完了まで約5〜10分かかります。

3-5. インスタンスを起動する

「インスタンスを起動」ボタンをクリック。

起動完了まで約2〜3分待ちます。インスタンスの「状態」が「実行中」になったことを確認します。

控えておく情報: インスタンスのパブリックIPアドレス

インスタンス一覧 → 作成したインスタンスをクリック → 「パブリック IPv4 アドレス」を確認してメモします。


④ 動作確認

重要: UserDataでのJava + Tomcatインストールが完了するまで約5〜10分かかります。インスタンスが「実行中」になってもすぐには接続できません。

ブラウザで確認

ブラウザで以下のURLにアクセスします。ポート番号 8080 を忘れずに入力してください。

http://(パブリックIPアドレス):8080

以下のように表示されれば成功です。

Hello from Tomcat on Amazon Linux 2023!
Java Version: 17.x.x
Tomcat Version: Apache Tomcat/10.1.25

JSPが実行されている証拠: Java VersionTomcat Version はJavaコード(<%= ... %>)がサーバー側で実行されて表示されています。ApacheのHTMLと違い、TomcatがJavaを動かして動的にページを生成しています。

表示されない場合: UserDataのインストールが完了していない可能性があります。5〜10分待ってからリロードしてください。それでも表示されない場合はSSHで接続してログを確認します。

SSHで接続して確認

ローカルPCのターミナル(VSCode CMD)で実行します。

ssh -i C:\Users\ユーザー名\.ssh\my-ec2-tomcat-key.pem ec2-user@(パブリックIPアドレス)

初回接続時に以下の確認が出ます。yes を入力します。

Are you sure you want to continue connecting (yes/no)? yes

接続できたら以下を実行します。

java -version

# Tomcatサービスの動作状態を確認(active (running) と表示されれば正常)
sudo systemctl status tomcat

# TomcatのメインログでERRORがないか確認
sudo tail -50 /opt/tomcat/latest/logs/catalina.out

# Tomcatが8080番ポートをListenしているか確認
sudo ss -tlnp | grep :8080

# EC2から切断
exit

Tomcatのディレクトリ構成:

パス役割
/opt/tomcat/latest/webapps/ROOT/デフォルトWebアプリのルート(JSP/HTMLを置く場所)
/opt/tomcat/latest/conf/server.xmlTomcatの設定ファイル(ポート番号などを管理)
/opt/tomcat/latest/logs/catalina.outTomcatのメインログ(エラー確認に使う)
/opt/tomcat/latest/bin/startup.shTomcat起動スクリプト
/opt/tomcat/latest/bin/shutdown.shTomcat停止スクリプト

UserDataのインストール状況を確認する方法

インスタンスにSSHで接続できた場合、UserDataの実行ログで進捗を確認できます。

# UserDataのログを確認(インストールの進捗・エラーを確認できる)
sudo cat /var/log/cloud-init-output.log

【接続できない場合】IPアドレスが異なる可能性

curl で確認したIPを設定したが接続できない場合、実際の接続元IPが異なる可能性があります。

一時的に全開放して真のIPを確認する方法:

コンソール → EC2 → セキュリティグループ → my-ec2-tomcat-sg → 「インバウンドルールを編集」

SSHのルールを一時的に 0.0.0.0/0 に変更してSSH接続し、以下を実行します。

echo $SSH_CLIENT
# 出力例: 203.0.113.1 17508 22
# 先頭の値が真の接続元IP

このIPをメモしてSSH接続を切断し、セキュリティグループのSSHルールを 真のIP/32 に戻します。


⑤ リソースの削除

課金を止めるために、ハンズオン完了後は必ず削除してください。削除する順番が重要です。

1. EC2インスタンスを終了する

EC2 → インスタンス → my-ec2-tomcat-instance を選択 → 「インスタンスの状態」→「インスタンスを終了」

確認ダイアログで「終了」をクリック。状態が「終了済み」になるまで待ちます(2〜5分)。

「停止」と「終了」の違い: 「停止」は一時停止(EBSストレージ課金は続く)。「終了」は完全削除(課金停止)。学習後は「終了」を選びます。

2. セキュリティグループを削除する

EC2 → セキュリティグループ → my-ec2-tomcat-sg を選択 → 「アクション」→「セキュリティグループを削除」

インスタンス終了が完了している必要があります。「使用中」エラーが出る場合はインスタンスが「終了済み」状態になるまで待ってください。

3. IAMロールを削除する

IAM → ロール → my-ec2-tomcat-role を選択 → 「削除」→ ロール名を入力して確認

4. キーペアを削除する(任意)

他のEC2でも使い回す場合は残してよいです。不要な場合は削除します。

EC2 → キーペア → my-ec2-tomcat-key を選択 → 「アクション」→「削除」→ 確認テキストを入力

ローカルの .pem ファイルも手動で削除します。

C:\Users\ユーザー名\.ssh\my-ec2-tomcat-key.pem

CloudFormation版との比較

コンソール版を体験したら、次は同じ構成をCloudFormation(コード)で再現してみましょう。何が自動化されるのかがよくわかります。

作業コンソール(手動)CloudFormation
IAMロール作成画面でポチポチ(5クリック以上)template.yaml に定義済み
セキュリティグループ作成画面でポチポチtemplate.yaml に定義済み
EC2起動(UserData含む)画面でポチポチtemplate.yaml に定義済み
デプロイ全体複数画面を行き来(20〜30分)コマンド1本(5〜10分)
削除リソースを個別に依存関係順で手動削除delete-stack 1本
再現性低い(手動ミスのリスクがある)高い(同じ環境を何度でも再現可能)
バージョン管理不可Gitで管理可能

コンソール版で実感できたポイント:

  • Java + Tomcatのインストール手順が長く、手動では設定ミスが起きやすいことを実感できる
  • ポート8080の開放やTomcatユーザーの作成など、セキュリティ設定の重要性が身につく
  • UserDataの完了を待つ間に、コンソール版とCloudFormation版の差が体感できる

CloudFormation版でも試してみる: EC2サーバ構築をIaC化:CloudFormationでEC2 Tomcatを自動デプロイする手順


トラブルシューティング

症状原因対処
ブラウザで何も表示されない(起動後10分以内)UserDataのインストールが完了していないsudo cat /var/log/cloud-init-output.log でインストール状況を確認
ブラウザで何も表示されない(10分以上経過)Tomcatが起動に失敗しているsudo systemctl status tomcatsudo tail -100 /opt/tomcat/latest/logs/catalina.out を確認
ブラウザでTomcatのデフォルトページが表示されるJSPの配置タイミングがTomcat起動より遅れたsudo systemctl restart tomcat でTomcatを再起動する
SSH接続タイムアウトセキュリティグループのIP設定誤りセキュリティグループのSSH(22)ルールのIPを確認
ブラウザにアクセスできない(8080)セキュリティグループのポート8080が開いていないセキュリティグループのインバウンドルールで8080が追加されているか確認
java: command not foundJavaのインストールが失敗しているsudo dnf install -y java-17-amazon-corretto を手動実行
Tomcatは起動しているがJSPが動かないindex.jspの所有者がtomcatユーザーになっていないsudo chown tomcat:tomcat /opt/tomcat/latest/webapps/ROOT/index.jsp を実行
セキュリティグループが削除できないEC2インスタンスがまだ使用中インスタンス「終了済み」状態になってから再試行

まとめ

今回のハンズオンで体験できたこと:

確認項目内容
キーペア作成SSH接続に必要な鍵ペアをコンソールで作成し、.pemファイルをローカルに保存
IAMロール作成AmazonSSMManagedInstanceCoreポリシーをEC2にアタッチして接続権限を付与
セキュリティグループSSH(22)/Tomcat(8080)を自分のIPのみに制限してEC2を保護
UserDataによる自動化Java 17 + Tomcat 10のインストールと起動を初回起動時のスクリプトで自動化
APサーバー確認ブラウザとSSHの両方でTomcat動作・JSP実行を確認
リソース削除依存関係順に4つのリソースを手動で削除

手動操作でひとつひとつ作ると、CloudFormationが裏で何を自動化しているかが理解できます。ぜひ次は CloudFormation版 で同じ構成をコードで再現してみてください。


関連記事

-->

コメント