kk-access-point containing a single object, beach.jpg. We’ll create two access points — developers and finance — and delegate control from the bucket to those access points so each team can access the bucket through its own endpoint and policy.

- An S3 bucket (
kk-access-point) with a test objectbeach.jpg. - Three IAM users in the same account:
user1(bucket owner / creator),user2, anduser3. - AWS CLI or CloudShell for testing. See links at the end for docs.
- As the bucket owner (user1) you can access
beach.jpg. - Other users in the same account (user2 and user3) have no access initially; attempts result in 403 Forbidden.
- Provide scoped access for user2 and user3 without maintaining many per-user bucket policies.
- Use S3 Access Points: each team accesses the same bucket via a different access point endpoint and policy.
- Create two access points for the bucket:
developersandfinance. - Access points can be restricted to a VPC or be internet-accessible. For this demo they are internet-accessible.

- Copy access point policies into the bucket policy (cumbersome and error-prone).
- Recommended: add a bucket policy that delegates acceptance of access point requests that originate from access points owned by the bucket owner’s account.
123456789012. Replace with your account ID and bucket name:
/object/ segment after the access point name.
-
Access point ARN (bucket-level actions, e.g., list):
arn:aws:s3:us-east-1:123456789012:accesspoint/developers -
Access point object ARN (object-level actions, e.g., get/put):
arn:aws:s3:us-east-1:123456789012:accesspoint/developers/object/*
Always include the
/object/ segment in an access point ARN when specifying object-level resources in policies (for example: ...:accesspoint/<name>/object/<prefix>/*). Forgetting /object/ is a common cause of permission errors.user2 list, get, and put via the developers access point. Update region, account ID, access point name, and principal as appropriate:
- Use the
/object/*resource for object-level actions likes3:GetObjectands3:PutObject. - Use the access point resource without
/object/for bucket-level actions likes3:ListBucket. - Resource-based policies cannot reference IAM groups as principals. To grant a group of users access, use an IAM role (and let users assume it) or attach identity-based policies to the users.
s3://arn:aws:s3:...:accesspoint/<name>.
Examples (replace the ARN components with your region/account/access point):
s3:// prefix; omitting it or passing a bare ARN will be rejected by the CLI.
Repeat for finance access point
Create an access point policy for finance and grant user3 equivalent (or different) permissions via the finance access point.
Example finance access point policy:
user3:

- user2 accesses the bucket using the
developersaccess point ARN and thedeveloperspolicy applies. - user3 accesses the bucket using the
financeaccess point ARN and thefinancepolicy applies. - The bucket policy delegates acceptance of access-point-routed requests to access points owned by the bucket owner’s account (via
s3:DataAccessPointAccount).
Troubleshooting tips
- If you see 403 Forbidden when using an access point:
- Confirm the bucket policy includes the
s3:DataAccessPointAccountcondition allowing access point requests from the account. - Ensure access point policies include both the access point ARN and the access point object ARN for the required actions.
- Verify you used the
s3://scheme for CLI calls to access point URIs. - Double-check the
/object/segment in any object-level ARN.
- Confirm the bucket policy includes the
- S3 Access Points let you provide per-team scoped access to a shared bucket endpoint, simplifying permission management.
- Delegate acceptance of access-point-routed requests in the bucket policy using
s3:DataAccessPointAccount. - Include both the access point ARN and the access point object ARN (with
/object/) when defining access point policies to allow list and object actions.