CloudFront – S3 オリジンの構成でリダイレクトさせる方法を教えてください

2021.03.27

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

困っていた内容

CloudFront - S3 オリジンの構成で、S3 のリダイレクト機能を使いたいです。S3 でリダイレクト設定をしたのですが、なぜか有効になりません。どのようにすればリダイレクトできるでしょうか?

# 不要なログは省略しています。
$ curl -LI https://<CloudFront を指すドメイン>
HTTP/1.1 301 Moved Permanently
Server: CloudFront
X-Cache: Redirect from cloudfront

HTTP/2 403 
server: AmazonS3
x-cache: Error from cloudfront

どう対応すればいいの?

CloudFront 経由で S3 静的ウェブサイトホスティングのバケットウェブサイトエンドポイントへアクセスするには、CloudFront コンソールの Origins and Origin Groups タブで、選択肢の候補が表示される S3 オリジンを指定するのではなく、直接 S3 静的ウェブサイトホスティングのオリジンを入力してください。

具体的には以下の指定をしてください。

S3 静的ウェブサイトホスティングの設定でリダイレクトできる Origin Domain Name 入力例

<S3 バケット名>.s3-website-ap-northeast-1.amazonaws.com

※ 先頭に http:// をつけても設定後に自動で省略されます。

上記の設定後、CloudFront 経由でも S3 静的ウェブサイトホスティングのリダイレクトが有効になります。

# 不要なログは省略しています。
$ curl -LI https://<CloudFront を指すドメイン>
HTTP/1.1 301 Moved Permanently
Server: CloudFront
X-Cache: Redirect from cloudfront

HTTP/1.1 301 Moved Permanently
Location: https://dev.classmethod.jp:443/

HTTP/2 200

仕組みについて

S3 のリダイレクト設定は S3 静的ウェブサイトホスティングの機能です。S3 のリダイレクトルールを設定している場合は、以下のようなルールを設定しているはずです。

S3 静的ウェブサイトホスティングのリダイレクトルール例

[
    {
        "Redirect": {
            "HostName": "dev.classmethod.jp"
        }
    }
]

このリダイレクトルールは、S3 静的ウェブサイトホスティングのバケットウェブサイトエンドポイントへアクセスした場合のみ有効です。オリジン設定の Origin Type の項目が S3 Origin となっている場合は使用できません。

静的ウェブサイトホスティングのオリジンを選択肢の候補以外から入力すると、Origin Type の項目が Custom Origin となります。カスタムオリジンであれば S3 静的ウェブサイトホスティングのバケットウェブサイトエンドポイントを直接指定できるので、リダイレクト機能が使えます。

バケットウェブサイトエンドポイントは S3 コンソールバケット詳細画面の「プロパティ」タブ、静的ウェブサイトホスティング欄で確認できます。

まとめ

CloudFront - S3 の構成で S3 静的ウェブサイトホスティング設定のリダイレクトルールが有効にならないといったケースでは、CloudFront コンソールの Origins and Origin Groups タブからオリジンの設定を変更し、Origin Type 列を Custom Origin としましょう。

今回の構成について

リダイレクトさせることだけが要件であれば、S3 静的ウェブサイトホスティングのみで完結できます。

また、リダイレクトするのであればキャッシュする必要もないはず(むしろキャッシュすることで問題が出そう)なので、S3 バケットウェブサイトエンドポイントの CloudFront を前段に置く意味がほとんどありません。オリジンアクセスアイデンティティ(OAI)も使えないので、S3 バケットウェブサイトエンドポイントへの直アクセスを防いで、CloudFront 経由のアクセスに限定することもできません。

しかしながら、リダイレクトさせる予定の URL を外部に公開していて HTTPS 化したいといった要件であれば今回紹介した構成が使えます。

参考資料