Amazon S3 でリダイレクトを扱う

Amazon S3
81件のシェア(ちょっぴり話題の記事)

こんにちは、藤本です。

先日、サイト、Webサーバを廃止する際に、別サイトとの関連で一部残ってしまう URL があり、それをリダイレクトでどうにかできないかという要件がありました。S3 のリダイレクト機能でどうにかできそうだったので改めて S3 のリダイレクト機能の情報をまとめてみました。

Amazon S3 におけるリダイレクト機能

Amazon S3 は静的ウェブホスティングで Web サーバのように静的コンテンツ(HTML、Javascript、画像/映像など)を HTTP でやり取りすることができます。静的コンテンツの配信だけではなく、Web サーバが持つインデックスドキュメント、カスタムエラードキュメント、リダイレクトといった機能も持ち合わせています。今回はリダイレクト機能についてまとめてみました。リダイレクト機能は S3 静的ウェブホスティングのリダイレクションルール、ウェブページリダイレクトの 2種類の設定により実現することができます。

リダイレクションルールによる設定

リダイレクションルールは S3 バケット単位の設定となり、XML 形式でルールを定義します。単純にバケットにアクセスした場合に指定した URL へリダイレクトすることも可能ですし、特定パス配下へアクセスした場合にパスを残しつつリダイレクトすることも可能ですし、ステータスコードによって任意のページへリダイレクトすることも可能です。とにかく設定の柔軟性が高いです。

またリダイレクションルールは過去に弊社ブログでもご紹介しています。詳細は下記エントリをご参照ください。

ウェブページリダイレクトによる設定

一方、ウェブページリダイレクトは S3 オブジェクト単位の設定となり、オブジェクト毎にリダイレクト先を設定します。S3 オブジェクトのメタデータにWebsite-Redirect-Locationキーでリダイレクト先を指定します。オブジェクトへアクセスすると、301 でリダイレクトが返ります。オブジェクト自体はブランクで問題ありません。

比較

簡単に上記 2つの設定の違いまとめです。

項目 リダイレクションルール ウェブページリダイレクト
設定単位 S3 バケット オブジェクト
設定方法 XML 形式 オブジェクトメタデータ
リダイレクト適用単位 パスプレフィックス パス(オブジェクト)
ステータスコード 指定可 301
両方に該当するアクセス時の優先度 1 2

試してみた

それでは早速設定して動作を試してみましょう。

静的ウェブホスティングを有効化する

まずはリダイレクト機能は S3 の静的ウェブホスティングの機能となりますので、S3 バケットの静的ウェブホスティング機能を有効化します。

マネジメントコンソールにログインし、S3 の画面から静的ウェブホスティングを有効化するバケットを選択します。

Properties から Static website hosting を選択します。現在は無効状態ですので、ステータスに Disabled が表示されています。

S3_Management_Console

「Use this bucket to host a website」を選択し、Index document を設定します。今回は index.html で設定します。URL がフォルダへのアクセス時にフォルダの中の index.html を返す、という設定です。「Save」ボタンをクリックします。

S3_Management_Console 2

ステータスが Bucket hosting になりました。

S3_Management_Console 3

これで静的ウェブホスティングの有効化が完了です。

リダイレクションルールによる設定

まずはリダイレクションルールを使って設定・動作を確認してみましょう。リダイレクションルールは先ほどの静的ウェブホスティング有効化画面の Redirection rules に XML 形式で設定します。

S3_Management_Console 4

今回は S3 バケットのどのパスにアクセスしても Developers.IO にアクセスするルールを記載します。

<RoutingRules>
    <RoutingRule>
        <Redirect> 
            <HostName>dev.classmethod.jp</HostName>
            <ReplaceKeyWith></ReplaceKeyWith>
        </Redirect>
    </RoutingRule>
</RoutingRules>

上記ルールを設定し、アクセスしてみます。

$ curl -I http://fujimotoshinji.s3-website-ap-northeast-1.amazonaws.com/
HTTP/1.1 301 Moved Permanently
x-amz-id-2: VS6V3T1YG1fdCdwb2bCUiyM81SbchvF7QzLaxTEwTJwTYapEzY/wEzBkN+dFnDdkeMi37dATurI=
x-amz-request-id: 1E6CA470CDB6EB70
Date: Sun, 09 Apr 2017 01:14:59 GMT
Location: http://dev.classmethod.jp/
Content-Length: 0
Server: AmazonS3

301 で http://dev.classmethod.jp/ へのリダイレクトが返っています。もちろんウェブブラウザからアクセスすると、Developers.IO のトップページが表示されました。

screenshot 2017-04-09 10.18.41

リダイレクションルールは過去エントリをご参照ください。

ウェブページリダイレクト

次はウェブページリダイレクトです。ウェブページリダイレクトよりもリダイレクションルールの設定が優先されることはご留意ください。先ほど作成したリダイレクションルールの設定は削除しておきます。

ウェブページリダイレクトの設定はオブジェクトを作成し、オブジェクトのメタデータ(Website-Redirect-Location)でリダイレクト先を指定します。今回は fujimotoshinji というオブジェクトへアクセスすると、私のブログページへリダイレクトする設定を行います。それではやってみましょう。

ファイルをアップロードします。ファイルの中身は関係ないので空で大丈夫です。

$ touch fujimotoshinji

S3_Management_Console 5

アップロードしたオブジェクトを選択します。

S3_Management_Console 7

Propertes タブを選択し、Metadata を展開し、+ Add Metadata をクリックします。Key は選択式となっていて、Website-Redirect-Location を選択します。Value はリダイレクト先の URL を指定します。「Save」ボタンをクリックします。

S3_Management_Console_8

これで設定は完了です。アクセスしてみます。

$ curl -I http://fujimotoshinji.s3-website-ap-northeast-1.amazonaws.com/fujimotoshinji
HTTP/1.1 301 Moved Permanently
x-amz-id-2: n8JPgyqiy4rNwvfqr0nXcQCL6dPQCMilkoAiqpq+3ydltoVulkK6Iyv+UJ5ddzHifX0qc0ajRi4=
x-amz-request-id: 68C7A3D72C7DDC49
Date: Sun, 09 Apr 2017 01:54:30 GMT
Location: http://dev.classmethod.jp/author/fujimoto-shinji/
Content-Length: 0
Server: AmazonS3

設定した URL へのリダイレクトが返ってきました。

AWS CLI によるウェブページリダイレクトの設定

リダイレクト設定がたくさんある場合、ファイル作成したり、リダイレクトのメタデータを設定するのが非常に大変です。AWS CLI でも簡単に設定できますので記載しておきます。

下記コマンドで上記マネジメントコンソールから設定したものと同じ設定ができます。簡単ですね。

$ aws s3api put-object --bucket fujimotoshinji --key fujimotoshinji --website-redirect-location "http://dev.classmethod.jp/author/fujimoto-shinji/"

まとめ

いかがでしたでしょうか? リダイレクションルールは知っていたのですが、ウェブページリダイレクトは今回調べていて初めて知りました。リダイレクションルールの柔軟性、ウェブページリダイレクトの管理のし易さで多くのリダイレクト要件は実現できるのではないでしょうか。強いて言うならウェブページリダイレクトでもステータスコードを指定できるようにして欲しいです。