自分の備忘録です。
前提
CloudFrontを使用してS3に置いた静的コンテンツを配信している。
S3のStatic Website Hostingのリダイレクトルール利用して、エラーページをリダイレクトしている。
背景
S3にファイルを置いたら、すぐにCloudFrontにコンテンツを認識させたいことはあると思います。しかし、S3のリダイレクトルールにHttpRedirectCodeを指定しないと、デフォルトでHTTP ステータスコード 301(Moved Permanently)と指定した場所を返します。
HttpRedirectCodeを指定していないリダイレクトルールの例
img/ 404 hoge.cloudfront.net img/noimage.jpg
ファイルが存在しないキーでCloudFrontにアクセスする
$ curl --head https://hoge.cloudfront.net/img/test.jpg HTTP/1.1 301 Moved Permanently Content-Length: 0 Connection: keep-alive Date: Thu, 04 Jun 2015 09:02:25 GMT Location: http://hoge.cloudfront.net/img/noimage.jpg Server: AmazonS3 X-Cache: Miss from cloudfront Via: 1.1 12285e5ad6fed2a0cc471839c1256889.cloudfront.net (CloudFront) X-Amz-Cf-Id: d5Z2Lll9MnxfCzCWtY-XFm-0qO6AgiZZocBWXT9-yaEL8M8Zu4fg2A==
ファイルを存在させて、CloudFrontにアクセスする→キャッシュされていて同じ結果が返ってくる
$ curl --head https://hoge.cloudfront.net/img/test.jpg HTTP/1.1 301 Moved Permanently Content-Length: 0 Connection: keep-alive Date: Thu, 04 Jun 2015 09:02:25 GMT Location: http://hoge.cloudfront.net/img/noimage.jpg Server: AmazonS3 Age: 102 X-Cache: Hit from cloudfront Via: 1.1 540169fbd024335b4f1fff3013176148.cloudfront.net (CloudFront) X-Amz-Cf-Id: E2zLaK-UTQ1EPuX4vhDc4GWamaSXpNmILibJhbS-H9g5ibrDsZgMGg==
上記のリダイレクトルールだと、CloudFrontにすぐに認識させることはできない。CloudFrontがリダイレクトのステータスコードと場所をキャッシュし、ビューアに値を返してしまう。HttpRedirectCode 302(Moved Temporarily)の指定でいけるかと思いましたがだめみたいです。307(Temporary Redirect)を指定するとCloudFrontにリダイレクトのステータスコードがキャッシュされないのでCloudFrontですぐに認識してくれます。
HttpRedirectCode 302を指定する例
img/ 404 hoge.cloudfront.net img/noimage.jpg 302
ファイルが存在しないキーでCloudFrontにアクセスする
$ curl --head https://hoge.cloudfront.net/img/test.jpg HTTP/1.1 302 Moved Temporarily Content-Length: 0 Connection: keep-alive Date: Thu, 04 Jun 2015 09:27:07 GMT Location: http://hoge.cloudfront.net/img/noimage.jpg Server: AmazonS3 X-Cache: Miss from cloudfront Via: 1.1 4a0e5a774647d45df2730ca2d10b4249.cloudfront.net (CloudFront) X-Amz-Cf-Id: wo3kwUXxAP_1MSnHAUpBavkgbIdveoYCZnRlnNES6q1TULGCryenXw==
ファイルを存在させて、CloudFrontにアクセスする→キャッシュされていて同じ結果が返ってくる
$ curl --head https://hoge.cloudfront.net/img/test.jpg HTTP/1.1 302 Moved Temporarily Content-Length: 0 Connection: keep-alive Date: Thu, 04 Jun 2015 09:27:07 GMT Location: http://hoge.cloudfront.net/img/noimage.jpg Server: AmazonS3 Age: 134 X-Cache: Hit from cloudfront Via: 1.1 5ecad382c420f09d77eebed763ba3185.cloudfront.net (CloudFront) X-Amz-Cf-Id: 86F6rCH8fusMgeMS6dgpe8jbHTf9DAU9bvy2eHhdfXRg5GlKiJ-cTQ==
HttpRedirectCode 307を指定する例
img/ 404 hoge.cloudfront.net img/noimage.jpg 307
ファイルが存在しないキーでCloudFrontにアクセスする
$ curl --head https://hoge.cloudfront.net/img/test.jpg HTTP/1.1 307 Temporary Redirect Content-Length: 0 Connection: keep-alive Date: Thu, 04 Jun 2015 09:13:27 GMT Location: http://hoge.cloudfront.net/img/noimage.jpg Server: AmazonS3 X-Cache: Miss from cloudfront Via: 1.1 5eb290b05a7b56804ffa4748b8398205.cloudfront.net (CloudFront) X-Amz-Cf-Id: YJJecktoYDyzsK9P5auZ6l92pCVrxF3QThk6AlRGMtUWYIxDlxZ46Q==
ファイルを存在させてCloudFrontにアクセスする→すぐにHTTP200に切り替わる
$ curl --head https://hoge.cloudfront.net/img/test.jpg HTTP/1.1 200 OK Content-Type: image/jpeg Content-Length: 29770 Connection: keep-alive Date: Thu, 04 Jun 2015 09:15:41 GMT Last-Modified: Thu, 04 Jun 2015 09:15:36 GMT ETag: "c43c78109b70261b69bf9bf5fa1fa07a" Server: AmazonS3 X-Cache: Miss from cloudfront Via: 1.1 7b2ef00e369c90e0dc52d771ab6c8d6c.cloudfront.net (CloudFront) X-Amz-Cf-Id: uqBKkrgb8Y3opuiuxiP_ANErAyEUoTgvjnTh4UHPN_CbFlchE1z-nA==
なぜHTTPステータスコードが302(Moved Temporarily)でだめで、307(Temporary Redirect)だといけるかは小生の頭脳にはわかりませんが・・・・AWS公式ドキュメントにも書いてなかったので仕様ですとしか今のところは言えないです。