この手順書は、Java Servlet アプリケーションを AWS EC2 (Amazon Linux 2023) にデプロイするためのガイドです。
インスタンス構成概要
デプロイするサーバーの基本構成は以下の通りです。
| 項目 | 設定内容 | 備考 |
|---|---|---|
| OS | Amazon Linux 2023 | 最新の長期サポート版 |
| インスタンスタイプ | t2.micro | 無料枠対象(テスト環境用) |
| ランタイム | Java 8 (Amazon Corretto) | Servlet 実行環境 |
| Webコンテナ | Apache Tomcat 9 | Tomcat 8.5の後継(推奨) |
| データベース | PostgreSQL 16 | パッケージインストール版 |
| 接続ポート | 表2(ネットワーク設定)参照 | セキュリティグループで解放 |
ネットワーク(セキュリティグループ)設定
インバウンドルール(外からのアクセス)として、以下の設定を適用します。
| プロトコル | ポート範囲 | 許可ソース | 用途 |
|---|---|---|---|
| TCP | 22 | 自身のIPのみ | SSH接続(サーバーのリモート操作用) |
| TCP | 80 | 0.0.0.0/0 | HTTP接続(Webアクセスの標準) |
| TCP | 443 | 0.0.0.0/0 | HTTPS接続(SSL通信の標準) |
| TCP | 8080 | 0.0.0.0/0 | Tomcatテスト用 (HTTP) |
| TCP | 8443 | 0.0.0.0/0 | Tomcatテスト用 (HTTPS / 自己署名) |
前提条件
- AWSアカウント
- warファイル(例:
meal-mate.war) - データベースダンプファイル(例:
meal_mate_production_dump.sql) - SSH接続用キーペア
1. サーバー接続準備
実際に作業を開始する前に、お手元のメモ等に接続情報を控えておいてください。
| 項目 | 内容 |
|---|---|
| パブリックIP | AWSコンソールで確認したIPアドレス |
| キーペア (.pem) | ダウンロードした秘密鍵ファイル |
2. サーバー環境構築
2.1 SSH接続
Tera Termから、作成したキーペアを使ってSSH接続します。
| 項目 | 値 |
|---|---|
| User name | ec2-user |
| Passphrase | (空のまま) |
| Authentication | 「Use RSA/DSA/ECDSA/ED25519 key to log in」を選択し、 作成したキーペア(.pem)を指定 |
2.2 サーバー内での変数設定
SSH接続後、サーバー上のターミナルで以下のコマンドを実行して変数を設定します。
これにより、これ以降のコマンドをコピー&ペーストでそのまま実行できるようになります。
# 実際のファイル名やIPに合わせて設定してください
export WAR_FILE="meal-mate.war"
export DUMP_FILE="meal_mate_production_dump.sql"
export APP_NAME="meal-mate"
export PUBLIC_IP="$(curl -s https://ipinfo.io/ip)" # 自動取得
3. ファイルアップロード(Tera Term を使用)
作業に必要なファイルを、ローカルPCからEC2サーバーへ転送します。
- Tera Term のメニューから [File] -> [SSH SCP...] を選択します。
- 下側の入力欄(Receive...)は空のまま、上側の入力欄(From:)の右側にある [...] ボタンをクリックします。
- アップロードするファイル(
${WAR_FILE}および${DUMP_FILE})を1つずつ選択し、[Send] ボタンをクリックします。- 送信先ディレクトリはデフォルト(ホームディレクトリ
~/)で問題ありません。
- 送信先ディレクトリはデフォルト(ホームディレクトリ
(参考)scpコマンドでの実行(コマンドラインを使用する場合)
scp -i ${KEY_NAME}.pem ${WAR_FILE} ec2-user@${PUBLIC_IP}:~/
scp -i ${KEY_NAME}.pem ${DUMP_FILE} ec2-user@${PUBLIC_IP}:~/
4. サーバー環境構築
4.1 システム更新・Java 8 (Amazon Corretto) インストール
sudo dnf update -y
sudo dnf install -y java-1.8.0-amazon-corretto-devel
4.2 PostgreSQL 16 インストール
# パッケージインストール
sudo dnf install -y postgresql16-server postgresql16
# 初期化
sudo postgresql-setup --initdb
# 起動と自動起動設定
sudo systemctl enable postgresql
sudo systemctl start postgresql
4.3 Tomcat 9 インストール
※Tomcat 8.5はEOLに近いため、Java 8と互換性のあるTomcat 9を推奨します。
cd /opt
sudo wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.91/bin/apache-tomcat-9.0.91.tar.gz
sudo tar xzf apache-tomcat-9.0.91.tar.gz
sudo mv apache-tomcat-9.0.91 tomcat9
sudo chown -R ec2-user:ec2-user /opt/tomcat9
chmod +x /opt/tomcat9/bin/*.sh
5. SSL証明書設定
5.1 自己署名証明書作成
sudo mkdir -p /etc/ssl/private
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/servlet.key \
-out /etc/ssl/certs/servlet.crt \
-subj "/C=JP/ST=Tokyo/L=Tokyo/O=ServletApp/CN=${PUBLIC_IP}"
5.2 PKCS12キーストア作成
sudo openssl pkcs12 -export -in /etc/ssl/certs/servlet.crt \
-inkey /etc/ssl/private/servlet.key \
-out /etc/ssl/certs/servlet.p12 \
-name servlet -passout pass:changeit
5.3 Tomcat SSL設定 (server.xml)
# 既存の server.xml に SSL Connector を追記
sudo sed -i '/<\/Service>/i \
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" \
maxThreads="150" SSLEnabled="true" scheme="https" secure="true" \
clientAuth="false" sslProtocol="TLS" \
keystoreFile="/etc/ssl/certs/servlet.p12" \
keystorePass="changeit" \
keystoreType="PKCS12" />' /opt/tomcat9/conf/server.xml
6. データベース設定
6.1 データベース・ユーザー作成
sudo -u postgres createdb servletdb
sudo -u postgres psql -c "CREATE USER servletuser WITH PASSWORD 'servletpass';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE servletdb TO servletuser;"
6.2 認証設定 (pg_hba.conf)
# localhost からの接続を md5 認証に変更
sudo sed -i "s/host all all 127.0.0.1\/32 ident/host all all 127.0.0.1\/32 md5/" /var/lib/pgsql/data/pg_hba.conf
sudo sed -i "s/host all all ::1\/128 ident/host all all ::1\/128 md5/" /var/lib/pgsql/data/pg_hba.conf
# 設定反映
sudo systemctl restart postgresql
6.3 データベースダンプインポート
# ダンプファイルを /tmp にコピーし権限付与
cp ~/${DUMP_FILE} /tmp/
sudo chown postgres:postgres /tmp/${DUMP_FILE}
# インポート前に postgres ユーザーの権限を確認(必要に応じて)
sudo -u postgres psql -d servletdb -f /tmp/${DUMP_FILE}
# インポート後の権限付与
sudo -u postgres psql -d servletdb -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO servletuser;"
sudo -u postgres psql -d servletdb -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO servletuser;"
7. アプリケーションデプロイ
7.1 Tomcat 起動と war 配置
# Tomcat 起動
/opt/tomcat9/bin/startup.sh
# war ファイルを webapps にコピー
cp ~/${WAR_FILE} /opt/tomcat9/webapps/
# 展開を待つ(約15秒)
sleep 15
7.2 アプリケーション個別設定 (context.xml)
# META-INF への配置 (DB接続設定)
mkdir -p /opt/tomcat9/webapps/${APP_NAME}/META-INF/
cat << 'EOF' > /opt/tomcat9/webapps/${APP_NAME}/META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true">
<Resource
name="jdbc/postgresql"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/servletdb"
username="servletuser"
password="servletpass"
maxTotal="20"
maxIdle="10"
minIdle="5"
initialSize="5"
maxWaitMillis="10000"
testOnBorrow="true"
testWhileIdle="true"
validationQuery="SELECT 1" />
</Context>
EOF
# Tomcat 再起動
/opt/tomcat9/bin/shutdown.sh
sleep 5
/opt/tomcat9/bin/startup.sh
8. 動作確認
# ポート確認 (8080, 8443)
sudo ss -tlnp | grep -E "8080|8443"
# 接続テスト
curl -I http://localhost:8080/${APP_NAME}/
curl -k -I https://localhost:8443/${APP_NAME}/
9. トラブルシューティング
ログの確認
-
Tomcat:
tail -f /opt/tomcat9/logs/catalina.out -
PostgreSQL:
sudo journalctl -u postgresql -f
データベース接続エラー
# 接続テスト
psql -h localhost -U servletuser -d servletdb
重要な注意事項
- セキュリティ: 自己署名証明書のためブラウザで警告が出ますが、テスト用途では問題ありません。本番では ACM や Let's Encrypt を検討してください。
- IPアドレス: インスタンスを停止・起動すると IP が変わります。固定したい場合は Elastic IP を使用してください。
- セキュリティグループ: 手順 1.1 で作成した SG の ID を正しく使用してください。
- Java/Tomcat: 本手順では Java 8 と Tomcat 9 を使用しています。アプリケーションの要件に合わせて適宜変更してください。