30歳パパエンジニアのアウトプット帳

30歳に突入した1児のパパエンジニアのブログ

Cloudfront,S3で307リダイレクトに苦しめられた

完全に下記のヤツなんだけど見つけるまですごくハマった。。。

miyasakura.hatenablog.com


S3のcssファイルとかを直接参照するのではなくCloudfrontからのみ参照できる様にクラメソさんの下記の記事を見て色々設定を検証していたんだけど、なぜかcloudfrontのURLにアクセスしてもS3のURLにリダイレクトされてAccess Deniedになってしまって???となった。

dev.classmethod.jp


原因としては上記のURLを辿って行ったstackoverflowに書いてある。

amazon web services - AWS CloudFront returns http 307 when origin is S3 bucket - Stack Overflow

All buckets have at least two REST endpoint hostnames. In eu-west-1, they are example-bucket.s3-eu-west-1.amazonaws.com and example-bucket.s3.amazonaws.com. The first one will be immediately valid when the bucket is created. The second one -- sometimes referred to as the "global endpoint" -- which is the one CloudFront uses -- will not, unless the bucket is in us-east-1. Over a period of seconds to minutes, variable by location and other factors, it becomes globally accessible as well. Before that, the 307 redirect is returned. Hence, the bucket was not ready.


Cloudfrontは上記でいう2つ目のエンドポイントを利用するので、すぐには有効にならずCloudfrontがリダイレクト状態をキャッシュしてしまう。 (なので、時間をおいてCloudfrontでinvalidationをしてやればいいらしいが、これ数分とかでなく1時間とか2時間くらい必要な時もある。。。)


バージニアリージョンにバケットを作成するとこの事象は起きないので、特にリージョンを気にならないならバージニアに作った方が変にハマらなくていいと思う。

(その他のリージョンの場合も先にバケット作成して時間おいてからCloudfrontの設定すると発生しづらい?)

リクエストのリダイレクトと REST API - Amazon Simple Storage Service

米国東部 (バージニア北部) リージョン (s3.amazonaws.com エンドポイント) にバケットを作成した場合は、リダイレクトされません。このリージョンがデフォルトのエンドポイントであるためです。