CloudFrontのオリジンであるS3にないオブジェクトへのリクエストに403が返ってきます。
1 2 3 4 5 6 7 8 9 10 |
// S3に noobject というフォルダはない $ curl -I https://<CloudFrontのドメイン>/noobject HTTP/2 403 content-type: application/xml date: Sun, 30 Jul 2023 12:49:10 GMT server: AmazonS3 x-cache: Error from cloudfront via: 1.1 ×××××××××××××××.cloudfront.net (CloudFront) x-amz-cf-pop: ××××× x-amz-cf-id: ×××××××××××××××××××××××××××××× |
403 Forbiddenであり、
オブジェクトがないのに「権限で見れません」が返ってきているのに違和感があります。
なので、404 Not Found が返ってくるように設定していきます!
原因
![](https://hisuiblog.com/wp-content/uploads/cocoon-resources/blog-card-cache/b765efe1fdc46926047e181a1886f010.png)
オリジンを S3 とした CloudFront に対して、存在しないオブジェクトへアクセスした際の HTTP ステータスコードが 403 Forbidden になったときの対処方法 | DevelopersIO
オリジンを S3 とした CloudFront に対して、存在しないオブジェクトへアクセスした場合、デフォルトの設定では HTTP ステータスコード 403 Forbidden が返ります。こちらの事象に対して、HTTP ステータスコード 404 Not Found を返す方法をご紹介いたします。
↑の記事より、S3のバケットポリシーで許可している権限が足りていないことが原因。
s3:GetObject だけでなく、s3:ListBucket も必要だということ。
GetObjectだけだと、
オブジェクトがない → とってこれなかった(List ないのでオブジェクトの有無はわからん)
→ 404 Not Found ではなく、403 Forbidden 返しておくか
みたいな流れでエラーコードが返ってきているのでしょうか?
ドキュメントはなかったので、完全に憶測ですが。。。
設定
S3のバケットポリシーを定義している aws_iam_policy_document に追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
data "aws_iam_policy_document" "example" { # CloudFrontに対して GetObject , ListBucket を許可 statement { principals { type = "Service" identifiers = [ "cloudfront.amazonaws.com" ] } actions = [ "s3:GetObject", "s3:ListBucket" ] resources = [ "${aws_s3_bucket.example.arn}/*", "${aws_s3_bucket.example.arn}" ] condition { test = "StringEquals" variable = "aws:SourceArn" values = [ aws_cloudfront_distribution.example.arn ] } } } |
paln および apply をして、AWSへ反映させます。
動作確認
1 2 3 4 5 6 7 8 9 |
$ curl -I https://<CloudFrontのドメイン>/noobject HTTP/2 404 content-type: application/xml date: Sun, 30 Jul 2023 13:45:27 GMT server: AmazonS3 x-cache: Error from cloudfront via: 1.1 ×××××××××××××××.cloudfront.net (CloudFront) x-amz-cf-pop: ××××× x-amz-cf-id: ×××××××××××××××××××××××××××××× |
404返ってきてますねー、設定完了!!!
参考記事
![](https://hisuiblog.com/wp-content/uploads/cocoon-resources/blog-card-cache/b765efe1fdc46926047e181a1886f010.png)
オリジンを S3 とした CloudFront に対して、存在しないオブジェクトへアクセスした際の HTTP ステータスコードが 403 Forbidden になったときの対処方法 | DevelopersIO
オリジンを S3 とした CloudFront に対して、存在しないオブジェクトへアクセスした場合、デフォルトの設定では HTTP ステータスコード 403 Forbidden が返ります。こちらの事象に対して、HTTP ステータスコード 404 Not Found を返す方法をご紹介いたします。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZ0eHQ9Q2xvdWRGcm9udCVFMyU4MSVBNyVFMyU4MyU5NSVFMyU4MiVBMSVFMyU4MiVBNCVFMyU4MyVBQiVFMyU4MSU4QyVFMyU4MSVBQSVFMyU4MSU4NCVFMyU4MiVBOCVFMyU4MyVBOSVFMyU4MyVCQyVFMyU4MSVBRjQwNCVFMyU4MSVBQiVFMyU4MSU5NyVFMyU4MSVBNiVFMyU4MSVCQiVFMyU4MSU5NyVFMyU4MSU4NCVFMyU4MSVBRSVFMyU4MSVBQjQwMyVFMyU4MSVBNyVFOCVCRiU5NCVFMyU4MSVBMyVFMyU4MSVBNiVFMyU4MSU4RiVFMyU4MiU4Qi4uLiVFMyU4MSU5RCVFMyU4MiU4QyVFOCVBOCVBRCVFNSVBRSU5QSVFMyU4MSU4QyVFOCVCNiVCMyVFMyU4MiU4QSVFMyU4MSVBNiVFMyU4MSVBQSVFMyU4MSU4NCVFMyU4MSVBMCVFMyU4MSU5MSVFMyU4MSVBNyVFMyU4MSU5OSVFMyU4MiU4OCZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9OGY0MTdiMDBmNTVjYmYwYzYzZmNhZWMyZDAzN2UzNWQ&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwY2VsZXJvbjFnaHomdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTdkYzNhZDQxZjk0MmM3NmViYjE3NDQ1YmY1M2RiYTYz&blend-x=142&blend-y=491&blend-mode=normal&s=73beb2ce0365f5dc699f1d7dbe239623)
CloudFrontでファイルがないエラーは404にしてほしいのに403で返ってくる...それ設定が足りてないだけですよ - Qiita
タイトルの通り。
些細なことではあるけど長年の疑問だったのでメモ。
TL;DR
CloudFrontのOriginに使うS3のバケットポリシーに s3:ListBucket を加えましょう。
作業のログ
S3+CloudF...
Terraform Registry
コメント