The bucket was wide open, and anyone could walk in. That’s how most S3 misconfigurations start—fast, unnoticed, and dangerous. Privacy by default is the only defense that works every time. AWS S3 read-only roles are the simplest way to enforce it.
When you set S3 permissions, your first instinct may be to give developers and services broad access. That’s a mistake. A read-only IAM role restricts actions to GetObject, ListBucket, and related safe calls. No deletes, no overwrites, no accidental exposure. Tighter access control is not just security hygiene—it’s risk elimination.
AWS lets you define these roles through IAM policies. You attach the role to users, groups, or services. The policy explicitly grants read-only actions on specific buckets or prefixes. Combine this with S3 Block Public Access and bucket policies that deny any public ACLs. Now privacy by default is baked into the architecture.
Many teams skip this because policy creation feels tedious. It’s not. Start with the managed policy AmazonS3ReadOnlyAccess, then strip permissions you don’t need. Scope by Resource so the role can only read from the exact bucket paths required. Test using the AWS CLI: