Locking down AWS S3 from inside a Kubernetes cluster is simple to do the wrong way. Wide-open IAM roles are fast to set up, but they create risk you cannot ignore. Granular, read-only access to S3 buckets is the safer path, and with the right configuration, pods can reach AWS without leaking power they do not need.
Start by creating an IAM policy that allows only the s3:GetObject action for the required bucket. Avoid s3:* or wildcard ARNs. Precision matters. Attach this policy to a role you will use exclusively for Kubernetes workloads that need S3 read access.
If you run on EKS, use IAM Roles for Service Accounts (IRSA). Create an OIDC identity provider for your cluster, then bind your IAM role to a Kubernetes service account. This ensures that only pods using this service account can assume that IAM role. No sidecar, no node-wide keys. Direct, scoped trust between AWS and Kubernetes.