概要
以前、私が運用していた構成は、EC2インスタンスの上にnginxとTomcatを立てて、nginxをリバースプロキシにしてTomcatで処理を動かすというよくある構成でした。
多忙のためnginxを最近メンテナンス(バージョンアップとか)できていなかったので、これを気にTomcatだけをEC2で動かして、WebサーバはAWSのマネージドサービスを利用して、Webサーバの運用負担を減らそうというのが今回の狙いです。
(当然Tomcatの更に奥にDBサーバが居ますが今回はDBサーバについては扱いません)
システムの構成
SSHからEC2への接続は自分だけができるようセキュリティグループでマイIPを設定しています。
この記事では冗長化やサイトメンテナンス時用の対処を行っていません。
必要に応じて各自で対応してください。(ALBをCloudFrontとEC2の間に入れるとか)
EC2インスタンスの作成とTomcatの環境構築
EC2の要件
「Elastic IP」で「パブリック IPv4 アドレス」と「パブリック IPv4 DNS」をEC2インスタンスに割り当ててください。
Tomcatの動作の為Javaをインストールしてください。
EC2インスタンス側でTomcatのディレクトリを作成
# mkdir /app
Tomcat実行用のユーザーを作成
# adduser tomcat
作成したディレクトリの所有者を作成したユーザーに変更
# chown tomcat:tomcat /app
作成したユーザーにログインしてTomcatを格納するディレクトリに移動
# su - tomcat
$ cd /app
Tomcatのダウンロード
Tomcatの本体をTomcatの公式ホームページからダウンロードします
Apache Tomcat®
コピーしたURLをwgetでダウンロードします
$ wget https://dlcdn.apache.org/tomcat/tomcat-11/v11.0.3/bin/apache-tomcat-11.0.3.tar.gz
ダウンロードされたTomcatの圧縮ファイルを解凍します
$ tar zxvf apache-tomcat-11.0.3.tar.gz
これ以降圧縮ファイルはもう使わないので削除してしまって大丈夫です。
$ rm -fv apache-tomcat-11.0.3.tar.gz
解凍したディレクトリ内に移動します
$ cd apache-tomcat-11.0.3
Tomcatの設定
Tomcatの設定ファイルですが、基本的にデフォルトで大丈夫です。
今回私は以下の通り設定しています。(デフォルトと同じ設定ですがコメントを消したりしたものを使っています)
$ vi ./conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" />
</Engine>
</Service>
</Server>
WARの配置
解凍したTomcatのディレクトリ内にあるwebapps
ディレクトリにあなたのwarファイルを格納してください。
$ cp あなたのWARファイル.war ./webapps/
Tomcatの起動
Tomcatを起動します
$ ./bin/startup.sh
起動したらログを確認して下記のようなミリ秒の時間が出ていれば起動成功です。
cat ./logs/catalina.out
11-Feb-2025 06:49:21.604 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
11-Feb-2025 06:49:21.615 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [3022] milliseconds
EC2のセキュリティグループの設定
EC2にアタッチしているセキュリティグループのインバウンドルールにてポート番号に先ほどTomcatのserver.xmlで設定したポート番号を入力、ソースにCloudFrontのプレフィックスリストを指定します。
プレフィックスリストについてはこちらを参照してください。
AWS マネージドプレフィックスリスト
プレフィックスリストを使用せずに「0.0.0.0/0」や「::/0」で許可してしまうと8080に直接アクセスできてしまいます。
CloudFrontのディストリビューションを作成
AWS マネジメントコンソールからCloudFrontを開き、新しいディストリビューションを作成します。
キャッシュポリシーを必ず「CachingDisabled」に設定します
動的なWebサイトの場合アクセスする人によってページコンテンツが変わる仕組みになっている物と思います。
キャッシュを有効にした場合他の人の為のページがキャッシュされて全く別の人に表示されるというセキュリティ事故が発生してしまうので、ここではCSSやJSファイルなどの静的ファイルも含み全てキャッシュを無効に設定しています。
ディストリビューション作成後にビヘイビアを追加してください。
エラーページを使用する場合ここでカスタムエラーページを設定してください。
CloudFrontの接続テスト
この状態でディストリビューションの詳細の「ディストリビューションドメイン名」のURLにアクセスするとあなたのページが表示されると思います。
表示されていたらここまで成功です。
Route 53で名前解決をCloudFrontに向ける
この作業により実際のユーザーがあなたのサイトに流入してきます。
AWS マネジメントコンソールからRoute 53を開き、ホストゾーンのレコードを作成、または既存の場合は編集します。
レコードタイプはAかAAAAを選択し、
エイリアスにチェックを入れ、
CloudFront ディストリビューションへのエイリアスを選択し、
先ほど作成したCloudFrontのディストリビューションを選択します。
接続テスト
ブラウザにあなたのドメインを入力して正しく接続できれば設定完了となります。
お疲れ様でした!
最後に
もし記事に不備がある場合はお知らせ頂けると幸いです。