Alibaba Cloud ESA でネイキッドドメイン宛の通信をリダイレクトする

約1週間前に私のこのブログサイト(https://www.bigriver.jp/)を Alibaba Cloud ESA 経由でインターネットに公開するように変更し、昨日にオリジンサーバ側でESAからのリクエストにしか応答しないようにセキュリティを強化したのですが、以前は行えていた https://bigriver.jp/ でのアクセス、いわゆるネイキッドドメインでアクセスすると 404 not found が応答されることに気づきました。 

トラフィックの大半は https://www.bigriver.jp/ でアクセスしてもらっているので大きな問題は無いのですがブログ開設当初は ネイキッドドメインのみ(https://bigriver.jp/)で運用していたころが数年ありました。ブックマークされている方とかがいるかもなので問題を解消することにします。

問題を解消するポイントは2つあり1つはDNSでネイキッドドメインをAliasレコードでESAに振り向けするのと、ESA側でリダイレクトのルールを登録することです。 その手順を記録します。

解決したい問題と解決策

解決したい問題はネイキッドドメインの https://bigriver.jp/にアクセスすると “404 not found”が応答されクライアントが私のブログサイトにアクセスできない状況です。

この問題の原因はDNS でネイキッドドメインのAレコードでオリジンサーバを向けており、オリジンサーバでは ESA 経由しかHTTPリクエストを受け付けないためです。  

望ましい状態は、例えば https://bigriver.jp/にアクセスすると自動的に https://www.bigriver.jp/にリダイレクトされる状態です。 もし、リダイレクトが難しい場合は https://bigriver.jp/にアクセスすると何らかのメッセージで表示する、などの方法もあります。

結論として、今回は ESA で https://bigriver.jp/を受け付けできるように設定を追加します。また、ESAで受付後、HTTPのなかでリダイレクトを構成し https://www.bigriver.jp/にクライアントからのアクセスを切り替えさせます。

なお、この時ポイントとなるのがDNSです。 www.bigriver.jp は単純に CNAME でESAを登録するだけですが、ネイキッドドメインには CNAME を使えません。 このような場合は Alias を使うことで bigriver.jp をESAに向けることが可能です。

解決に向けた設定作業は以下の3段階です。 順番に実施した紹介します。

  1. ESA で “bigriver.jp”を受け付けるように設定を追加する
  2. ESA で “bigriver.jp” を “www.bigriver.jp”にリダイレクトする設定を追加する
  3. DNSで “bigriver.jp”のAliasレコードを追加する

ESA で “bigriver.jp”を受け付けるように設定を追加する

Alibaba Cloudコンソールにログインし、ESAの管理画面に移動します。

DNS > Records に移動し、”Add Record”をクリックします。

Record Type はA/AAAAレコード、Record Value でオリジンサーバ(Alibaba Cloud ECS の仮想マシン)を指定します。

なぜ”bigriver.jp”のNSサーバでもないESAにAレコードを追加するのか不思議に思うと思います。私も最初は思いました。

結論、ESAが受け取ったアクセス(https://bigriver.jp)をどのオリジンに転送するかを判断するための内部のマッピングとしての登録となります。 仮にこの後 DNSサーバで bigriver.jp の宛先をESAに向けた場合、ESAがDNSでbigriver.jpの宛先を解決すると自分自身になり、ループに陥ることになるでしょう。 そのための内部マッピングというわけです。  まあ、DNSという言葉に目が行き過ぎるとより混乱する感じです。

ESA で “bigriver.jp” を “www.bigriver.jp”にリダイレクトする設定を追加する

次は ESA でHTTPで “bigriver.jp”宛のリクエストが来たら status code 301 で”www.bigriver.jp”にリダイレクトする設定を行います。  ESA を導入する前はオリジンサーバ側でそのような動作の設定は行っていましたが、今回その設定は残しつつ、前段で処理できるESAにもリダイレクト設定を追加します。 前段で処理ができた方がクライアントサイドから見ると応答時間などで無駄を削減できるのと、原則として不要な通信をできる限り減らすべきということがあります。

設定は ESA の管理画面の Redirect Rules から行います。 “Create Rule”をクリックし、

“hostname”が”bigriver.jp”の場合は Status Code 301 を応答し、”https://www.bigriver.jp”にリダイレクトさせます。

DNSで “bigriver.jp”の ALIAS レコードを追加する

最後に、”bigriver.jp”を管理するDNSサーバで ALIAS レコードを追加します。 ネイキッドドメインには ALIAS は使えないため、ALIAS レコードを利用します。

Alibaba Cloud DNS の管理画面に移動します。 手順は割愛しますが、もともとあった bigriver.jp のAレコードは削除してからALIAS を追加します。 Record ValueにはESAのFQDNを登録します。

DNS登録は以上です。 Alibaba Cloud DNS のマニュアル読むと、ネイキッドドメインでCNAME登録すると自動的に ALIAS に変換してくれる親切仕様のようですが今回は最初から明示的にALIASで作成しました。

動作確認

この設定を実施する前は https://bigriver.jp/にアクセスすると “404 Not Found”でした。

意図的にESAの設定を行わずに DNS だけをALIASレコードでESAに振り向けると “530 Unable to resolve the origin hostname”と、ESAは bigriver.jp 宛を受け取りつつも振り向け先のオリジンがわからないと。

1つ目の設定のESAでのDNS登録を行うことで https://bigriver.jp/にアクセスすると自動的にhttps://www.bigriver.jp/にリダイレクトされアクセスできることも確認できました。

なお、リダイレクトをESAで行っているのか、オリジンサーバ側で行っているかはログから見分けることが可能です。 Apache の access_log で”301″でgrep し、テストのアクセス時にログが出力されないことを確認します。

あとは ESA のTraffic Analytics画面から 時間を絞って、Edge(ESA)側のStatus Code で”301″を応答できているか、一方、”Origin Status Code”では “301”を応答しない状態になっているか、を確認可能です。 ただ、これはリクエスト一行一行で確認できているわけではないので最初に紹介した Apache の Access_log で確認したほうが明確だと思いました。

以上