【AWS】CloudFront、S3で”AccessDenied”と表示される理由

AWSでS3に静的コンテンツを置き、それをCloudFrontを経由して配信する構成、よくあると思います。ぼくも仕事で月に1回は同様の構成をCloudFormationで構築しています。

そして毎回、同じ表示に苦しめられます。

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>7F91C2D657A3B816</RequestId>
<HostId>
TsFf5WHTPoU6ddu6mSJ3EOWPjcxfLzzC/OQPYl2aDi8i1mHItmKdMqVR0y3Qa/WFcXatifPiGHE=
</HostId>
</Error>

AccessDenied・・・・。 アクセスが拒否されている。

S3のバケットポリシー? いやいや、でもS3にはCloudFrontからしかアクセスできないように設定してる、ってことはCloudFrontの設定?

あれ、よくみたらRoute53でドメインをaliasでCloudFront指定してるのにURLがS3のものにリダイレクトされている!

なんだこれ、わけわからんー!

となりがちなのですが、というか毎回なっていたのですが、これしばらく悩んでるといつの間にか解決してるんですよね。

これ、結局なんなのかというと、キャッシュで、作った当初のS3への307リダイレクトがキャッシュされてしまい、CloudFrontでinvalidationしても数分では解消せずに1〜2時間経ったらキャッシュが消えて解消するというパターンでした。何をやってもうまくいかずに、うーんと思っていたらいつの間には解消されているという。

解決方法は「1、2時間待つ」というなんじゃそれはという感じですが、よくあるハマりパターンの紹介でした。