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 が返ってくるように設定していきます!
原因
オリジンを 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返ってきてますねー、設定完了!!!
参考記事
オリジンを S3 とした CloudFront に対して、存在しないオブジェクトへアクセスした際の HTTP ステータスコードが 403 Forbidden になったときの対処方法 | DevelopersIO
オリジンを S3 とした CloudFront に対して、存在しないオブジェクトへアクセスした場合、デフォルトの設定では HTTP ステータスコード 403 Forbidden が返ります。こちらの事象に対して、HTTP ステータスコード 404 Not Found を返す方法をご紹介いたします。
CloudFrontでファイルがないエラーは404にしてほしいのに403で返ってくる...それ設定が足りてないだけですよ - Qiita
タイトルの通り。些細なことではあるけど長年の疑問だったのでメモ。TL;DRCloudFrontのOriginに使うS3のバケットポリシーに s3:ListBucket を加えましょう。作業の…
Terraform Registry
コメント