Amazon S3 Customizations

S3 Bucket Addressing

Clients for Amazon S3 SHOULD expose multiple levels of configuration for bucket addressing: environment, file, client, and operation. Settings for bucket addressing should be resolved closest to the operation. Most bucket addressing configuration settings compose together. The following table is a non-exhaustive list of combinations showing the expected precedence orders for the S3 Bucket Virtual Hosting settings:

Environment

File

Client

Operation

Resolved

virtual-host

unset

unset

unset

virtual-host

path

virtual-host

unset

unset

virtual-host

unset

unset

virtual-host

path

path

path

virtual-host

unset

unset

virtual-host

unset

virtual-host

path

unset

path

S3 Bucket Virtual Hosting

A client for Amazon S3 MUST expose the option to use virtual hosting for addressing a bucket. Configurations MUST support the default of using virtual hosting, explicitly configuring virtual hosting, and explicitly configuring the path-style requests. When set to virtual hosting, clients MUST remove the bucket name from the request URI and MUST prepend it to the request host. When set to path-style, clients MUST NOT perform this action and MUST use the modeled HTTP bindings for the request.

Style

Host

URI

virtual

bucketname.s3.us-west-2.amazonaws.com

/

path

s3.us-west-2.amazonaws.com

/bucketname

S3 Dual-Stack Endpoints

A client for Amazon S3 MUST expose the option to use dual-stack endpoints for addressing a bucket. Configurations MUST default this setting to being disabled. When enabled, the string literal ".dualstack" is placed after S3's endpointPrefix of "s3" and before the region in the host for the request. Clients MUST have the S3 Bucket Virtual Hosting setting resolved to "virtual" to enable this setting.

DualStack Setting

Host

Disabled

bucketname.s3.us-west-2.amazonaws.com

Enabled

bucketname.s3.dualstack.us-west-2.amazonaws.com

S3 Transfer Acceleration Endpoints

A client for Amazon S3 MUST expose the option to use S3 transfer acceleration for addressing a bucket. Configurations MUST default this setting to being disabled. When enabled, the string literal "s3-accelerate" MUST replace the S3's endpointPrefix of "s3" and MUST remove the resolved region from the host. Clients MUST have the S3 Bucket Virtual Hosting setting resolved to "virtual" to enable this setting.

Transfer Acceleration Setting

Host

Disabled

bucketname.s3.us-west-2.amazonaws.com

Enabled

bucketname.s3-accelerate.us-west-2.amazonaws.com

TODO: Add the other bucket addressing customizations and more.

S3 Traits

aws.customizations#s3UnwrappedXmlOutput trait

Summary

Indicates the response body from S3 is not wrapped in the AWS restXml protocol operation-level XML node.

Trait selector

operation

Value type

Annotation trait

Consider the following abridged model of S3's GetBucketLocation operation:

$version: "2"

use aws.customizations#s3UnwrappedXmlOutput

@http(uri: "/GetBucketLocation", method: "GET")
@s3UnwrappedXmlOutput
operation GetBucketLocation {
    input: GetBucketLocationInput
    output: GetBucketLocationOutput
}

@output
@xmlName("LocationConstraint")
structure GetBucketLocationOutput {
    LocationConstraint: BucketLocationConstraint
}

enum BucketLocationConstraint {
    us_west_2 = "us-west-2"
}

Since this operation is modeled with @s3UnwrappedXmlOutput, an Amazon S3 client should expect the response from S3 to be unwrapped as shown below:

<LocationConstraint xmlns="http://s3.amazonaws.com/doc/2006-03-01/">us-west-2</LocationConstraint>

Without @s3UnwrappedXmlOutput on the operation, the response would be expected to be wrapped with the AWS restXml protocol operation-level XML node:

<LocationConstraint xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <LocationConstraint>us-west-2</LocationConstraint>
</LocationConstraint>

A client for Amazon S3 MUST understand the @s3UnwrappedXmlOutput trait in order to properly handle the output for the GetBucketLocation operation.