AWS
S3
route53
CloudFront

AWSのみでサーバレスにURLリダイレクトする方法

よくあるケース

あるサイト aaa.domain.com をとあるサーバで稼働しているが、bbb.domain.com というドメインに変更して、サーバも別インスタンスに移したい。
しかも、URL構造が変わっているので、単純にドメインごと転送、とかではダメだったりする。

こんな時どうするか?

よくあるのは、aaa.domain.com が動いているサーバのApacheとかにリダイレクトの設定を書くとかですよね。
でも、インスタンスをずっと動かしつづけないといけない。

AWSで全部できます

できます。

route53でドメイン管理

まず、route53で、対象のドメインを管理するように設定します。
(もともと管理してあれば問題ないです。)
サブドメイン単位でもroute53で管理対象にできます。こちら参照。
最初は、既存のDNSレコード設定をそのままroute53でも作ってから、NSレコードをroute53に向けましょう。

Certificate Managerで証明書を作る

aaa.domain.com のSSL証明書を作ります。
https転送が不要であれば省略できますが、なるべくやっておきましょう。

S3バケットを作る

転送の主役となる、S3バケットを作りましょう。ただしファイルは一つも入れません。
バケット名は適当にして、設定はデフォルトでOK。
作成したら、プロパティで「Static website hosting」のオプションを開き、「このバケットを使用してウェブサイトをホストする」を選びます。
インデックスドキュメントは、index.htmlとか適当に書いておけばよいです。

また、この画面にでているエンドポイント(http://aaa-s3-backet.s3-website-ap-northeast-1.amazonaws.com みたいな形式)をメモっておきます。

CloudFrontを設定する

Distributionを作ります。ほとんどデフォルト設定でいいです。下記のみ設定します。

  • Origin Domain Nameに、S3を作ったときにメモった、エンドポイントを入れます。
  • Alternate Domain Names(CNAMEs)に、リダイレクト元のドメイン aaa.domain.com を入れます。
  • Custom SSL Certificate で、さっき作った証明書を指定します。うまくいけば、自動的に出てくるはずです。

作成完了すると、Distribution のエンドポイントが作られますので、メモっておきます。
Domain Name xxxxxxxxxxxxx.cloudfront.net
みたいなやつです。

S3で転送設定

S3に戻り、「リダイレクトルール」の欄にルールを入力します。こちらの資料が参考になるでしょう。
例えば下のようになります。

注意点

  • Condition の中身はAND条件になります。OR条件をつくりたいときには、別の RoutingRule を書きます。
  • Redirect には、 ReplaceKeyWith か ReplaceKeyPrefixWith のどちらかを必ず書きます。
    • ReplaceKeyWith は、そのパスそのものにリダイレクトします。つまりリダイレクト先は、"HostName/ReplaceKeyWith"になります。
    • ReplaceKeyPrefixWith は、KeyPrefixEquals を置き換えます。URLのKeyPrefixEquals 以降の文字列が保存されるイメージです。
    • ルールは上から実行されるようです。一番下には、Condition なし(すべてに合致)の RoutingRule を書くと良いでしょう。そうしないと、403になります。リダイレクト先のURL構造がリダイレクト元と正確に一致することはあんまりないと思いますので、この最後のruleでは ReplaceKeyWith でリダイレクト先を指定すると良いでしょう。そうするとリダイレクト先での404を防げます。

RoutingRules のサンプル

<RoutingRules>    
    <RoutingRule> <!-- /ccc/〜 を /ddd/ccc/ にリダイレクト -->
        <Condition>
            <KeyPrefixEquals>ccc/</KeyPrefixEquals>
        </Condition>
        <Redirect> 
            <HostName>bbb.domain.com</HostName>
            <ReplaceKeyWith>ddd/ccc/</ReplaceKeyWith>
        </Redirect>
    </RoutingRule>

    <RoutingRule> <!-- /eee/〜 を /fff/〜 にリダイレクト -->
        <Condition>
            <KeyPrefixEquals>eee/</KeyPrefixEquals>
        </Condition>
        <Redirect> 
            <HostName>bbb.domain.com</HostName>
            <ReplaceKeyPrefixWith>fff/</ReplaceKeyPrefixWith>
        </Redirect>
    </RoutingRule>

    <RoutingRule>
        <Redirect> <!-- 上のRulesに当てはまらない場合は、とにかく bbb.domain.com にリダイレクト -->
            <HostName>bbb.domain.com</HostName>
            <ReplaceKeyWith></ReplaceKeyWith>
        </Redirect>
    </RoutingRule>
</RoutingRules>

AレコードをCloudFrontへ向ける

route53で、aaa.domain.comのAレコードのエイリアスにCloudFrontのDistribution(xxxxxxxxxxxxx.cloudfront.net みたいなやつ)を指定します。

これで、完了です!
aaa.domain.com にアクセスして、301でbbb.domain.comにリダイレクトされることを確認しましょう。