AWS S3でcatch-all redirectサイトを作る

キャンペーン終了したりして、ドメイン丸ごと別サイトにリダイレクトしたい場合など。
要は、S3のBucketに何もファイルがないと、常にアクセスが404エラーになるので、404エラーのリダイレクト先として別サイトを指定すると、結果として全てのアクセスがリダイレクトされるということです。

1. リダイレクトしたいドメイン名でBucketを作る(例:example.jp)

Bucketの中には何もファイルを置かなくて良い。

2. 誰でもアクセスできるようにbucket policyを設定する

BucketのPropertiesを開いて、Permissions → Edit bucket policyで設定できる。以下のようなbucket policyで、誰でもs3:GetObjectできるように。
"Resource": "arn:aws:s3:::example.jp/*" の部分は、適宜対象ドメイン名で置換する。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "PublicReadForGetBucketObjects",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::example.jp/*" ← example.jpは対象ドメイン名で置き換える
		}
	]
}
3. Static Website Hostingを設定する

BucketのPropertiesを開いて、Static Website Hostingを設定する。

  • Enable website hostingをチェック
  • Index Documentには"index.html"を記入
  • Edit Redirection Rulesで、以下のXMLを設定
<RoutingRules>
    <RoutingRule>
        <Condition>
            <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
        </Condition>
        <Redirect>
            <HostName>www.example.co.jp</HostName> ← リダイレクト先のホスト名
            <ReplaceKeyWith/>
            <HttpRedirectCode>301</HttpRedirectCode>
        </Redirect>
    </RoutingRule>
</RoutingRules>
4. リダイレクトしたいドメインの参照先にS3 Bucketを指定する

Route53ならAliasでTargetにS3 Bucketを指定する。Route53で管理してない場合は、S3エンドポイントのアドレスを書いておくとかでしょうか(後日変わるリスクはありますが)。