S3のStatic WebSite Hostingでエラー時にリダイレクト
S3のStatic WebSite Hostingは静的ファイルをホストするにはとても便利な機能です。
S3のバケットにたいして、Static WebSite Hostingを有効にして、バケットポリシーで全公開するだけで、Webサーバなどを用意することなくサイトが公開出来ます。
S3のアクセスに対するキャパシティは非常に大きく、イベント告知やTV放映時の着地サイトなどに使うことで安く簡単に大量のトラフィックを受け止める事が可能になります。
このあたりのことは、よく書かれているのですが、実はもう1つ便利な機能があります。それは、特定の条件にマッチした時に、指定した条件でリダイレクトをさせるというものです。
特定のファイルに関しては、ファイルのプロパティでMetaタグとして、「Website Redirect Location」を設定し、リダイレクトするパスを設定します。
こちらはファイルが移動したときなどに便利ですが、実は更に細かい条件が指定できる機能があります。
それが、Static WebSite Hostingの設定画面で指定出来る、Redirection Rulesというものです。
こちらを設定しておくと、特定のエラーコードをトリガーとして指定した条件でリダイレクトを行うことが出来ます。
ドキュメント: Configure a Bucket for Website Hosting - Amazon Simple Storage Service
以下の例は、バケットポリシーのコンディションで特定のIPアドレスや条件の場合のみアクセス可能にしたバケットに、このようなポリシーを設定する事で、forbiddenが出た場合にexample.comに転送し、存在しないリソースにアクセスした場合もexample.comに転送します。こちらのRuleで設定すると、レスポンスコードは301になります。こちらも変更可能です。
<RoutingRules> <RoutingRule> <Condition> <HttpErrorCodeReturnedEquals>403</HttpErrorCodeReturnedEquals> </Condition> <Redirect> <HostName>example.com</HostName> <ReplaceKeyWith/> </Redirect> </RoutingRule> <RoutingRule> <Condition> <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals> </Condition> <Redirect> <HostName>example.com</HostName> <ReplaceKeyWith/> </Redirect> </RoutingRule> </RoutingRules>
ここでのポイントは
<ReplaceKeyWith/>
です。
こちらを指定しないと、リダイレクト時のパスは、リクエストがあったもの
- http://hoge.com/fuga.html -> (redirect) -> http://example.com/fuga.html
のようにパスが維持され、リダイレクト先でもNot Foundが出る可能性があります。
こちらの設定を入れることで、パスを全て消してリダイレクトすることが出来ます。
他の条件はドキュメントに記載されている通りですが、
<ReplaceKeyPrefixWith/>
を使うことでリダイレクト先で、Not Foundページをキャッチオールする箇所を用意することで、どのパスにアクセスがあったかを把握するといった使い方も出来ます。
ちなみに、全公開用のバケットポリシーは
{ "Version": "2008-10-17", "Id": "Policy1361774061719", "Statement": [ { "Sid": "Stmt1361774057125", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::event.example.com/*" } ] }
こんな感じです。
event.example.comは公開予定のバケット名を指定してください。
また、独自ドメインで公開したい場合は、そのドメイン名をバケット名にする必要があります。
他にも設定出来る項目(protocolやレスポンスコード)があるので、使える場面は多いと思います。
S3で静的サイトをホスティングする場合に使ってみると便利かもしれません。