Object storage · Amazon S3

Amazon S3 in practice

Deep diveAbout 5 minutesAmazon S3 AI-generated

Amazon S3 is the concrete object service used throughout this collection. Its general-purpose buckets store named objects through an API, with policies controlling access and optional features such as versioning and replication. That is the starting point for the photographs and exports in our examples.

S3 now also has specialised resource types. Choosing one changes the available operations and guarantees, not merely the speed of an otherwise identical bucket. Start with the workload’s required interface, then choose the resource and test the complete operation it must support.

A bucket, a Region and a client

A bucket is a container and management boundary for objects. Its Region affects placement, network distance, available features and data-transfer routes. An application sends requests to the appropriate endpoint using an SDK, command-line client or signed HTTP requests. A bucket name and object key identify the target; credentials and policies determine whether the caller may perform the operation.

For this collection, begin with a private general-purpose bucket and a role scoped to the required objects. Check the actual bucket’s ownership, public-access and encryption settings rather than assume an older bucket matches new defaults. Keep production configuration separate from a disposable learning bucket.

The real-S3 practice guide names the client environment and follows a conditional write and version recovery in a reader-owned bucket. The browser sandbox needs no account, but executes a model rather than AWS requests. These two environments answer different questions.

Choose the resource from the operation

Placement matters alongside the interface. An Availability Zone is a location within an AWS Region containing one or more data centres; a Region contains multiple zones.

ResourceCentral jobA consequence to check
General-purpose bucketStore and retrieve ordinary objectsVersioning, policies and storage-class choices must fit the application
Directory bucket with S3 Express One ZoneLow-latency object access colocated with compute in an Availability ZoneSingle-zone placement and a different feature set
Table bucketManaged Iceberg tablesQuery-engine and format compatibility, catalog permissions and maintenance
Vector bucketManaged vector records and similarity queriesIndex mode, dimensions, filtering and source synchronization

The S3 resource overview describes these types. Table and vector buckets have dedicated APIs; ordinary object commands do not become SQL or nearest-neighbour queries merely by changing the destination name.

A typical asset service can start with general-purpose buckets because it needs durable named bytes, version history and ordinary delivery integrations. An analytical job repeatedly reading temporary working data close to its compute may have a different latency and placement tradeoff. Evaluate that particular job before moving the asset service to the same resource.

Directory buckets change the contract

S3 Express One Zone stores data within one Availability Zone. It can reduce access latency for suitably colocated workloads, but its failure boundary differs from a multi-zone storage class. Directory buckets also support other specialised placement cases; avoid treating the bucket type and Express storage class as synonyms in every configuration.

The collection’s ordinary bucket lessons cannot all be transferred unchanged. Directory listing does not promise lexical ordering. These buckets do not support S3 Versioning, Object Lock, S3 Replication, S3 Event Notifications or object tags, as checked on 16 October 2026. Data and management endpoints and session authorization also differ. The directory-bucket differences are the compatibility checklist for an actual migration.

Two features show why resource scope matters. Express One Zone supports appending bytes to an existing object with an offset matching its current size. This differs from uploading invisible multipart parts and then completing a new object. A reader can consume an object as it grows. The client must still reconcile an uncertain append outcome before deciding which offset to use next. See append operations.

Express One Zone also supports atomic rename within the same directory bucket without copying the object’s bytes. Source and destination conditions control conflicts, and a client token supports idempotent retries.

Suppose a worker renames working/export.csv to ready/export.csv, requires the destination to be absent, and loses the response. Repeating the same request with the same client token can report success without renaming again. Changing the destination while reusing that token is a parameter mismatch; it is a different operation and needs a new token. This contract covers one object within the bucket; it does not provide a transaction renaming a whole directory tree. The RenameObject contract describes the boundary.

Directory buckets do support lifecycle expiry and incomplete multipart cleanup, although they do not support transitions between storage classes. The directory lifecycle guide also requires explicit permission for the lifecycle service to obtain a ReadWrite session. A migration therefore needs new lifecycle configuration and a check that its intended cleanup actually occurs.

Diagnosing a denied request

Back in a general-purpose bucket, suppose an image worker can read the latest photo but receives AccessDenied after the application pins an older version for recovery. Compare the two requests using the same worker role: the bucket and key match, but the failed request includes versionId. A policy that grants only s3:GetObject permits the current-object request; reading an explicit version requires s3:GetObjectVersion.

In this example, inspecting the effective permissions confirms that the version action is missing. Grant that action for the intended objects, repeat the version-specific read as the worker, and check the returned version ID and content. Reading the latest image successfully would not verify the repair. The GetObject API documents these actions. In another incident, first establish the credentials and complete target before choosing a remedy.

If the required action is already granted, inspect the request’s other policy layers and encryption dependency. A role can be allowed by an identity policy but blocked by an explicit deny, another applicable control or the KMS key policy. Changing the application’s CORS rules cannot repair a server’s denied request. The access-denied troubleshooting guide organises these cases.

For a browser, separate a failed preflight from the actual signed request. For a missing object, remember that permissions can affect whether absence is reported as 403 or 404. A generic status alone is insufficient evidence that a key exists or does not exist for every caller. With s3:ListBucket, a missing key returns 404; without it, the same absence returns 403. The GetObject contract above documents that distinction.

Retain the operation’s request IDs, status, error code, elapsed time and retry count in appropriate logs. Keep secret credentials and signed URLs out of logs intended for broad access. The useful diagnostic record identifies the failed operation without granting someone the authority to repeat it.

Testing configured workflows

A successful configuration request establishes that the service accepted a configuration. It does not prove a downstream workflow works. A notification can be mis-scoped for the keys the application writes. A replication role can fail to use the destination encryption key. A lifecycle rule can retain noncurrent versions that the cost estimate assumed were removed.

Test the intended outcome with a representative object. Upload under the actual source prefix, observe the expected event or replica, read using the consumer role and verify cleanup where applicable. The monitoring guide distinguishes metrics, access logs and audit records; CloudTrail object data events require appropriate configuration rather than appearing automatically in every default view.

For ongoing operation, choose metrics tied to user outcomes: failed reads, incomplete uploads, oldest unfinished processing job, missing replicas for a required generation and unexpected growth in noncurrent storage. Aggregate request success can hide one broken tenant or one critical export.

What “S3 compatible” should mean to you

Another service implementing familiar S3 endpoints can make client integration easier. It does not establish identical behaviour for conditional writes, versioning, multipart completion, permissions, notifications, checksums or errors. Scope compatibility to the operations and failure paths your application actually uses.

A useful evaluation replays the same contract tests: conditional creation of an existing key, stale replacement, interrupted multipart upload, version-specific recovery, pagination and a lost response. Then evaluate the service’s documented durability, availability, operational responsibilities and costs separately. A local emulator passing those requests is evidence about that emulator and client integration, not about a hosted system’s infrastructure guarantees.

Keep the requests and expected states from this evaluation beside the application. They make a later service or client upgrade easier to assess against the behaviour the application depends on.