aws-sdk-core 3.226.2 → 3.226.3
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/CHANGELOG.md +7 -0
- data/VERSION +1 -1
- data/lib/aws-sdk-core/credential_provider_chain.rb +1 -1
- data/lib/aws-sdk-core/instance_profile_credentials.rb +146 -157
- data/lib/aws-sdk-sso/client.rb +1 -1
- data/lib/aws-sdk-sso.rb +1 -1
- data/lib/aws-sdk-ssooidc/client.rb +1 -1
- data/lib/aws-sdk-ssooidc.rb +1 -1
- data/lib/aws-sdk-sts/client.rb +1 -1
- data/lib/aws-sdk-sts.rb +1 -1
- data/lib/seahorse/client/request_context.rb +2 -2
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bcc66e64079950ab715bf739b9731f997c9d5c933dc6bf1a5a14c30afdf8e640
|
4
|
+
data.tar.gz: 239c2f96e5984261f5a020a2c219a24f80ccfbeba99ac9f71374d06924728d9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dac55de1f81dd26a15940cda1d4c7769aa7d3de2a5a02201c5c965caecd9ddf42fe9158ef16be0b1ec6c1d36ada3fface779f524e769b4ba3153e024eb272ccf
|
7
|
+
data.tar.gz: f157a62c531b7c3a6ae39f8ef4826161ef5641790d519658e9098571c5bee32f54fc149ae744a799a2e2550ffeb9269a0b23aed0b037368619337ae7e29e2063
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
Unreleased Changes
|
2
2
|
------------------
|
3
3
|
|
4
|
+
3.226.3 (2025-07-17)
|
5
|
+
------------------
|
6
|
+
|
7
|
+
* Issue - Skip `Aws::InstanceProfileCredentials` instantiation when `ENV['AWS_EC2_METADATA_DISABLED']` is set to `true` in the credential resolution chain.
|
8
|
+
|
9
|
+
* Issue - Refactor `InstanceProfileCredentials` to improve code clarity and documentation.
|
10
|
+
|
4
11
|
3.226.2 (2025-07-01)
|
5
12
|
------------------
|
6
13
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.226.
|
1
|
+
3.226.3
|
@@ -191,7 +191,7 @@ module Aws
|
|
191
191
|
if ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'] ||
|
192
192
|
ENV['AWS_CONTAINER_CREDENTIALS_FULL_URI']
|
193
193
|
ECSCredentials.new(options)
|
194
|
-
|
194
|
+
elsif !(ENV.fetch('AWS_EC2_METADATA_DISABLED', 'false').downcase == 'true')
|
195
195
|
InstanceProfileCredentials.new(options.merge(profile: profile_name))
|
196
196
|
end
|
197
197
|
end
|
@@ -4,11 +4,23 @@ require 'time'
|
|
4
4
|
require 'net/http'
|
5
5
|
|
6
6
|
module Aws
|
7
|
-
# An auto-refreshing credential provider that loads credentials from
|
8
|
-
# EC2 instances.
|
7
|
+
# An auto-refreshing credential provider that loads credentials from EC2 instances.
|
9
8
|
#
|
10
9
|
# instance_credentials = Aws::InstanceProfileCredentials.new
|
11
10
|
# ec2 = Aws::EC2::Client.new(credentials: instance_credentials)
|
11
|
+
#
|
12
|
+
# ## Retries
|
13
|
+
# When initialized from the default credential chain, this provider defaults to `0` retries.
|
14
|
+
# Breakdown of retries is as follows:
|
15
|
+
#
|
16
|
+
# * **Configurable retries** (defaults to `1`): these retries handle errors when communicating
|
17
|
+
# with the IMDS endpoint. There are two separate retry mechanisms within the provider:
|
18
|
+
# * Entire token fetch and credential retrieval process
|
19
|
+
# * Token fetching
|
20
|
+
# * **JSON parsing retries**: Fixed at 3 attempts to handle cases when IMDS returns malformed JSON
|
21
|
+
# responses. These retries are separate from configurable retries.
|
22
|
+
#
|
23
|
+
# @see https://docs.aws.amazon.com/sdkref/latest/guide/feature-imds-credentials.html IMDS Credential Provider
|
12
24
|
class InstanceProfileCredentials
|
13
25
|
include CredentialProvider
|
14
26
|
include RefreshingCredentials
|
@@ -22,10 +34,8 @@ module Aws
|
|
22
34
|
# @api private
|
23
35
|
class TokenExpiredError < RuntimeError; end
|
24
36
|
|
25
|
-
# These are the errors we trap when attempting to talk to the
|
26
|
-
#
|
27
|
-
# is not present, no responding or some other non-recoverable
|
28
|
-
# error.
|
37
|
+
# These are the errors we trap when attempting to talk to the instance metadata service.
|
38
|
+
# Any of these imply the service is not present, no responding or some other non-recoverable error.
|
29
39
|
# @api private
|
30
40
|
NETWORK_ERRORS = [
|
31
41
|
Errno::EHOSTUNREACH,
|
@@ -46,100 +56,113 @@ module Aws
|
|
46
56
|
METADATA_TOKEN_PATH = '/latest/api/token'.freeze
|
47
57
|
|
48
58
|
# @param [Hash] options
|
49
|
-
# @option options [Integer] :retries (1) Number of times to retry
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
# legacy EC2 Metadata Service v1.
|
58
|
-
# @option options [String] :ip_address ('169.254.169.254') Deprecated. Use
|
59
|
-
# :endpoint instead. The IP address for the endpoint.
|
59
|
+
# @option options [Integer] :retries (1) Number of times to retry when retrieving credentials.
|
60
|
+
# @option options [String] :endpoint ('http://169.254.169.254') The IMDS endpoint. This option has precedence
|
61
|
+
# over the `:endpoint_mode`.
|
62
|
+
# @option options [String] :endpoint_mode ('IPv4') The endpoint mode for the instance metadata service. This is
|
63
|
+
# either 'IPv4' (`169.254.169.254`) or IPv6' (`[fd00:ec2::254]`).
|
64
|
+
# @option options [Boolean] :disable_imds_v1 (false) Disable the use of the legacy EC2 Metadata Service v1.
|
65
|
+
# @option options [String] :ip_address ('169.254.169.254') Deprecated. Use `:endpoint` instead.
|
66
|
+
# The IP address for the endpoint.
|
60
67
|
# @option options [Integer] :port (80)
|
61
68
|
# @option options [Float] :http_open_timeout (1)
|
62
69
|
# @option options [Float] :http_read_timeout (1)
|
63
|
-
# @option options [Numeric, Proc] :delay By default, failures are retried
|
64
|
-
#
|
65
|
-
#
|
66
|
-
#
|
67
|
-
#
|
68
|
-
#
|
69
|
-
#
|
70
|
-
# @option options [
|
71
|
-
#
|
72
|
-
# to 21600 seconds
|
73
|
-
# @option options [Callable] before_refresh Proc called before
|
74
|
-
# credentials are refreshed. `before_refresh` is called
|
75
|
-
# with an instance of this object when
|
76
|
-
# AWS credentials are required and need to be refreshed.
|
70
|
+
# @option options [Numeric, Proc] :delay By default, failures are retried with exponential back-off, i.e.
|
71
|
+
# `sleep(1.2 ** num_failures)`. You can pass a number of seconds to sleep between failed attempts, or a Proc
|
72
|
+
# that accepts the number of failures.
|
73
|
+
# @option options [IO] :http_debug_output (nil) HTTP wire traces are sent to this object.
|
74
|
+
# You can specify something like `$stdout`.
|
75
|
+
# @option options [Integer] :token_ttl Time-to-Live in seconds for EC2 Metadata Token used for fetching
|
76
|
+
# Metadata Profile Credentials, defaults to 21600 seconds.
|
77
|
+
# @option options [Callable] :before_refresh Proc called before credentials are refreshed. `before_refresh`
|
78
|
+
# is called with an instance of this object when AWS credentials are required and need to be refreshed.
|
77
79
|
def initialize(options = {})
|
78
|
-
@
|
79
|
-
endpoint_mode = resolve_endpoint_mode(options)
|
80
|
-
@endpoint = resolve_endpoint(options, endpoint_mode)
|
81
|
-
@port = options[:port] || 80
|
80
|
+
@backoff = resolve_backoff(options[:backoff])
|
82
81
|
@disable_imds_v1 = resolve_disable_v1(options)
|
83
|
-
|
84
|
-
@imds_v1_fallback = false
|
82
|
+
@endpoint = resolve_endpoint(options)
|
85
83
|
@http_open_timeout = options[:http_open_timeout] || 1
|
86
84
|
@http_read_timeout = options[:http_read_timeout] || 1
|
87
85
|
@http_debug_output = options[:http_debug_output]
|
88
|
-
@
|
86
|
+
@port = options[:port] || 80
|
87
|
+
@retries = options[:retries] || 1
|
89
88
|
@token_ttl = options[:token_ttl] || 21_600
|
90
|
-
|
91
|
-
@no_refresh_until = nil
|
89
|
+
|
92
90
|
@async_refresh = false
|
91
|
+
@imds_v1_fallback = false
|
92
|
+
@no_refresh_until = nil
|
93
|
+
@token = nil
|
93
94
|
@metrics = ['CREDENTIALS_IMDS']
|
94
95
|
super
|
95
96
|
end
|
96
97
|
|
97
|
-
# @return [
|
98
|
-
|
99
|
-
|
98
|
+
# @return [Boolean0
|
99
|
+
attr_reader :disable_imds_v1
|
100
|
+
|
101
|
+
# @return [Integer]
|
102
|
+
attr_reader :token_ttl
|
103
|
+
|
104
|
+
# @return [Integer]
|
100
105
|
attr_reader :retries
|
101
106
|
|
107
|
+
# @return [Proc]
|
108
|
+
attr_reader :backoff
|
109
|
+
|
110
|
+
# @return [String]
|
111
|
+
attr_reader :endpoint
|
112
|
+
|
113
|
+
# @return [Integer]
|
114
|
+
attr_reader :port
|
115
|
+
|
116
|
+
# @return [Integer]
|
117
|
+
attr_reader :http_open_timeout
|
118
|
+
|
119
|
+
# @return [Integer]
|
120
|
+
attr_reader :http_read_timeout
|
121
|
+
|
122
|
+
# @return [IO, nil]
|
123
|
+
attr_reader :http_debug_output
|
124
|
+
|
102
125
|
private
|
103
126
|
|
104
127
|
def resolve_endpoint_mode(options)
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
)
|
110
|
-
value || 'IPv4'
|
128
|
+
options[:endpoint_mode] ||
|
129
|
+
ENV['AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE'] ||
|
130
|
+
Aws.shared_config.ec2_metadata_service_endpoint_mode(profile: options[:profile]) ||
|
131
|
+
'IPv4'
|
111
132
|
end
|
112
133
|
|
113
|
-
def resolve_endpoint(options
|
114
|
-
value = options[:
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
)
|
134
|
+
def resolve_endpoint(options)
|
135
|
+
if (value = options[:ip_address])
|
136
|
+
warn('The `:ip_address` option is deprecated. Use `:endpoint` instead.')
|
137
|
+
return value
|
138
|
+
end
|
119
139
|
|
140
|
+
value =
|
141
|
+
options[:endpoint] ||
|
142
|
+
ENV['AWS_EC2_METADATA_SERVICE_ENDPOINT'] ||
|
143
|
+
Aws.shared_config.ec2_metadata_service_endpoint(profile: options[:profile]) ||
|
144
|
+
nil
|
120
145
|
return value if value
|
121
146
|
|
147
|
+
endpoint_mode = resolve_endpoint_mode(options)
|
122
148
|
case endpoint_mode.downcase
|
123
149
|
when 'ipv4' then 'http://169.254.169.254'
|
124
150
|
when 'ipv6' then 'http://[fd00:ec2::254]'
|
125
151
|
else
|
126
|
-
raise ArgumentError,
|
127
|
-
':endpoint_mode is not valid, expected IPv4 or IPv6, '\
|
128
|
-
"got: #{endpoint_mode}"
|
152
|
+
raise ArgumentError, ":endpoint_mode is not valid, expected IPv4 or IPv6, got: #{endpoint_mode}"
|
129
153
|
end
|
130
154
|
end
|
131
155
|
|
132
156
|
def resolve_disable_v1(options)
|
133
|
-
value =
|
134
|
-
|
135
|
-
|
136
|
-
profile: options[:profile]
|
137
|
-
|
138
|
-
value
|
139
|
-
Aws::Util.str_2_bool(value) || false
|
157
|
+
value =
|
158
|
+
options[:disable_imds_v1] ||
|
159
|
+
ENV['AWS_EC2_METADATA_V1_DISABLED'] ||
|
160
|
+
Aws.shared_config.ec2_metadata_v1_disabled(profile: options[:profile]) ||
|
161
|
+
'false'
|
162
|
+
Aws::Util.str_2_bool(value.to_s.downcase)
|
140
163
|
end
|
141
164
|
|
142
|
-
def
|
165
|
+
def resolve_backoff(backoff)
|
143
166
|
case backoff
|
144
167
|
when Proc then backoff
|
145
168
|
when Numeric then ->(_) { sleep(backoff) }
|
@@ -153,98 +176,74 @@ module Aws
|
|
153
176
|
return
|
154
177
|
end
|
155
178
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
@credentials = Credentials.new(
|
164
|
-
c['AccessKeyId'],
|
165
|
-
c['SecretAccessKey'],
|
166
|
-
c['Token']
|
167
|
-
)
|
168
|
-
@expiration = c['Expiration'] ? Time.iso8601(c['Expiration']) : nil
|
169
|
-
if @expiration && @expiration < Time.now
|
170
|
-
@no_refresh_until = Time.now + refresh_offset
|
171
|
-
warn_expired_credentials
|
172
|
-
end
|
173
|
-
else
|
174
|
-
# credentials are already set, update them only if the new ones are not empty
|
175
|
-
if !c['AccessKeyId'] || c['AccessKeyId'].empty?
|
176
|
-
# error getting new credentials
|
177
|
-
@no_refresh_until = Time.now + refresh_offset
|
178
|
-
warn_expired_credentials
|
179
|
-
else
|
180
|
-
@credentials = Credentials.new(
|
181
|
-
c['AccessKeyId'],
|
182
|
-
c['SecretAccessKey'],
|
183
|
-
c['Token']
|
184
|
-
)
|
185
|
-
@expiration = c['Expiration'] ? Time.iso8601(c['Expiration']) : nil
|
186
|
-
if @expiration && @expiration < Time.now
|
187
|
-
@no_refresh_until = Time.now + refresh_offset
|
188
|
-
warn_expired_credentials
|
189
|
-
end
|
190
|
-
end
|
179
|
+
new_creds =
|
180
|
+
begin
|
181
|
+
# Retry loading credentials up to 3 times is the instance metadata
|
182
|
+
# service is responding but is returning invalid JSON documents
|
183
|
+
# in response to the GET profile credentials call.
|
184
|
+
retry_errors([Aws::Json::ParseError], max_retries: 3) do
|
185
|
+
Aws::Json.load(retrieve_credentials.to_s)
|
191
186
|
end
|
187
|
+
rescue Aws::Json::ParseError
|
188
|
+
raise Aws::Errors::MetadataParserError
|
192
189
|
end
|
193
|
-
|
194
|
-
|
190
|
+
|
191
|
+
if @credentials&.set? && empty_credentials?(new_creds)
|
192
|
+
# credentials are already set, but there was an error getting new credentials
|
193
|
+
# so don't update the credentials and use stale ones (static stability)
|
194
|
+
@no_refresh_until = Time.now + rand(300..360)
|
195
|
+
warn_expired_credentials
|
196
|
+
else
|
197
|
+
# credentials are empty or successfully retrieved, update them
|
198
|
+
update_credentials(new_creds)
|
195
199
|
end
|
196
200
|
end
|
197
201
|
|
198
|
-
def
|
202
|
+
def retrieve_credentials
|
199
203
|
# Retry loading credentials a configurable number of times if
|
200
204
|
# the instance metadata service is not responding.
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
# disable insecure flow if we couldn't get token
|
213
|
-
# and imds v1 is disabled
|
214
|
-
raise TokenRetrivalError if token.nil? && @disable_imds_v1
|
215
|
-
|
216
|
-
_get_credentials(conn, token)
|
217
|
-
end
|
205
|
+
begin
|
206
|
+
retry_errors(NETWORK_ERRORS, max_retries: @retries) do
|
207
|
+
open_connection do |conn|
|
208
|
+
# attempt to fetch token to start secure flow first
|
209
|
+
# and rescue to failover
|
210
|
+
fetch_token(conn) unless @imds_v1_fallback || (@token && !@token.expired?)
|
211
|
+
|
212
|
+
# disable insecure flow if we couldn't get token and imds v1 is disabled
|
213
|
+
raise TokenRetrivalError if @token.nil? && @disable_imds_v1
|
214
|
+
|
215
|
+
fetch_credentials(conn)
|
218
216
|
end
|
219
|
-
rescue => e
|
220
|
-
warn("Error retrieving instance profile credentials: #{e}")
|
221
|
-
'{}'
|
222
217
|
end
|
218
|
+
rescue StandardError => e
|
219
|
+
warn("Error retrieving instance profile credentials: #{e}")
|
220
|
+
'{}'
|
223
221
|
end
|
224
222
|
end
|
225
223
|
|
224
|
+
def update_credentials(creds)
|
225
|
+
@credentials = Credentials.new(creds['AccessKeyId'], creds['SecretAccessKey'], creds['Token'])
|
226
|
+
@expiration = creds['Expiration'] ? Time.iso8601(creds['Expiration']) : nil
|
227
|
+
return unless @expiration && @expiration < Time.now
|
228
|
+
|
229
|
+
@no_refresh_until = Time.now + rand(300..360)
|
230
|
+
warn_expired_credentials
|
231
|
+
end
|
232
|
+
|
226
233
|
def fetch_token(conn)
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
token_value, ttl = http_put(
|
231
|
-
conn, METADATA_TOKEN_PATH, @token_ttl
|
232
|
-
)
|
233
|
-
@token = Token.new(token_value, ttl, created_time) if token_value && ttl
|
234
|
-
end
|
235
|
-
end
|
234
|
+
created_time = Time.now
|
235
|
+
token_value, ttl = http_put(conn)
|
236
|
+
@token = Token.new(token_value, ttl, created_time) if token_value && ttl
|
236
237
|
rescue *NETWORK_ERRORS
|
237
238
|
# token attempt failed, reset token
|
238
239
|
# fallback to non-token mode
|
239
|
-
@token = nil
|
240
240
|
@imds_v1_fallback = true
|
241
241
|
end
|
242
242
|
|
243
|
-
|
244
|
-
|
245
|
-
metadata = http_get(conn, METADATA_PATH_BASE, token)
|
243
|
+
def fetch_credentials(conn)
|
244
|
+
metadata = http_get(conn, METADATA_PATH_BASE)
|
246
245
|
profile_name = metadata.lines.first.strip
|
247
|
-
http_get(conn, METADATA_PATH_BASE + profile_name
|
246
|
+
http_get(conn, METADATA_PATH_BASE + profile_name)
|
248
247
|
rescue TokenExpiredError
|
249
248
|
# Token has expired, reset it
|
250
249
|
# The next retry should fetch it
|
@@ -257,10 +256,6 @@ module Aws
|
|
257
256
|
@token && !@token.expired?
|
258
257
|
end
|
259
258
|
|
260
|
-
def _metadata_disabled?
|
261
|
-
ENV.fetch('AWS_EC2_METADATA_DISABLED', 'false').downcase == 'true'
|
262
|
-
end
|
263
|
-
|
264
259
|
def open_connection
|
265
260
|
uri = URI.parse(@endpoint)
|
266
261
|
http = Net::HTTP.new(uri.hostname || @endpoint, uri.port || @port)
|
@@ -272,9 +267,9 @@ module Aws
|
|
272
267
|
end
|
273
268
|
|
274
269
|
# GET request fetch profile and credentials
|
275
|
-
def http_get(connection, path
|
270
|
+
def http_get(connection, path)
|
276
271
|
headers = { 'User-Agent' => "aws-sdk-ruby3/#{CORE_GEM_VERSION}" }
|
277
|
-
headers['x-aws-ec2-metadata-token'] = token if token
|
272
|
+
headers['x-aws-ec2-metadata-token'] = @token.value if @token
|
278
273
|
response = connection.request(Net::HTTP::Get.new(path, headers))
|
279
274
|
|
280
275
|
case response.code.to_i
|
@@ -288,12 +283,12 @@ module Aws
|
|
288
283
|
end
|
289
284
|
|
290
285
|
# PUT request fetch token with ttl
|
291
|
-
def http_put(connection
|
286
|
+
def http_put(connection)
|
292
287
|
headers = {
|
293
288
|
'User-Agent' => "aws-sdk-ruby3/#{CORE_GEM_VERSION}",
|
294
|
-
'x-aws-ec2-metadata-token-ttl-seconds' =>
|
289
|
+
'x-aws-ec2-metadata-token-ttl-seconds' => @token_ttl.to_s
|
295
290
|
}
|
296
|
-
response = connection.request(Net::HTTP::Put.new(
|
291
|
+
response = connection.request(Net::HTTP::Put.new(METADATA_TOKEN_PATH, headers))
|
297
292
|
case response.code.to_i
|
298
293
|
when 200
|
299
294
|
[
|
@@ -322,18 +317,12 @@ module Aws
|
|
322
317
|
end
|
323
318
|
|
324
319
|
def warn_expired_credentials
|
325
|
-
warn(
|
326
|
-
|
327
|
-
"will be attempted again in 5 minutes.")
|
328
|
-
end
|
329
|
-
|
330
|
-
def empty_credentials?(creds)
|
331
|
-
!creds || !creds.access_key_id || creds.access_key_id.empty?
|
320
|
+
warn('Attempting credential expiration extension due to a credential service availability issue. '\
|
321
|
+
'A refresh of these credentials will be attempted again in 5 minutes.')
|
332
322
|
end
|
333
323
|
|
334
|
-
|
335
|
-
|
336
|
-
300 + rand(0..60)
|
324
|
+
def empty_credentials?(creds_hash)
|
325
|
+
!creds_hash['AccessKeyId'] || creds_hash['AccessKeyId'].empty?
|
337
326
|
end
|
338
327
|
|
339
328
|
# @api private
|
data/lib/aws-sdk-sso/client.rb
CHANGED
data/lib/aws-sdk-sso.rb
CHANGED
data/lib/aws-sdk-ssooidc.rb
CHANGED
data/lib/aws-sdk-sts/client.rb
CHANGED
data/lib/aws-sdk-sts.rb
CHANGED
@@ -5,7 +5,7 @@ require 'stringio'
|
|
5
5
|
module Seahorse
|
6
6
|
module Client
|
7
7
|
class RequestContext
|
8
|
-
|
8
|
+
# @param [Hash] options
|
9
9
|
# @option options [required,Symbol] :operation_name (nil)
|
10
10
|
# @option options [required,Model::Operation] :operation (nil)
|
11
11
|
# @option options [Model::Authorizer] :authorizer (nil)
|
@@ -16,7 +16,7 @@ module Seahorse
|
|
16
16
|
# @option options [Http::Response] :http_response (Http::Response.new)
|
17
17
|
# @option options [Integer] :retries (0)
|
18
18
|
# @option options [Aws::Telemetry::TracerBase] :tracer (Aws::Telemetry::NoOpTracer.new)
|
19
|
-
# @
|
19
|
+
# @option options [Hash] :metadata ({})
|
20
20
|
def initialize(options = {})
|
21
21
|
@operation_name = options[:operation_name]
|
22
22
|
@operation = options[:operation]
|