0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS CloudFrontをTomcatのリバースプロキシとして利用する

Posted at

概要

以前、私が運用していた構成は、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®

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
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のプレフィックスリストを指定します。

EC2のセキュリティグループの設定

プレフィックスリストについてはこちらを参照してください。
AWS マネージドプレフィックスリスト

プレフィックスリストを使用せずに「0.0.0.0/0」や「::/0」で許可してしまうと8080に直接アクセスできてしまいます。

CloudFrontのディストリビューションを作成

AWS マネジメントコンソールからCloudFrontを開き、新しいディストリビューションを作成します。

CloudFront1

キャッシュポリシーを必ず「CachingDisabled」に設定します

CloudFront2

動的なWebサイトの場合アクセスする人によってページコンテンツが変わる仕組みになっている物と思います。
キャッシュを有効にした場合他の人の為のページがキャッシュされて全く別の人に表示されるというセキュリティ事故が発生してしまうので、ここではCSSやJSファイルなどの静的ファイルも含み全てキャッシュを無効に設定しています。
ディストリビューション作成後にビヘイビアを追加してください。

エラーページを使用する場合ここでカスタムエラーページを設定してください。

CloudFront3

CloudFrontの接続テスト

この状態でディストリビューションの詳細の「ディストリビューションドメイン名」のURLにアクセスするとあなたのページが表示されると思います。
表示されていたらここまで成功です。

6.png

Route 53で名前解決をCloudFrontに向ける

この作業により実際のユーザーがあなたのサイトに流入してきます。

AWS マネジメントコンソールからRoute 53を開き、ホストゾーンのレコードを作成、または既存の場合は編集します。

レコードタイプはAかAAAAを選択し、
エイリアスにチェックを入れ、
CloudFront ディストリビューションへのエイリアスを選択し、
先ほど作成したCloudFrontのディストリビューションを選択します。

Route 53で名前解決をCloudFrontに向ける

接続テスト

ブラウザにあなたのドメインを入力して正しく接続できれば設定完了となります。

お疲れ様でした!

最後に

もし記事に不備がある場合はお知らせ頂けると幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?