IT技術・ノウハウ

【Amplify】Hostingしたアプリを特定のポートで公開する方法

2025年3月15日

今回は、Amplify Hostingで公開したアプリケーションについて、特定のポートで公開する方法を紹介する。

ニッチなテーマではあるが、それゆえに情報が少ないので方法を紹介することにした。

文鳥と暮らす在宅エンジニア yassan です。仕事の生産性や生活の質を高めるアイデアを共有しています。

Amplify Hostingの対応しているポート

まず初めに、Amplifyがサポートしているポートをおさらいする。
これはいうまでもなく、443番ポートだ。ごく一般的なHTTPS通信用のポート番号になる。

Amplifyの機能として、このポート番号は変更することはできない。

なぜ変更できないかと言うと、Amplify Hostingが内包しているCloudFrontが原因となる。
CloudFront自体が443番ポートしかサポートしていないので、Amplifyも443番ポートしか対応できないということになる。

ちなみに、Amplifyが内包しているCloudFrontはユーザー側で自由に変更することはできない。
実際にマネジメントコンソールを操作してもらえばわかるかと思うが、CloudFrontディストリビューションの一覧には表示されない。
(Amplifyカスタムドメインを作成すると、対象のホストゾーンのAレコードが作成されるので、そこでCloudFrontのエンドポイントを確認することはできる。)

と言うわけで、Amplifyの機能だけでは特定のポートに対応することはできない。

プロキシサーバーを立てる

「どんな画期的な方法があるんだ・・・!」と期待した方には申し訳ない。
俺も色々考えたけど、結局は前段にプロキシサーバーを立てて、受け口だけポートを変更してCloudFrontを後段にする方法しか思いつかなかった。
思いつかなかったとはいえ、これで上手いこと言ったので勘弁してほしい。

で、プロキシサーバーを立てるのはおかのしたとして、全体構成や細かい部分はどうすんねんと言う話だ。

ポイントは2つあって、
1つは、バックエンドに通信を流すときに、ホストヘッダーを書き換えることが必要だ。
CloudFrontの特性として、リクエスト時のホストヘッダーがCloudFrontのドメインと一致しない場合は403エラーを返すようにできている。
したがって、プロキシサーバー内でホストヘッダーを書き換える必要がある。

もう1つは、プロキシサーバーからCloudFrontへ通信がHTTPSになる点だ。
結局後段のCloudFrontがHTTPSで受けるため、プロキシサーバーからもきちんとHTTPSで繋ぎにいかなくてはならない。
と言うことは、その前段であるプロキシサーバーへの通信もHTTPSにしておくことが望ましい。

以上の点を踏まえて、構成としては
Amplifyの前段に EC2+ACM for Nitro Enclaves でHTTPSを特定のポートで受ける。
EC2内で、Nginx/Apacheの設定でホストヘッダーをAmplifyのカスタムドメインに書き換えてCloudFrontに流す。

(ALB(+ACM)+EC2でも問題ないとは思うが、ALBの料金が高いので俺はやらなかった。)

EC2 + ACM for Nitro Enclaves についてはこちらの記事が参考になる。というかこれ通りにやれば何も問題がない。圧倒的感謝。

ミドルウェアはNingxやApacheをお好みでインストールしてもらえばと思う。俺はNginxでやった。
confファイルの内容は下記の通り。(必要な箇所のみ抜粋)

http {
	upstream backend {
		server example.com;
	}
	server {
    listen       999 ssl http2;
    listen       [::]:999 ssl http2;
    server_name  proxy.example.com;

    ssl_protocols TLSv1.2;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_prefer_server_ciphers on;

    include "/etc/pki/nginx/nginx-acm.conf";
	  
	  proxy_set_header Host example.com;
	  location / {
  	  proxy_pass https://example.com;
	  }
	}
}

以上の設定をすることで、Amplifyアプリに指定したポートでアクセスできるようになるはずだ。

もし繋がらない場合は、Amplifyのアクセスログ やNginxのアクセスログを調査して、切り分けおよび原因の特定をしてほしい。

-IT技術・ノウハウ
-