For AWS S3 read-only roles, audit-ready access logs are not optional—they are your proof, your shield, and your history. The challenge isn’t just enabling logs, it’s making sure they’re complete, tamper-proof, and easy to trace to the exact request. If your compliance report takes days to prepare, you’re already behind.
An audit-ready access log strategy for S3 starts with the right configuration. Every access, even a GET on a public bucket, should generate a clear, timestamped record in S3 Server Access Logging or CloudTrail data events. The source IP, role ARN, and request details must be fully captured. Without this, you can’t prove who accessed what, or when.
For read-only roles, misconfigurations are common. Developers often grant broader permissions than intended, forgetting that IAM policies are evaluated in combination with bucket policies. A role with s3:GetObject on * can expose data from more buckets than you think. Tie this directly into your logging—scope logs to the exact buckets and prefix paths where reads are allowed, and store them in a dedicated, locked-down logging bucket with versioning enabled.
Retention matters. S3 access logs without lifecycle planning will either expire too soon or cost too much at scale. Define a retention period that meets your audit requirement—often at least 13 months—and transition older logs to Glacier Deep Archive, ensuring they’re still discoverable when needed.