Skip to content

Commit 1386028

Browse files
authored
S3 Express (#2959)
1 parent 0921a7f commit 1386028

39 files changed

+883
-55
lines changed

benchmark/gems/s3.rb

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,19 @@ def operation_benchmarks
5050
client.put_object(req)
5151
end
5252
},
53+
put_object_multipart_large: {
54+
n: 150,
55+
setup: proc do |client|
56+
{multipart_threshold: 5 * 1024 * 1024}
57+
end,
58+
test: proc do |client, req|
59+
resource = Aws::S3::Resource.new(client: client)
60+
object = resource.bucket('bucket').object('key')
61+
tempfile = Tempfile.new('put_object_multipart_large')
62+
tempfile << '.' * 1024*1024*10
63+
object.upload_file(tempfile, **req)
64+
end
65+
},
5366
head_object: {
5467
setup: proc do |client|
5568
{bucket: 'bucket', key: 'key'}
@@ -58,6 +71,55 @@ def operation_benchmarks
5871
client.head_object(req)
5972
end
6073
},
74+
s3_express_get_object_small: {
75+
setup: proc do |client|
76+
client.stub_responses(:get_object, [{body: "." * 128}])
77+
{bucket: 'bucket--usw2-az2-d-s3', key: 'key'}
78+
end,
79+
test: proc do |client, req|
80+
client.get_object(req)
81+
end
82+
},
83+
s3_express_get_object_large: {
84+
n: 150,
85+
setup: proc do |client|
86+
client.stub_responses(:get_object, [{body: "." * 1024*1024*10}]) # 10 MB
87+
{bucket: 'bucket--usw2-az2-d-s3', key: 'key'}
88+
end,
89+
test: proc do |client, req|
90+
client.get_object(req)
91+
end
92+
},
93+
s3_express_put_object_small: {
94+
setup: proc do |client|
95+
{bucket: 'bucket--usw2-az2-d-s3', key: 'key', body: '.' * 128}
96+
end,
97+
test: proc do |client, req|
98+
client.put_object(req)
99+
end
100+
},
101+
s3_express_put_object_large: {
102+
n: 150,
103+
setup: proc do |client|
104+
{bucket: 'bucket--usw2-az2-d-s3', key: 'key', body: "." * 1024*1024*10}
105+
end,
106+
test: proc do |client, req|
107+
client.put_object(req)
108+
end
109+
},
110+
s3_express_put_object_multipart_large: {
111+
n: 150,
112+
setup: proc do |client|
113+
{multipart_threshold: 5 * 1024 * 1024}
114+
end,
115+
test: proc do |client, req|
116+
resource = Aws::S3::Resource.new(client: client)
117+
object = resource.bucket('bucket--usw2-az2-d-s3').object('key')
118+
tempfile = Tempfile.new('s3_express_put_object_multipart_large')
119+
tempfile << '.' * 1024*1024*10
120+
object.upload_file(tempfile, **req)
121+
end
122+
}
61123
}
62124
end
63125

build_tools/aws-sdk-code-generator/lib/aws-sdk-code-generator/views/spec/endpoint_provider_spec_class.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ def expect_auth?
9090
!@expect['endpoint']['properties']['authSchemes'].empty?
9191
end
9292

93+
def s3_express_auth?
94+
expect_auth? && expected_auth['name'] == 'sigv4-s3express'
95+
end
96+
9397
def expected_headers
9498
@expect['endpoint']['headers'].map { |k,v| Param.new(k, v.join(",")) }
9599
end

build_tools/aws-sdk-code-generator/templates/endpoints_plugin.mustache

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,17 @@ module {{module_name}}
2929
# @api private
3030
class Handler < Seahorse::Client::Handler
3131
def call(context)
32-
# If endpoint was discovered, do not resolve or apply the endpoint.
3332
unless context[:discovered_endpoint]
3433
params = parameters_for_operation(context)
3534
endpoint = context.config.endpoint_provider.resolve_endpoint(params)
3635

3736
context.http_request.endpoint = endpoint.url
3837
apply_endpoint_headers(context, endpoint.headers)
38+
39+
context[:endpoint_params] = params
40+
context[:endpoint_properties] = endpoint.properties
3941
end
4042

41-
context[:endpoint_params] = params
4243
context[:auth_scheme] =
4344
Aws::Endpoints.resolve_auth_scheme(context, endpoint)
4445

build_tools/aws-sdk-code-generator/templates/spec/endpoint_provider_spec_class.mustache

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,16 @@ module {{module_name}}
5050
{{/expect_error?}}
5151
{{^expect_error?}}
5252
{{#expect_auth?}}
53+
{{#s3_express_auth?}}
54+
client.stub_responses(:create_session, credentials: {
55+
access_key_id: 's3-akid',
56+
secret_access_key: 's3-secret',
57+
session_token: 's3-session',
58+
expiration: Time.now + 60 * 5
59+
})
60+
expect_auth({"name"=>"sigv4", "signingName"=>"s3express"})
61+
EXPRESS_CREDENTIALS_CACHE.clear
62+
{{/s3_express_auth?}}
5363
expect_auth({{{expected_auth}}})
5464
{{/expect_auth?}}
5565
resp = client.{{operation_name}}(

build_tools/services.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class ServiceEnumerator
1313
MINIMUM_CORE_VERSION = "3.188.0"
1414

1515
# Minimum `aws-sdk-core` version for new S3 gem builds
16-
MINIMUM_CORE_VERSION_S3 = "3.188.0"
16+
MINIMUM_CORE_VERSION_S3 = "3.189.0"
1717

1818
EVENTSTREAM_PLUGIN = "Aws::Plugins::EventStreamConfiguration"
1919

gems/aws-sdk-core/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
Unreleased Changes
22
------------------
33

4+
* Feature - Support S3 Express authentication.
5+
46
3.188.0 (2023-11-22)
57
------------------
68

gems/aws-sdk-core/aws-sdk-core.gemspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ Gem::Specification.new do |spec|
1414

1515
spec.add_dependency('jmespath', '~> 1', '>= 1.6.1') # necessary for secure jmespath JSON parsing
1616
spec.add_dependency('aws-partitions', '~> 1', '>= 1.651.0') # necessary for new endpoint resolution
17-
spec.add_dependency('aws-sigv4', '~> 1.5') # necessary for making Aws::STS, SSO, SSOOIDC API calls
18-
spec.add_dependency('aws-eventstream', '~> 1', '>= 1.0.2') # necessary for binary eventstream
17+
spec.add_dependency('aws-sigv4', '~> 1.8') # necessary for s3 express auth
18+
spec.add_dependency('aws-eventstream', '~> 1', '>= 1.3.0') # necessary for binary eventstream
1919

2020
spec.metadata = {
2121
'source_code_uri' => 'https://github.com/aws/aws-sdk-ruby/tree/version-3/gems/aws-sdk-core',

gems/aws-sdk-core/lib/aws-sdk-core/endpoints.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def default_auth_scheme(context)
5353
end
5454

5555
def merge_signing_defaults(auth_scheme, config)
56-
if %w[sigv4 sigv4a].include?(auth_scheme['name'])
56+
if %w[sigv4 sigv4a sigv4-s3express].include?(auth_scheme['name'])
5757
auth_scheme['signingName'] ||= sigv4_name(config)
5858
if auth_scheme['name'] == 'sigv4a'
5959
auth_scheme['signingRegionSet'] ||= ['*']

gems/aws-sdk-core/lib/aws-sdk-core/plugins/checksum_algorithm.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ class ChecksumHandler < Seahorse::Client::Handler
117117

118118
def call(context)
119119
if should_calculate_request_checksum?(context)
120-
request_algorithm_input = ChecksumAlgorithm.request_algorithm_selection(context)
120+
request_algorithm_input = ChecksumAlgorithm.request_algorithm_selection(context) ||
121+
context[:default_request_checksum_algorithm]
121122
context[:checksum_algorithms] = request_algorithm_input
122123

123124
request_checksum_property = {
@@ -140,7 +141,8 @@ def call(context)
140141

141142
def should_calculate_request_checksum?(context)
142143
context.operation.http_checksum &&
143-
ChecksumAlgorithm.request_algorithm_selection(context)
144+
(ChecksumAlgorithm.request_algorithm_selection(context) ||
145+
context[:default_request_checksum_algorithm])
144146
end
145147

146148
def should_verify_response_checksum?(context)

gems/aws-sdk-core/lib/aws-sdk-core/plugins/http_checksum.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ class Handler < Seahorse::Client::Handler
1212

1313
def call(context)
1414
if checksum_required?(context) &&
15-
!context[:checksum_algorithms] # skip in favor of flexible checksum
15+
!context[:checksum_algorithms] && # skip in favor of flexible checksum
16+
!context[:s3_express_endpoint] # s3 express endpoints do not support md5
1617
body = context.http_request.body
1718
context.http_request.headers['Content-Md5'] ||= md5(body)
1819
end

0 commit comments

Comments
 (0)