S3のRedirection Rulesを利用してリダイレクトする

2014.03.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回からだいぶ経過しましたが、今回はS3のRedirection Rulesを利用してリダイレクトを行う方法について記述します。Redirection Rulesを利用するとパスやパラメータに関係なくS3バケットへのリクエストを特定のURLにリダイレクトすることができるようになります。

前回はS3のRedirect all requests to another host nameについて紹介しました。この機能はリクエストURLのパスやパラメータを引き継ぐため単純なドメインの移行をした際には有用です。例えばhttp://hoge.example.com/fuga?piyoへのアクセスはhttp://example.net/hoge/fuga?piyoへリダイレクトされます。

一方であるサイトへのあらゆるリクエストを特定のURLにリダイレクトしたいケースもあるかと思います。そのような場合に利用できるのがRedirection Rulesです。Redirection Rulesを利用するとパスやパラメータを除去してリダイレクトを行うことができます。例えばhttp://hoge.example.com/fuga?piyoというリクエストURLからパスとパラメータを除去してhttp://example.net/hoge/にリダイレクトすることができます。なお、今回はRedirection Rulesの紹介が目的であるためRoute 53は利用せずにStatic Website Hostingのドメインをそのまま利用します。そのため、実際にはhttp://hoge.example.com.s3-website-ap-northeast-1.amazonaws.com/fuga?piyoへのアクセスをhttp://example.net/hoge/にリダイレクトする設定方法について記述します。

Redirection Rulesを設定する

適当なS3バケットを用意して下さい。ここでは前回作成したhoge.example.comというバケットを利用します。次にバケットの[Properties]をクリックして[Static Website Hosting]を開き[Enable website hosting]を選択します。そして[Edit Redirection Rules:]に以下の内容を入力します。なお[Index Document:]は必須項目であるためindex.htmlと入力しています。 S3_Redirection_Rulesの設定 [Edit Redirection Rules:]に入力した内容は以下の通りです。http://example.net/hoge/にリダイレクトさせたいためHostNameタグにexample.netを、ReplaceKeyWithタグにhoge/を設定しています。

<RoutingRules>
    <RoutingRule>
        <Redirect>
            <HostName>example.net</HostName>
            <ReplaceKeyWith>hoge/</ReplaceKeyWith>
        </Redirect>
    </RoutingRule>
</RoutingRules>

では、実際にcurlコマンドでリダイレクトされるか確認します。

[~]$ curl -I hoge.example.com.s3-website-ap-northeast-1.amazonaws.com/fuga?piyo
HTTP/1.1 301 Moved Permanently
x-amz-id-2: HV7D9YvqX0A4I/ra7GKM8BuGgTtd1xxqODifuXi4M5edxsYarykCjXdx7xT4pOOG
x-amz-request-id: 6D5E788DBADE471C
Date: Wed, 05 Mar 2014 14:08:36 GMT
Location: http://example.net/hoge/
Content-Length: 0
Server: AmazonS3

Locationヘッダがhttp://example.net/hoge/になっていますね!

なお、Conditionタグを利用することでHTTPエラーコード毎にリダイレクトの設定を行うことも可能です。ここでは403エラーの場合にhttp://example.net/fuga/にリダイレクトする設定に変えてみます(hogeからfugaに変えています)。403としたのは現時点でこのS3バケットにcurlコマンドでアクセス可能なオブジェクトが存在しないためです。そのため、どんなパスでアクセスしても403エラーになります。

<RoutingRules>
    <RoutingRule>
        <Condition>
            <HttpErrorCodeReturnedEquals>403</HttpErrorCodeReturnedEquals>
        </Condition>
        <Redirect>
            <HostName>example.net</HostName>
            <ReplaceKeyWith>fuga/</ReplaceKeyWith>
        </Redirect>
    </RoutingRule>
</RoutingRules>

では、実際にcurlコマンドでリダイレクトされるか確認します。

[~]$ curl -I hoge.example.com.s3-website-ap-northeast-1.amazonaws.com/fuga?piyo
HTTP/1.1 301 Moved Permanently
x-amz-id-2: fpPepFKRDsLWdLPE07TjYza1WgbGdRmWb2yd0HseIG6R4fL78Tgm3Xku1zi1pSLp
x-amz-request-id: 5EF914C0CC402C97
Date: Wed, 05 Mar 2014 14:59:23 GMT
Location: http://example.net/fuga/
Content-Length: 0
Server: AmazonS3

Locationヘッダがhttp://example.net/fuga/になっていますね。

この他にもKeyPrefixEqualsタグとReplaceKeyPrefixWithタグを利用することで特定のパスへのリクエストをリダイレクトさせることが出来たりします。詳細は続編をご参照下さい。また、各タグの詳細は公式ドキュメントを参照して下さい。

まとめ

ということで今回はRedirection Rulesを利用したリダイレクト方法について紹介させていただきました。私自身は実案件でRedirection Rulesを何度か利用しているのですが、ほんと便利だと思います。もし使っていないようでしたら一度試してみてください。