概要
ALB のアクセスログや VPC フローログを S3 に送信するように設定した場合、CloudTrail や S3 アクセスログに AccessDenied エラーが定期的に記録されることがあります。
本記事では、AWSサービスからのS3ログ記録を有効化した際に発生する、AccessDenied エラーの原因と対処方法について紹介します。
背景
ALB のアクセスログや VPC フローログを S3 に送信するように設定し、格納先 S3 バケットのメトリクスを確認したところ、4xx Errorsが定期的に出力されていることに気がついた、というお問い合わせがありました。
S3 のアクセスログを確認したところ、AccessDenied エラーが記録されているといった状況でした。
[02/Jul/2025:09:34:11 +0000] - svc:delivery.logs.amazonaws.com VF88558PERXV4B3G REST.HEAD.BUCKET - "HEAD / HTTP/1.1" 403 AccessDenied 275 - 17 - "-" "-" -
原因
ログ格納先 S3 のバケットポリシーで、S3 バケットにログを書き込む内部的なサービスプリンシパル(delivery.logs.amazonaws.com)のアクセス権限(s3:ListBucket)が不足していることが原因です。ALB のアクセスログやVPC フローログなど、サービスのログを S3 に配信する場合、delivery.logs.amazonaws.com よりログ配信が行われます。
バケットポリシーがなく、ログ記録を設定するユーザーがバケットの S3:GetBucketPolicyおよび S3:PutBucketPolicy 許可を持っている場合、S3 へのログの送信を開始するとポリシーが自動的に作成されます。
残念ながら、この自動で作成されるポリシーについても、delivery.logs.amazonaws.com の s3:ListBucket を明示的に許可する設定にはなっていません。
そのため、デフォルトの設定で構築を進めると AccessDenied エラーが発生します。
対処方法
バケットポリシーの AWSLogDeliveryAclCheck ブロックで Action に s3:ListBucket の許可を追加することで対処することができます。
変更前のバケットポリシーは以下のようになっているかと思います。
「AWSLogDeliveryAclCheck」というキーワードで探します。
"Sid": "AWSLogDeliveryAclCheck",
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
Action に s3:ListBucket を追加します。
Action が複数になるため、配列[]で記載することに注意してください。
"Sid": "AWSLogDeliveryAclCheck1",
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": [
"s3:GetBucketAcl",
"s3:ListBucket"
],
バケットポリシーの変更を保存した後、格納先S3バケットのメトリクスを確認します。
変更前(10:15以前)は 4xx Errors が定期的に1~3程度カウントされていましたが、変更後(10:15以降)はカウントが0になっています。
最後に
ユーザガイドの説明では、 CloudTrail ログに AccessDenied エラーが記録される場合の対処として記載されているため、別の話かと思ってしまいますが S3 アクセスログの場合でもあてはまる内容でした。
s3:ListBucket の許可が必要だとしても、自動で作成されるポリシーなら最初から許可しておいていただきたいですね...。