Amazon Lightsail でドメインリダイレクトを行ってみた

2022.10.10

いわさです。

Lightsail で稼働している Web サイトに対してカスタムドメインを割り当てしている時に、任意のサブドメインすべてを特定のドメインへリダイレクトさせたいケースがあり、その方法を整理したので共有します。

前提

以下のような予測出来ない何らかのサブドメインへのリクエストの場合に有効なドメインへリダイレクトさせたいというのがゴールです。

  • hoge1.example.com → example.com
  • hoge2.example.com → example.com

前提として以下のように Lightsail で LAMP 環境を稼働させており、静的 IP アドレスのアタッチと DNS レコードの登録を行っています。

名前解決

まずサブドメインの名前解決方法ですが、こちらは簡単です。
今回は Lightsail DNS を使っていますが Lightsail DNS ではワイルドカードを使ったレコードが登録できるのでサブドメインに対する名前解決はどうにかなります。
ここでは指定可能な静的 IP アドレスを指定します。

ただし、これでサブドメインへアクセスした場合は目的のドメインと同じコンテンツが表示はされますが、リダイレクトはされずに hoge1.example.com として表示されます。

% curl -I http://hoge1010.tak1wa.com/
HTTP/1.1 200 OK
:
% curl -I http://aaa.hoge1010.tak1wa.com/
HTTP/1.1 200 OK

そこで、ここからリダイレクトの方法を考える必要があります。

Lightsail ロードバランサーではリダイレクトは処理出来ない

EC2 でホスティングされた Web サイトの場合だと ALB のリスナーでリダイレクトさせることが出来ます。
しかし、調べてみたところ Lightsail ロードバランサーでは詳細なリスナー構成を行うことが出来ません。

唯一リダイレクト構成可能なものは HTTP → HTTPS へのリダイレクトのみです。
こちらも半年近く前にようやくマネージドな機能として提供されるようになったものです。

Lightsail ディストリビューションでもリダイレクトは処理出来ない

次に Lightsail インスタンスの前段に配置出来るものといえばディストリビューションです。
こちらも念の為確認してみました。

こちらも非 Lightsail な CloudFormation などのように詳細なビヘイビアを定義することは出来ません。
可能なのは以下のようにキャッシュの有無と条件のみです。

ミドルウェアで行うことになる

結論としてはミドルウェアで処理するしかなさそうです。

今回は Bitnami の LAMP インスタンスを使っているのでバーチャルホストで定義をしてやろうと思います。
このあたりはお使いの環境にあわせて設定が必要です。

上記を参考に Bitnami 環境で VirtualHost を定義する手順を確認し、今回は SSL 構成前だったので/opt/bitnami/apache/conf/vhosts/*-vhost.confを作成して以下のように RewriteRule を追加しました。

bitnami@ip-172-26-13-21:/opt/bitnami/apache/conf/vhosts$ cat hoge-vhost.conf
<VirtualHost *:80>
  ServerName hoge1010.tak1wa.com
  DocumentRoot /opt/bitnami/apache/htdocs
</VirtualHost>
<VirtualHost *:80>
  ServerName hoge1010.tak1wa.com
  ServerAlias *.hoge1010.tak1wa.com
  RewriteEngine On
  RewriteRule ^/(.*) http://hoge1010.tak1wa.com/$1 [R,L]
</VirtualHost>
bitnami@ip-172-26-13-21:/opt/bitnami/apache/conf/vhosts$ sudo /opt/bitnami/ctlscript.sh restart apache
Restarted apache

追加後に再起動しリクエストを送信してみましょう。

% curl -I http://hoge1010.tak1wa.com/    
HTTP/1.1 200 OK
:
% curl -I http://aaa.hoge1010.tak1wa.com/
HTTP/1.1 302 Found
Location: http://hoge1010.tak1wa.com/

期待どおりリダイレクトされていますね。

さいごに

本日は Amazon Lightsail でドメインリダイレクトを行う方法を調べてみました。

HTTP → HTTPS のリダイレクトがインスタンス外で構成出来るようになっていたりと便利になっていますが、結論として Lightsail の場合はミドルウェアで頑張れという感じでした。
VPC ピアリングを使って非 Lightsail な ALB を用意してやる方法も出来そうですが、リダイレクトのためにそこまでやるかという感じはするので、ミドルウェアで対応するのが無難な感じだなぁというのがわかりました。