How to8 min readOctober 9, 2026

S3 access points: give each team its own way into a shared bucket

An S3 access point is a named endpoint on a bucket with its own policy, so each team, app or partner gets a door scoped to its prefix instead of another statement in one crowded bucket policy. Here is how delegation works, a working policy pair, the limits, and when an access point is the wrong tool.

JeVaughn Ferguson
Founder, developer
The short version

An S3 access point is a named endpoint on one bucket with its own policy, so each team or application gets a door scoped to its prefix while the bucket policy shrinks to one delegation statement using s3:DataAccessPointAccount. Remember the /object/ segment in access point resource ARNs, that the VPC origin and Block Public Access settings are fixed at creation, and that access points can't be replication destinations. Use them when many parties share a bucket; for a few readers a bucket policy is simpler, and for people who need to see and share files rather than call APIs, put a workspace in front.

Most shared buckets end up with one bucket policy that tries to describe everyone: finance can read finance/, the payroll job can write payroll/, an auditor can list everything but read nothing. Every new team adds a statement, every statement can break another, and the whole document is capped at 20 KB.

S3 access points split that problem up. An access point is a named network endpoint attached to one bucket, with its own policy. Each team, application or partner gets its own access point, scoped to the prefix it needs, and the bucket policy shrinks to a single statement that hands control to them. Search interest is modest, around a fifth of the interest in aws s3 sync, but it comes from exactly the people who run a shared bucket for a business.

How an access point decides

A request through an access point has to be allowed by both the access point policy and the bucket policy, plus the caller's own IAM policy, and an explicit deny in any of them wins. That sounds like double the work, but the usual pattern makes the bucket policy a pass-through: it allows any action, as long as the request came through an access point owned by your account. From then on each access point policy is the real gate.

Access points also have their own Block Public Access settings, which are fixed when you create the access point. They don't support anonymous access at all, only accept HTTPS, and require Signature Version 4.

  • Access point policy, bucket policy and IAM policy must all allow.
  • An explicit deny anywhere wins.
  • Delegate from the bucket policy once, then manage each access point separately.

Example: a finance access point scoped to one prefix

The commands below create an access point called finance on a shared bucket, delegate the bucket to access points in the account, and give one IAM role read access to finance/ only. The ListBucket statement uses the access point ARN itself with an s3:prefix condition; the GetObject statement uses the access point ARN followed by /object/ and the key pattern. That /object/ segment is the part people most often get wrong.

ACCOUNT=111122223333
REGION=us-east-1
BUCKET=amzn-s3-demo-bucket

aws s3control create-access-point --account-id $ACCOUNT --name finance --bucket $BUCKET

cat > bucket-policy.json <<EOF
{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "DelegateToAccessPoints",
    "Effect": "Allow",
    "Principal": {"AWS": "*"},
    "Action": "*",
    "Resource": ["arn:aws:s3:::$BUCKET", "arn:aws:s3:::$BUCKET/*"],
    "Condition": {"StringEquals": {"s3:DataAccessPointAccount": "$ACCOUNT"}}
  }]
}
EOF
aws s3api put-bucket-policy --bucket $BUCKET --policy file://bucket-policy.json

AP=arn:aws:s3:$REGION:$ACCOUNT:accesspoint/finance
cat > ap-policy.json <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::$ACCOUNT:role/FinanceTeam"},
      "Action": "s3:ListBucket",
      "Resource": "$AP",
      "Condition": {"StringLike": {"s3:prefix": ["finance/*"]}}
    },
    {
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::$ACCOUNT:role/FinanceTeam"},
      "Action": "s3:GetObject",
      "Resource": "$AP/object/finance/*"
    }
  ]
}
EOF
aws s3control put-access-point-policy --account-id $ACCOUNT --name finance --policy file://ap-policy.json

aws s3 ls s3://$AP/finance/

Addressing an access point

Tools that accept an S3 ARN can use the access point ARN wherever they would use a bucket name, as in the aws s3 ls line above. For tools that only accept bucket names, every access point also gets an alias that ends in -s3alias, which you can use in place of the bucket name for object operations. You'll find it in the console or in get-access-point output.

Access points are reached only through virtual-hosted-style URLs, and the S3 console can't use an alias as the source or destination of a Move.

  • ARN: works with the AWS CLI and SDKs.
  • Alias ending -s3alias: works where only a bucket name is accepted.
  • Virtual-hosted-style addressing only.

VPC-only access points

When you create an access point you can set its network origin to a VPC. Requests through it are then accepted only from that VPC, which is a clean way to give a backend job access to a bucket that nobody can reach through the same door from a laptop. Pair it with a VPC endpoint policy if you also want to restrict which buckets the VPC can reach.

The network origin is fixed. You can't turn an internet access point into a VPC one, or move it to a different VPC; you delete it and create another, and you can reuse the name.

  • Network origin: Internet or one VPC, chosen at creation.
  • Can't be changed later; delete and recreate.

Limits and settings you can't change

An account can create 10,000 access points per Region, and you can request more. Each access point policy is limited to 20 KB. An access point is attached to exactly one bucket for life, and its VPC configuration and Block Public Access settings can't be changed after creation.

A few operations don't work through access points. An access point can't be a destination for S3 Replication, and the API calls that manage access points themselves, such as PutAccessPoint and GetAccessPointPolicy, don't work across accounts. Names are 3 to 50 lowercase characters, unique per account and Region, and are published in DNS, so keep customer names and project code names out of them.

  • 10,000 per account per Region, raisable.
  • 20 KB per access point policy.
  • One bucket per access point, forever.
  • Not a replication destination.
  • Names are visible in DNS.

When an access point is the wrong tool

Access points solve "who can reach which prefix through which door". They don't give anyone a way to look at the files. A finance analyst with an IAM role scoped to the finance access point still needs the CLI, an SDK, or the AWS console to see a list of files, and none of those preview a PDF or let them share one with an auditor for a week.

If the bucket has two or three readers, a few prefix-scoped statements in the bucket policy are easier to read than three access points. And for one-off access to a single file, a presigned URL is simpler than any policy.

  • Many teams, apps or partners on one bucket: access points.
  • Two or three readers: prefix statements in the bucket policy.
  • One file, short-lived: a presigned URL.

Where BucketDesk fits

BucketDesk works one layer up. You connect a bucket through a CloudFormation role in your account, approve the buckets and prefixes the workspace may see, and people browse, preview, share and upload in a browser without an IAM user or the console. Every action runs with temporary credentials from that role, so the role's policy, your bucket policy and any access point policy you add still decide what's possible. Access points keep each application's door narrow; BucketDesk gives the people a usable room behind theirs.

On the Ultra plan, Document AI lets someone ask an open document a question and get an answer with a page citation, using a Bedrock model in your own account, so the same prefix scoping limits which files it can read.

Try it in BucketDesk

Minimum is free. Deploy a scoped role with CloudFormation, sign in, and browse, without handing anyone an access key.

Connect a bucket

Primary sources

Discussion

0 comments · open to guests · moderated
Comments appear after a quick review.

Liked this? Get the next article by email. No schedule, no filler, one click to leave.

Keep reading

All writing →
Product decisions9 min

Amazon Quick Suite for documents in S3: what it indexes, what it costs, and when you don't need it

AWS now sells Amazon Quick Suite instead of Amazon Q Business. If you want it to answer questions about files in your bucket, here is what you sign up for and what it costs.Quick Suite tiers and the $250 infrastructure fee, pooled index GB and $5/GB overage, the Enterprise prerequisite for S3 knowledge bases, same-Region and ACL-at-creation constraints, 500 MB file and 30 MB extracted-text limits, daily sync, and the per-document alternative.

Operations9 min

Amazon S3 storage classes: which one for which business file

Every file in S3 sits in a storage class that decides what it costs and how fast it opens. Here is which class fits which kind of file, in plain terms.Class codes, the two deciding questions, a per-file-type map, --storage-class on upload, copy-in-place to change class, a waterfall lifecycle rule with ObjectSizeGreaterThan, the 128 KB default, the 94-day ordering rule, and why reads keep Intelligent-Tiering objects warm.

How to8 min

How to reduce Amazon S3 costs: the three settings that cut most bills

The S3 bill is usually high for three boring reasons. Each one is a setting on the bucket, and each one can be checked and fixed without touching a file.NoncurrentVersionExpiration with NewerNoncurrentVersions, AbortIncompleteMultipartUpload, Intelligent-Tiering with optional archive tiers, the 128 KB rule, worked numbers at us-east-1 list prices, and how to read Cost Explorer by usage type.