ちょっと話題の記事

S3+CloudFrontでS3のURLにリダイレクトされてしまう場合の対処法

2020.03.05

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

大阪オフィスのYui(@MayForBlue)です。

S3+CloudFrontの構成で静的サイトを構築していてハマったところがあったので書き留めておきたいと思います。

CloudFrontのURLにアクセスしてもS3のURLにリダイレクトされる

S3+CloudFrontの構成で静的サイトをホスティングしたのですが、CloudFrontで指定したドメインにアクセスしてもS3のオブジェクト自体のURLにリダイレクトされてしまう現象になりました。(今回はS3をオリジンサーバに設定して構築しました。)

例えば

https://example.com/sample.html (CloudFrontで指定したドメイン)

にアクセスしても

https://example.s3.amazonaws.com/sample.html (S3のオブジェクトURL)

にリダイレクトされてしまう状態です。

色々調べていると公式に情報があったので紹介されている方法をやってみました。

Amazon S3 から HTTP 307 Temporary Redirect レスポンスが返るのはなぜですか?

Values That You Specify When You Create or Update a Distribution - Origin Settings - Origin Domain Name

Request Redirection and the REST API - Temporary Request Redirection

原因

  • S3バケットを作成後、バケット名がすべてのAWSリージョンに伝達されるまで最大24時間かかる
  • その間に同じリージョンにないリージョンのエンドポイントにリクエストすると「307 Temporary Redirect」レスポンスが返り、S3の場合はS3のデフォルトエンドポイント (s3.amazonaws.com) に転送され、そこから正しいオブジェクトURLに転送される

今回の場合

  • CloudFrontでオリジンドメイン名にS3を指定する場合、デフォルトの設定ではS3デフォルトエンドポイント (s3.amazonaws.com) になる
  • このエンドポイントはバージニア北部(us-east-1)リージョンにあるため、CloudFrontディストリビューションで指定したS3バケットのエンドポイントが東京リージョン(ap-northeast-1)の場合、24時間以内にアクセスするとリダイレクトが発生してS3のオブジェクトURLに転送される可能性がある

つまり以下の条件が重なるとこの現象になる可能性があるようです。

  • S3のバケットをバージニア北部(us-east-1)リージョン以外で作成
  • CloudFront経由でS3のバケット作成から24時間以内にアクセス

解決法

CloudFrontのオリジンドメイン名にリージョン名を追加する

CloudFrontディストリビューション作成時、デフォルトの選択肢ではs3.amazonaws.comになるのですが、リージョン名を指定して書き換えることで解決できました。 (例:s3-ap-northeast-1.amazonaws.com

デフォルト

今回の方法を使う

最後に

急ぎでない場合はデフォルトの状態で待って対応すればOKですが急ぎの場合はこういう方法もありますというご紹介でした。 この記事がどなたかのお役に立てば幸いです。

大阪オフィスのYui(@MayForBlue)でしたっ(`・ω・´)