aws-sdk-s3 1.81.1 → 1.82.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/aws-sdk-s3.rb +1 -1
- data/lib/aws-sdk-s3/arn/access_point_arn.rb +62 -0
- data/lib/aws-sdk-s3/arn/outpost_access_point_arn.rb +71 -0
- data/lib/aws-sdk-s3/bucket.rb +1 -1
- data/lib/aws-sdk-s3/client.rb +552 -226
- data/lib/aws-sdk-s3/customizations/bucket.rb +7 -4
- data/lib/aws-sdk-s3/multipart_upload_part.rb +12 -3
- data/lib/aws-sdk-s3/object.rb +13 -4
- data/lib/aws-sdk-s3/object_summary.rb +13 -4
- data/lib/aws-sdk-s3/plugins/arn.rb +187 -0
- data/lib/aws-sdk-s3/plugins/bucket_dns.rb +0 -2
- data/lib/aws-sdk-s3/plugins/bucket_name_restrictions.rb +1 -1
- data/lib/aws-sdk-s3/plugins/s3_signer.rb +29 -7
- data/lib/aws-sdk-s3/types.rb +406 -39
- metadata +7 -5
- data/lib/aws-sdk-s3/plugins/bucket_arn.rb +0 -212
@@ -12,13 +12,12 @@ module Aws
|
|
12
12
|
# Define a new initialize method that extracts out a bucket ARN.
|
13
13
|
define_method(:initialize) do |*args|
|
14
14
|
old_initialize.bind(self).call(*args)
|
15
|
-
|
15
|
+
resolved_region, arn = Plugins::ARN.resolve_arn!(
|
16
16
|
name,
|
17
17
|
client.config.region,
|
18
18
|
client.config.s3_use_arn_region
|
19
19
|
)
|
20
|
-
@
|
21
|
-
@client.config.region = region
|
20
|
+
@resolved_region = resolved_region
|
22
21
|
@arn = arn
|
23
22
|
end
|
24
23
|
|
@@ -102,7 +101,11 @@ module Aws
|
|
102
101
|
if options[:virtual_host]
|
103
102
|
"http://#{name}"
|
104
103
|
elsif @arn
|
105
|
-
Plugins::
|
104
|
+
Plugins::ARN.resolve_url!(
|
105
|
+
client.config.endpoint.dup,
|
106
|
+
@arn,
|
107
|
+
@resolved_region
|
108
|
+
).to_s
|
106
109
|
else
|
107
110
|
s3_bucket_url
|
108
111
|
end
|
@@ -241,9 +241,9 @@ module Aws::S3
|
|
241
241
|
# Resource Name (ARN) of the object as accessed through the access
|
242
242
|
# point, in the format
|
243
243
|
# `arn:aws:s3:<Region>:<account-id>:accesspoint/<access-point-name>/object/<key>`.
|
244
|
-
# For example, to copy the object `reports/january.pdf` through
|
245
|
-
#
|
246
|
-
#
|
244
|
+
# For example, to copy the object `reports/january.pdf` through access
|
245
|
+
# point `my-access-point` owned by account `123456789012` in Region
|
246
|
+
# `us-west-2`, use the URL encoding of
|
247
247
|
# `arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/reports/january.pdf`.
|
248
248
|
# The value must be URL encoded.
|
249
249
|
#
|
@@ -252,6 +252,15 @@ module Aws::S3
|
|
252
252
|
#
|
253
253
|
# </note>
|
254
254
|
#
|
255
|
+
# Alternatively, for objects accessed through Amazon S3 on Outposts,
|
256
|
+
# specify the ARN of the object as accessed in the format
|
257
|
+
# `arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/object/<key>`.
|
258
|
+
# For example, to copy the object `reports/january.pdf` through
|
259
|
+
# outpost `my-outpost` owned by account `123456789012` in Region
|
260
|
+
# `us-west-2`, use the URL encoding of
|
261
|
+
# `arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/object/reports/january.pdf`.
|
262
|
+
# The value must be URL encoded.
|
263
|
+
#
|
255
264
|
# To copy a specific version of an object, append
|
256
265
|
# `?versionId=<version-id>` to the value (for example,
|
257
266
|
# `awsexamplebucket/reports/january.pdf?versionId=QUpfdndhfd8438MNFDN93jdnJFkdmqnh893`).
|
data/lib/aws-sdk-s3/object.rb
CHANGED
@@ -530,7 +530,7 @@ module Aws::S3
|
|
530
530
|
# metadata_directive: "COPY", # accepts COPY, REPLACE
|
531
531
|
# tagging_directive: "COPY", # accepts COPY, REPLACE
|
532
532
|
# server_side_encryption: "AES256", # accepts AES256, aws:kms
|
533
|
-
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE
|
533
|
+
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE, OUTPOSTS
|
534
534
|
# website_redirect_location: "WebsiteRedirectLocation",
|
535
535
|
# sse_customer_algorithm: "SSECustomerAlgorithm",
|
536
536
|
# sse_customer_key: "SSECustomerKey",
|
@@ -590,6 +590,15 @@ module Aws::S3
|
|
590
590
|
#
|
591
591
|
# </note>
|
592
592
|
#
|
593
|
+
# Alternatively, for objects accessed through Amazon S3 on Outposts,
|
594
|
+
# specify the ARN of the object as accessed in the format
|
595
|
+
# `arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/object/<key>`.
|
596
|
+
# For example, to copy the object `reports/january.pdf` through
|
597
|
+
# outpost `my-outpost` owned by account `123456789012` in Region
|
598
|
+
# `us-west-2`, use the URL encoding of
|
599
|
+
# `arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/object/reports/january.pdf`.
|
600
|
+
# The value must be URL encoded.
|
601
|
+
#
|
593
602
|
# To copy a specific version of an object, append
|
594
603
|
# `?versionId=<version-id>` to the value (for example,
|
595
604
|
# `awsexamplebucket/reports/january.pdf?versionId=QUpfdndhfd8438MNFDN93jdnJFkdmqnh893`).
|
@@ -881,7 +890,7 @@ module Aws::S3
|
|
881
890
|
# "MetadataKey" => "MetadataValue",
|
882
891
|
# },
|
883
892
|
# server_side_encryption: "AES256", # accepts AES256, aws:kms
|
884
|
-
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE
|
893
|
+
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE, OUTPOSTS
|
885
894
|
# website_redirect_location: "WebsiteRedirectLocation",
|
886
895
|
# sse_customer_algorithm: "SSECustomerAlgorithm",
|
887
896
|
# sse_customer_key: "SSECustomerKey",
|
@@ -1021,7 +1030,7 @@ module Aws::S3
|
|
1021
1030
|
# "MetadataKey" => "MetadataValue",
|
1022
1031
|
# },
|
1023
1032
|
# server_side_encryption: "AES256", # accepts AES256, aws:kms
|
1024
|
-
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE
|
1033
|
+
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE, OUTPOSTS
|
1025
1034
|
# website_redirect_location: "WebsiteRedirectLocation",
|
1026
1035
|
# sse_customer_algorithm: "SSECustomerAlgorithm",
|
1027
1036
|
# sse_customer_key: "SSECustomerKey",
|
@@ -1298,7 +1307,7 @@ module Aws::S3
|
|
1298
1307
|
# value: "MetadataValue",
|
1299
1308
|
# },
|
1300
1309
|
# ],
|
1301
|
-
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE
|
1310
|
+
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE, OUTPOSTS
|
1302
1311
|
# },
|
1303
1312
|
# },
|
1304
1313
|
# },
|
@@ -295,7 +295,7 @@ module Aws::S3
|
|
295
295
|
# metadata_directive: "COPY", # accepts COPY, REPLACE
|
296
296
|
# tagging_directive: "COPY", # accepts COPY, REPLACE
|
297
297
|
# server_side_encryption: "AES256", # accepts AES256, aws:kms
|
298
|
-
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE
|
298
|
+
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE, OUTPOSTS
|
299
299
|
# website_redirect_location: "WebsiteRedirectLocation",
|
300
300
|
# sse_customer_algorithm: "SSECustomerAlgorithm",
|
301
301
|
# sse_customer_key: "SSECustomerKey",
|
@@ -355,6 +355,15 @@ module Aws::S3
|
|
355
355
|
#
|
356
356
|
# </note>
|
357
357
|
#
|
358
|
+
# Alternatively, for objects accessed through Amazon S3 on Outposts,
|
359
|
+
# specify the ARN of the object as accessed in the format
|
360
|
+
# `arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/object/<key>`.
|
361
|
+
# For example, to copy the object `reports/january.pdf` through
|
362
|
+
# outpost `my-outpost` owned by account `123456789012` in Region
|
363
|
+
# `us-west-2`, use the URL encoding of
|
364
|
+
# `arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/object/reports/january.pdf`.
|
365
|
+
# The value must be URL encoded.
|
366
|
+
#
|
358
367
|
# To copy a specific version of an object, append
|
359
368
|
# `?versionId=<version-id>` to the value (for example,
|
360
369
|
# `awsexamplebucket/reports/january.pdf?versionId=QUpfdndhfd8438MNFDN93jdnJFkdmqnh893`).
|
@@ -646,7 +655,7 @@ module Aws::S3
|
|
646
655
|
# "MetadataKey" => "MetadataValue",
|
647
656
|
# },
|
648
657
|
# server_side_encryption: "AES256", # accepts AES256, aws:kms
|
649
|
-
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE
|
658
|
+
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE, OUTPOSTS
|
650
659
|
# website_redirect_location: "WebsiteRedirectLocation",
|
651
660
|
# sse_customer_algorithm: "SSECustomerAlgorithm",
|
652
661
|
# sse_customer_key: "SSECustomerKey",
|
@@ -786,7 +795,7 @@ module Aws::S3
|
|
786
795
|
# "MetadataKey" => "MetadataValue",
|
787
796
|
# },
|
788
797
|
# server_side_encryption: "AES256", # accepts AES256, aws:kms
|
789
|
-
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE
|
798
|
+
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE, OUTPOSTS
|
790
799
|
# website_redirect_location: "WebsiteRedirectLocation",
|
791
800
|
# sse_customer_algorithm: "SSECustomerAlgorithm",
|
792
801
|
# sse_customer_key: "SSECustomerKey",
|
@@ -1063,7 +1072,7 @@ module Aws::S3
|
|
1063
1072
|
# value: "MetadataValue",
|
1064
1073
|
# },
|
1065
1074
|
# ],
|
1066
|
-
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE
|
1075
|
+
# storage_class: "STANDARD", # accepts STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE, OUTPOSTS
|
1067
1076
|
# },
|
1068
1077
|
# },
|
1069
1078
|
# },
|
@@ -0,0 +1,187 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../arn/access_point_arn'
|
4
|
+
require_relative '../arn/outpost_access_point_arn'
|
5
|
+
|
6
|
+
module Aws
|
7
|
+
module S3
|
8
|
+
module Plugins
|
9
|
+
# When an accesspoint ARN is provided for :bucket in S3 operations, this
|
10
|
+
# plugin resolves the request endpoint from the ARN when possible.
|
11
|
+
# @api private
|
12
|
+
class ARN < Seahorse::Client::Plugin
|
13
|
+
option(
|
14
|
+
:s3_use_arn_region,
|
15
|
+
default: true,
|
16
|
+
doc_type: 'Boolean',
|
17
|
+
docstring: <<-DOCS) do |cfg|
|
18
|
+
For S3 ARNs passed into the `:bucket` parameter, this option will
|
19
|
+
use the region in the ARN, allowing for cross-region requests to
|
20
|
+
be made. Set to `false` to use the client's region instead.
|
21
|
+
DOCS
|
22
|
+
resolve_s3_use_arn_region(cfg)
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_handlers(handlers, _config)
|
26
|
+
handlers.add(Handler)
|
27
|
+
end
|
28
|
+
|
29
|
+
class Handler < Seahorse::Client::Handler
|
30
|
+
def call(context)
|
31
|
+
bucket_member = _bucket_member(context.operation.input.shape)
|
32
|
+
if bucket_member && (bucket = context.params[bucket_member])
|
33
|
+
resolved_region, arn = ARN.resolve_arn!(
|
34
|
+
bucket,
|
35
|
+
context.config.region,
|
36
|
+
context.config.s3_use_arn_region
|
37
|
+
)
|
38
|
+
if arn
|
39
|
+
validate_config!(context, arn)
|
40
|
+
|
41
|
+
ARN.resolve_url!(
|
42
|
+
context.http_request.endpoint,
|
43
|
+
arn,
|
44
|
+
resolved_region,
|
45
|
+
extract_dualstack_config!(context)
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
@handler.call(context)
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def _bucket_member(input)
|
55
|
+
input.members.each do |member, ref|
|
56
|
+
return member if ref.shape.name == 'BucketName'
|
57
|
+
end
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
|
61
|
+
# other plugins use dualstack so disable it when we're done
|
62
|
+
def extract_dualstack_config!(context)
|
63
|
+
dualstack = context[:use_dualstack_endpoint]
|
64
|
+
context[:use_dualstack_endpoint] = false if dualstack
|
65
|
+
dualstack
|
66
|
+
end
|
67
|
+
|
68
|
+
def validate_config!(context, arn)
|
69
|
+
unless context.config.regional_endpoint
|
70
|
+
raise ArgumentError,
|
71
|
+
'Cannot provide both an Access Point ARN and setting '\
|
72
|
+
':endpoint.'
|
73
|
+
end
|
74
|
+
|
75
|
+
if context.config.force_path_style
|
76
|
+
raise ArgumentError,
|
77
|
+
'Cannot provide both an Access Point ARN and setting '\
|
78
|
+
':force_path_style to true.'
|
79
|
+
end
|
80
|
+
|
81
|
+
if context.config.use_accelerate_endpoint
|
82
|
+
raise ArgumentError,
|
83
|
+
'Cannot provide both an Access Point ARN and setting '\
|
84
|
+
':use_accelerate_endpoint to true.'
|
85
|
+
end
|
86
|
+
|
87
|
+
if !arn.support_dualstack? && context[:use_dualstack_endpoint]
|
88
|
+
raise ArgumentError,
|
89
|
+
'Cannot provide both an Outpost Access Point ARN and '\
|
90
|
+
'setting :use_dualstack_endpoint to true.'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class << self
|
96
|
+
# @api private
|
97
|
+
def resolve_arn!(member_value, region, use_arn_region)
|
98
|
+
if Aws::ARNParser.arn?(member_value)
|
99
|
+
arn = Aws::ARNParser.parse(member_value)
|
100
|
+
if arn.resource.start_with?('accesspoint')
|
101
|
+
s3_arn = Aws::S3::AccessPointARN.new(arn.to_h)
|
102
|
+
elsif arn.resource.start_with?('outpost')
|
103
|
+
s3_arn = Aws::S3::OutpostAccessPointARN.new(arn.to_h)
|
104
|
+
else
|
105
|
+
raise ArgumentError,
|
106
|
+
'Only Access Point and Outpost Access Point type ARNs '\
|
107
|
+
'are currently supported.'
|
108
|
+
end
|
109
|
+
s3_arn.validate_arn!
|
110
|
+
validate_region_config!(s3_arn, region, use_arn_region)
|
111
|
+
region = s3_arn.region if use_arn_region
|
112
|
+
[region, s3_arn]
|
113
|
+
else
|
114
|
+
[region]
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# @api private
|
119
|
+
def resolve_url!(url, arn, region, dualstack = false)
|
120
|
+
url.host = arn.host_url(region, dualstack)
|
121
|
+
url.path = url_path(url.path, arn)
|
122
|
+
url
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def resolve_s3_use_arn_region(cfg)
|
128
|
+
value = ENV['AWS_S3_USE_ARN_REGION'] ||
|
129
|
+
Aws.shared_config.s3_use_arn_region(profile: cfg.profile) ||
|
130
|
+
'true'
|
131
|
+
value = Aws::Util.str_2_bool(value)
|
132
|
+
# Raise if provided value is not true or false
|
133
|
+
if value.nil?
|
134
|
+
raise ArgumentError,
|
135
|
+
'Must provide either `true` or `false` for '\
|
136
|
+
's3_use_arn_region profile option or for '\
|
137
|
+
"ENV['AWS_S3_USE_ARN_REGION']"
|
138
|
+
end
|
139
|
+
value
|
140
|
+
end
|
141
|
+
|
142
|
+
# Remove ARN from the path since it was substituted already
|
143
|
+
# This only works because accesspoints care about the URL
|
144
|
+
def url_path(path, arn)
|
145
|
+
path = path.sub("/#{Seahorse::Util.uri_escape(arn.to_s)}", '')
|
146
|
+
.sub("/#{arn}", '')
|
147
|
+
"/#{path}" unless path =~ /^\//
|
148
|
+
path
|
149
|
+
end
|
150
|
+
|
151
|
+
def validate_region_config!(arn, region, use_arn_region)
|
152
|
+
fips = arn.support_fips?
|
153
|
+
|
154
|
+
# s3-external-1 is specific just to s3 and not part of partitions
|
155
|
+
# aws-global is a partition region
|
156
|
+
unless arn.partition == 'aws' &&
|
157
|
+
(region == 's3-external-1' || region == 'aws-global')
|
158
|
+
if !fips && arn.region.include?('fips')
|
159
|
+
raise ArgumentError,
|
160
|
+
'FIPS region ARNs are not supported for this type of ARN.'
|
161
|
+
end
|
162
|
+
|
163
|
+
if !fips && !use_arn_region && region.include?('fips')
|
164
|
+
raise ArgumentError,
|
165
|
+
'FIPS client regions are not supported for this type of '\
|
166
|
+
'ARN without s3_use_arn_region.'
|
167
|
+
end
|
168
|
+
|
169
|
+
# if it's a fips region, attempt to normalize it
|
170
|
+
if fips || use_arn_region
|
171
|
+
region = region.gsub('fips-', '').gsub('-fips', '')
|
172
|
+
end
|
173
|
+
if use_arn_region &&
|
174
|
+
!Aws::Partitions.partition(arn.partition).region?(region)
|
175
|
+
raise Aws::Errors::InvalidARNPartitionError
|
176
|
+
end
|
177
|
+
|
178
|
+
if !use_arn_region && region != arn.region
|
179
|
+
raise Aws::Errors::InvalidARNRegionError
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
@@ -73,8 +73,6 @@ request URI and never moved to the host as a sub-domain.
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
-
# Checks for a valid RFC-3986 host name
|
77
|
-
# @see https://tools.ietf.org/html/rfc3986#section-3.2.2
|
78
76
|
# @param [String] bucket_name
|
79
77
|
# @return [Boolean]
|
80
78
|
def valid_subdomain?(bucket_name)
|
@@ -13,7 +13,7 @@ module Aws
|
|
13
13
|
def call(context)
|
14
14
|
bucket_member = _bucket_member(context.operation.input.shape)
|
15
15
|
if bucket_member && (bucket = context.params[bucket_member])
|
16
|
-
|
16
|
+
_resolved_region, arn = ARN.resolve_arn!(
|
17
17
|
bucket,
|
18
18
|
context.config.region,
|
19
19
|
context.config.s3_use_arn_region
|
@@ -12,12 +12,14 @@ module Aws
|
|
12
12
|
|
13
13
|
option(:sigv4_signer) do |cfg|
|
14
14
|
S3Signer.build_v4_signer(
|
15
|
+
service: 's3',
|
15
16
|
region: cfg.sigv4_region,
|
16
17
|
credentials: cfg.credentials
|
17
18
|
)
|
18
19
|
end
|
19
20
|
|
20
21
|
option(:sigv4_region) do |cfg|
|
22
|
+
# S3 removes core's signature_v4 plugin that checks for this
|
21
23
|
raise Aws::Errors::MissingRegionError if cfg.region.nil?
|
22
24
|
|
23
25
|
Aws::Partitions::EndpointProvider.signing_region(cfg.region, 's3')
|
@@ -67,11 +69,26 @@ module Aws
|
|
67
69
|
if context[:cached_sigv4_region] &&
|
68
70
|
context[:cached_sigv4_region] != context.config.sigv4_signer.region
|
69
71
|
S3Signer.build_v4_signer(
|
72
|
+
service: 's3',
|
70
73
|
region: context[:cached_sigv4_region],
|
71
74
|
credentials: context.config.credentials
|
72
75
|
)
|
73
76
|
else
|
74
|
-
|
77
|
+
resolved_region, arn = ARN.resolve_arn!(
|
78
|
+
context.params[:bucket],
|
79
|
+
context.config.sigv4_signer.region,
|
80
|
+
context.config.s3_use_arn_region
|
81
|
+
)
|
82
|
+
|
83
|
+
if arn
|
84
|
+
S3Signer.build_v4_signer(
|
85
|
+
service: arn.respond_to?(:outpost_id) ? 's3-outposts' : 's3',
|
86
|
+
region: resolved_region,
|
87
|
+
credentials: context.config.credentials
|
88
|
+
)
|
89
|
+
else
|
90
|
+
context.config.sigv4_signer
|
91
|
+
end
|
75
92
|
end
|
76
93
|
end
|
77
94
|
end
|
@@ -90,7 +107,9 @@ module Aws
|
|
90
107
|
def check_for_cached_region(context, bucket)
|
91
108
|
cached_region = S3::BUCKET_REGIONS[bucket]
|
92
109
|
if cached_region && cached_region != context.config.region
|
93
|
-
context.http_request.endpoint.host = S3Signer.new_hostname(
|
110
|
+
context.http_request.endpoint.host = S3Signer.new_hostname(
|
111
|
+
context, cached_region
|
112
|
+
)
|
94
113
|
context[:cached_sigv4_region] = cached_region
|
95
114
|
end
|
96
115
|
end
|
@@ -150,11 +169,14 @@ module Aws
|
|
150
169
|
|
151
170
|
def resign_with_new_region(context, actual_region)
|
152
171
|
context.http_response.body.truncate(0)
|
153
|
-
context.http_request.endpoint.host = S3Signer.new_hostname(
|
172
|
+
context.http_request.endpoint.host = S3Signer.new_hostname(
|
173
|
+
context, actual_region
|
174
|
+
)
|
154
175
|
context.metadata[:redirect_region] = actual_region
|
155
176
|
Aws::Plugins::SignatureV4.apply_signature(
|
156
177
|
context: context,
|
157
178
|
signer: S3Signer.build_v4_signer(
|
179
|
+
service: 's3',
|
158
180
|
region: actual_region,
|
159
181
|
credentials: context.config.credentials
|
160
182
|
)
|
@@ -189,7 +211,7 @@ module Aws
|
|
189
211
|
# @api private
|
190
212
|
def build_v4_signer(options = {})
|
191
213
|
Aws::Sigv4::Signer.new(
|
192
|
-
service:
|
214
|
+
service: options[:service],
|
193
215
|
region: options[:region],
|
194
216
|
credentials_provider: options[:credentials],
|
195
217
|
uri_escape_path: false,
|
@@ -200,7 +222,7 @@ module Aws
|
|
200
222
|
def new_hostname(context, region)
|
201
223
|
# Check to see if the bucket is actually an ARN and resolve it
|
202
224
|
# Otherwise it will retry with the ARN as the bucket name.
|
203
|
-
|
225
|
+
resolved_region, arn = ARN.resolve_arn!(
|
204
226
|
context.params[:bucket],
|
205
227
|
region,
|
206
228
|
context.config.s3_use_arn_region
|
@@ -210,9 +232,9 @@ module Aws
|
|
210
232
|
)
|
211
233
|
|
212
234
|
if arn
|
213
|
-
|
235
|
+
ARN.resolve_url!(uri, arn).host
|
214
236
|
else
|
215
|
-
|
237
|
+
"#{context.params[:bucket]}.#{uri.host}"
|
216
238
|
end
|
217
239
|
end
|
218
240
|
end
|