CloudFrontをAmazon S3 オリジンサーバーからのリダイレクトでキャッシュさせない方法

自分の備忘録です。

#前提
CloudFrontを使用してS3に置いた静的コンテンツを配信している。
S3のStatic Website Hostingのリダイレクトルール利用して、エラーページをリダイレクトしている。

#背景
S3にファイルを置いたら、すぐにCloudFrontにコンテンツを認識させたいことはあると思います。しかし、S3のリダイレクトルールにHttpRedirectCodeを指定しないと、デフォルトでHTTP ステータスコード 301（Moved Permanently）と指定した場所を返します。

##HttpRedirectCodeを指定していないリダイレクトルールの例
```
<RoutingRules>
　<RoutingRule>
　　<Condition>
　　　<KeyPrefixEquals>img/</KeyPrefixEquals>
　　　<HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
　　</Condition>
　　<Redirect>
　　　<HostName>hoge.cloudfront.net</HostName>
　　　<ReplaceKeyWith>img/noimage.jpg</ReplaceKeyWith>
　　</Redirect>
　</RoutingRule>
</RoutingRules>
```

ファイルが存在しないキーで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を指定する例

```
<RoutingRules>
　<RoutingRule>
　　<Condition>
　　　<KeyPrefixEquals>img/</KeyPrefixEquals>
　　　<HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
　　</Condition>
　　　<Redirect>
　　　　<HostName>hoge.cloudfront.net</HostName>
　　　　<ReplaceKeyWith>img/noimage.jpg</ReplaceKeyWith>
　　　　<HttpRedirectCode>302</HttpRedirectCode>
　　　</Redirect>
　</RoutingRule>
</RoutingRules>
```

ファイルが存在しないキーで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を指定する例
```
<RoutingRules>
　<RoutingRule>
　　<Condition>
　　　<KeyPrefixEquals>img/</KeyPrefixEquals>
　　　<HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
　　</Condition>
　　<Redirect>
　　　<HostName>hoge.cloudfront.net</HostName>
　　　<ReplaceKeyWith>img/noimage.jpg</ReplaceKeyWith>
　　　<HttpRedirectCode>307</HttpRedirectCode>
　　</Redirect>
　</RoutingRule>
</RoutingRules>
```

ファイルが存在しないキーで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公式ドキュメントにも書いてなかったので仕様ですとしか今のところは言えないです。