プライベートなS3バケットにあるファイルをCloudFront経由でアクセスできるようにする
なにかの度にやることがあるけど、スッと設定できずに403エラーになるのでメモで残しておく
まず、下記にあるように静的ウェブサイトホスティングとは設定が異なるので見るページ間違えないこと
CloudFront ディストリビューションを使用して Amazon S3 バケットへのアクセスを制限する
Access Denied エラーをトラブルシューティングするには、ディストリビューションのオリジンドメイン名が S3 ウェブサイトのエンドポイントか S3 REST API エンドポイントかを確認してください。
今回は静的ウェブサイトホスティングはOFFの本当にプライベートなS3バケットにあるファイルをCloudFrontから配信できるようにしたいので、見るべきドキュメントはこっち。
CloudFront ディストリビューションを使用して Amazon S3 バケットへのアクセスを制限する
あとは大体CloudFrontのコンソールでポチポチ画面から設定しているとできるけど、すでにバケットポリシーとかあるとそれが邪魔することがある
6.バケットポリシーの中で、"Effect": "Deny" が含まれる (これにより、CloudFront OAI からバケットへのアクセスを禁止しています) ステートメントを探します。CloudFront OAI がバケット内のオブジェクトにアクセスできるように、これらのステートメントを変更します。
7.バケットポリシーの中で、"Effect": "Allow" が含まれる (これにより、CloudFront OAI 以外のソースからのバケットへのアクセスを許可しています) ステートメントを探します。ユースケースの必要に応じてこれらのステートメントを変更します。
自分は下記みたいなバケットポリシーになっていて、Sid:1の方を消したらCloudFront経由でアクセスできるようになった
{ "Version": "2012-10-17", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::YOUR-BUCKET-NAME/*" }, // CloudFrontのコンソールでやると足されるやつ { "Sid": "2", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity xxxxxxxxxxxxxx" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::YOUR-BUCKET-NAME/*" } ] }