aws-sdk-core 3.171.1 → 3.234.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.
Files changed (199) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +787 -0
  3. data/VERSION +1 -1
  4. data/lib/aws-defaults/default_configuration.rb +5 -6
  5. data/lib/aws-defaults.rb +4 -1
  6. data/lib/aws-sdk-core/arn.rb +1 -3
  7. data/lib/aws-sdk-core/assume_role_credentials.rb +21 -13
  8. data/lib/aws-sdk-core/assume_role_web_identity_credentials.rb +16 -9
  9. data/lib/aws-sdk-core/binary/decode_handler.rb +3 -9
  10. data/lib/aws-sdk-core/binary/encode_handler.rb +1 -1
  11. data/lib/aws-sdk-core/binary/event_builder.rb +34 -37
  12. data/lib/aws-sdk-core/binary/event_stream_decoder.rb +1 -0
  13. data/lib/aws-sdk-core/binary/event_stream_encoder.rb +4 -3
  14. data/lib/aws-sdk-core/cbor/decoder.rb +308 -0
  15. data/lib/aws-sdk-core/cbor/encoder.rb +243 -0
  16. data/lib/aws-sdk-core/cbor.rb +53 -0
  17. data/lib/aws-sdk-core/client_side_monitoring.rb +9 -0
  18. data/lib/aws-sdk-core/client_stubs.rb +33 -55
  19. data/lib/aws-sdk-core/credential_provider.rb +8 -1
  20. data/lib/aws-sdk-core/credential_provider_chain.rb +74 -25
  21. data/lib/aws-sdk-core/credentials.rb +19 -6
  22. data/lib/aws-sdk-core/ec2_metadata.rb +1 -1
  23. data/lib/aws-sdk-core/ecs_credentials.rb +92 -24
  24. data/lib/aws-sdk-core/endpoints/endpoint.rb +3 -1
  25. data/lib/aws-sdk-core/endpoints/matchers.rb +21 -19
  26. data/lib/aws-sdk-core/endpoints.rb +106 -22
  27. data/lib/aws-sdk-core/error_handler.rb +46 -0
  28. data/lib/aws-sdk-core/errors.rb +14 -5
  29. data/lib/aws-sdk-core/event_emitter.rb +1 -17
  30. data/lib/aws-sdk-core/ini_parser.rb +7 -0
  31. data/lib/aws-sdk-core/instance_profile_credentials.rb +168 -155
  32. data/lib/aws-sdk-core/json/builder.rb +8 -1
  33. data/lib/aws-sdk-core/json/error_handler.rb +29 -13
  34. data/lib/aws-sdk-core/json/handler.rb +13 -6
  35. data/lib/aws-sdk-core/json/json_engine.rb +3 -1
  36. data/lib/aws-sdk-core/json/oj_engine.rb +7 -1
  37. data/lib/aws-sdk-core/json/parser.rb +33 -3
  38. data/lib/aws-sdk-core/json.rb +43 -14
  39. data/lib/aws-sdk-core/log/formatter.rb +6 -0
  40. data/lib/aws-sdk-core/log/param_filter.rb +2 -2
  41. data/lib/aws-sdk-core/log/param_formatter.rb +7 -3
  42. data/lib/aws-sdk-core/log.rb +10 -0
  43. data/lib/aws-sdk-core/lru_cache.rb +75 -0
  44. data/lib/aws-sdk-core/pageable_response.rb +3 -1
  45. data/lib/aws-sdk-core/param_validator.rb +9 -4
  46. data/lib/aws-sdk-core/plugins/bearer_authorization.rb +2 -0
  47. data/lib/aws-sdk-core/plugins/checksum_algorithm.rb +348 -169
  48. data/lib/aws-sdk-core/plugins/client_metrics_plugin.rb +1 -1
  49. data/lib/aws-sdk-core/plugins/client_metrics_send_plugin.rb +14 -2
  50. data/lib/aws-sdk-core/plugins/credentials_configuration.rb +78 -56
  51. data/lib/aws-sdk-core/plugins/endpoint_pattern.rb +40 -32
  52. data/lib/aws-sdk-core/plugins/global_configuration.rb +8 -9
  53. data/lib/aws-sdk-core/plugins/http_checksum.rb +3 -8
  54. data/lib/aws-sdk-core/plugins/invocation_id.rb +1 -11
  55. data/lib/aws-sdk-core/plugins/logging.rb +2 -0
  56. data/lib/aws-sdk-core/plugins/protocols/api_gateway.rb +3 -1
  57. data/lib/aws-sdk-core/plugins/protocols/ec2.rb +2 -24
  58. data/lib/aws-sdk-core/plugins/protocols/json_rpc.rb +6 -8
  59. data/lib/aws-sdk-core/plugins/protocols/query.rb +4 -2
  60. data/lib/aws-sdk-core/plugins/protocols/rest_json.rb +3 -15
  61. data/lib/aws-sdk-core/plugins/protocols/rest_xml.rb +3 -0
  62. data/lib/aws-sdk-core/plugins/protocols/rpc_v2.rb +17 -0
  63. data/lib/aws-sdk-core/plugins/regional_endpoint.rb +162 -37
  64. data/lib/aws-sdk-core/plugins/request_compression.rb +226 -0
  65. data/lib/aws-sdk-core/plugins/retry_errors.rb +12 -3
  66. data/lib/aws-sdk-core/plugins/sign.rb +55 -33
  67. data/lib/aws-sdk-core/plugins/signature_v2.rb +2 -1
  68. data/lib/aws-sdk-core/plugins/signature_v4.rb +2 -1
  69. data/lib/aws-sdk-core/plugins/stub_responses.rb +59 -9
  70. data/lib/aws-sdk-core/plugins/telemetry.rb +75 -0
  71. data/lib/aws-sdk-core/plugins/transfer_encoding.rb +16 -9
  72. data/lib/aws-sdk-core/plugins/user_agent.rb +192 -14
  73. data/lib/aws-sdk-core/plugins.rb +39 -0
  74. data/lib/aws-sdk-core/process_credentials.rb +48 -29
  75. data/lib/aws-sdk-core/query/ec2_handler.rb +27 -0
  76. data/lib/aws-sdk-core/query/ec2_param_builder.rb +5 -7
  77. data/lib/aws-sdk-core/query/handler.rb +4 -4
  78. data/lib/aws-sdk-core/query/param_builder.rb +2 -2
  79. data/lib/aws-sdk-core/query.rb +2 -1
  80. data/lib/aws-sdk-core/refreshing_credentials.rb +20 -23
  81. data/lib/aws-sdk-core/resources.rb +8 -0
  82. data/lib/aws-sdk-core/rest/content_type_handler.rb +60 -0
  83. data/lib/aws-sdk-core/rest/handler.rb +3 -4
  84. data/lib/aws-sdk-core/rest/request/body.rb +32 -5
  85. data/lib/aws-sdk-core/rest/request/endpoint.rb +24 -4
  86. data/lib/aws-sdk-core/rest/request/headers.rb +15 -7
  87. data/lib/aws-sdk-core/rest/request/querystring_builder.rb +62 -36
  88. data/lib/aws-sdk-core/rest/response/body.rb +15 -1
  89. data/lib/aws-sdk-core/rest/response/header_list_parser.rb +79 -0
  90. data/lib/aws-sdk-core/rest/response/headers.rb +8 -3
  91. data/lib/aws-sdk-core/rest.rb +1 -0
  92. data/lib/aws-sdk-core/rpc_v2/builder.rb +62 -0
  93. data/lib/aws-sdk-core/rpc_v2/cbor_engine.rb +18 -0
  94. data/lib/aws-sdk-core/rpc_v2/content_type_handler.rb +47 -0
  95. data/lib/aws-sdk-core/rpc_v2/error_handler.rb +95 -0
  96. data/lib/aws-sdk-core/rpc_v2/handler.rb +79 -0
  97. data/lib/aws-sdk-core/rpc_v2/parser.rb +98 -0
  98. data/lib/aws-sdk-core/rpc_v2.rb +69 -0
  99. data/lib/aws-sdk-core/shared_config.rb +135 -39
  100. data/lib/aws-sdk-core/shared_credentials.rb +1 -7
  101. data/lib/aws-sdk-core/sso_credentials.rb +6 -3
  102. data/lib/aws-sdk-core/static_token_provider.rb +1 -2
  103. data/lib/aws-sdk-core/stubbing/protocols/ec2.rb +12 -11
  104. data/lib/aws-sdk-core/stubbing/protocols/json.rb +11 -10
  105. data/lib/aws-sdk-core/stubbing/protocols/query.rb +7 -6
  106. data/lib/aws-sdk-core/stubbing/protocols/rest.rb +2 -1
  107. data/lib/aws-sdk-core/stubbing/protocols/rest_json.rb +9 -8
  108. data/lib/aws-sdk-core/stubbing/protocols/rest_xml.rb +6 -5
  109. data/lib/aws-sdk-core/stubbing/protocols/rpc_v2.rb +39 -0
  110. data/lib/aws-sdk-core/stubbing/stub_data.rb +11 -0
  111. data/lib/aws-sdk-core/stubbing.rb +22 -0
  112. data/lib/aws-sdk-core/telemetry/base.rb +177 -0
  113. data/lib/aws-sdk-core/telemetry/no_op.rb +70 -0
  114. data/lib/aws-sdk-core/telemetry/otel.rb +235 -0
  115. data/lib/aws-sdk-core/telemetry/span_kind.rb +22 -0
  116. data/lib/aws-sdk-core/telemetry/span_status.rb +59 -0
  117. data/lib/aws-sdk-core/telemetry.rb +78 -0
  118. data/lib/aws-sdk-core/token.rb +3 -3
  119. data/lib/aws-sdk-core/token_provider.rb +4 -0
  120. data/lib/aws-sdk-core/token_provider_chain.rb +2 -6
  121. data/lib/aws-sdk-core/util.rb +41 -1
  122. data/lib/aws-sdk-core/waiters/poller.rb +12 -5
  123. data/lib/aws-sdk-core/xml/builder.rb +17 -9
  124. data/lib/aws-sdk-core/xml/error_handler.rb +35 -43
  125. data/lib/aws-sdk-core/xml/parser/frame.rb +4 -20
  126. data/lib/aws-sdk-core/xml/parser/stack.rb +2 -0
  127. data/lib/aws-sdk-core/xml/parser.rb +2 -6
  128. data/lib/aws-sdk-core.rb +82 -107
  129. data/lib/aws-sdk-sso/client.rb +205 -92
  130. data/lib/aws-sdk-sso/client_api.rb +7 -0
  131. data/lib/aws-sdk-sso/endpoint_parameters.rb +9 -6
  132. data/lib/aws-sdk-sso/endpoint_provider.rb +30 -28
  133. data/lib/aws-sdk-sso/endpoints.rb +3 -54
  134. data/lib/aws-sdk-sso/plugins/endpoints.rb +23 -22
  135. data/lib/aws-sdk-sso/types.rb +1 -0
  136. data/lib/aws-sdk-sso.rb +15 -11
  137. data/lib/aws-sdk-ssooidc/client.rb +625 -125
  138. data/lib/aws-sdk-ssooidc/client_api.rb +94 -1
  139. data/lib/aws-sdk-ssooidc/endpoint_parameters.rb +9 -6
  140. data/lib/aws-sdk-ssooidc/endpoint_provider.rb +30 -28
  141. data/lib/aws-sdk-ssooidc/endpoints.rb +3 -40
  142. data/lib/aws-sdk-ssooidc/errors.rb +62 -0
  143. data/lib/aws-sdk-ssooidc/plugins/endpoints.rb +23 -20
  144. data/lib/aws-sdk-ssooidc/types.rb +419 -53
  145. data/lib/aws-sdk-ssooidc.rb +15 -11
  146. data/lib/aws-sdk-sts/client.rb +526 -243
  147. data/lib/aws-sdk-sts/client_api.rb +48 -9
  148. data/lib/aws-sdk-sts/customizations.rb +5 -2
  149. data/lib/aws-sdk-sts/endpoint_parameters.rb +10 -9
  150. data/lib/aws-sdk-sts/endpoint_provider.rb +82 -84
  151. data/lib/aws-sdk-sts/endpoints.rb +3 -118
  152. data/lib/aws-sdk-sts/errors.rb +15 -0
  153. data/lib/aws-sdk-sts/plugins/endpoints.rb +23 -30
  154. data/lib/aws-sdk-sts/presigner.rb +3 -7
  155. data/lib/aws-sdk-sts/types.rb +217 -36
  156. data/lib/aws-sdk-sts.rb +15 -11
  157. data/lib/seahorse/client/async_base.rb +4 -5
  158. data/lib/seahorse/client/async_response.rb +19 -0
  159. data/lib/seahorse/client/base.rb +18 -21
  160. data/lib/seahorse/client/configuration.rb +0 -4
  161. data/lib/seahorse/client/h2/connection.rb +18 -28
  162. data/lib/seahorse/client/h2/handler.rb +14 -3
  163. data/lib/seahorse/client/handler.rb +1 -1
  164. data/lib/seahorse/client/http/response.rb +1 -1
  165. data/lib/seahorse/client/net_http/connection_pool.rb +15 -12
  166. data/lib/seahorse/client/net_http/handler.rb +21 -9
  167. data/lib/seahorse/client/net_http/patches.rb +1 -4
  168. data/lib/seahorse/client/networking_error.rb +1 -1
  169. data/lib/seahorse/client/plugin.rb +9 -0
  170. data/lib/seahorse/client/plugins/endpoint.rb +0 -1
  171. data/lib/seahorse/client/plugins/h2.rb +4 -4
  172. data/lib/seahorse/client/plugins/net_http.rb +57 -16
  173. data/lib/seahorse/client/plugins/request_callback.rb +31 -0
  174. data/lib/seahorse/client/request_context.rb +9 -2
  175. data/lib/seahorse/client/response.rb +8 -0
  176. data/lib/seahorse/model/operation.rb +3 -0
  177. data/lib/seahorse/model/shapes.rb +2 -2
  178. data/lib/seahorse/util.rb +2 -1
  179. data/sig/aws-sdk-core/async_client_stubs.rbs +21 -0
  180. data/sig/aws-sdk-core/client_stubs.rbs +10 -0
  181. data/sig/aws-sdk-core/errors.rbs +22 -0
  182. data/sig/aws-sdk-core/resources/collection.rbs +21 -0
  183. data/sig/aws-sdk-core/structure.rbs +4 -0
  184. data/sig/aws-sdk-core/telemetry/base.rbs +46 -0
  185. data/sig/aws-sdk-core/telemetry/otel.rbs +22 -0
  186. data/sig/aws-sdk-core/telemetry/span_kind.rbs +15 -0
  187. data/sig/aws-sdk-core/telemetry/span_status.rbs +24 -0
  188. data/sig/aws-sdk-core/waiters/errors.rbs +20 -0
  189. data/sig/aws-sdk-core.rbs +7 -0
  190. data/sig/seahorse/client/async_base.rbs +18 -0
  191. data/sig/seahorse/client/base.rbs +25 -0
  192. data/sig/seahorse/client/handler_builder.rbs +16 -0
  193. data/sig/seahorse/client/response.rbs +61 -0
  194. metadata +106 -23
  195. /data/lib/aws-sdk-core/xml/parser/{engines/libxml.rb → libxml_engine.rb} +0 -0
  196. /data/lib/aws-sdk-core/xml/parser/{engines/nokogiri.rb → nokogiri_engine.rb} +0 -0
  197. /data/lib/aws-sdk-core/xml/parser/{engines/oga.rb → oga_engine.rb} +0 -0
  198. /data/lib/aws-sdk-core/xml/parser/{engines/ox.rb → ox_engine.rb} +0 -0
  199. /data/lib/aws-sdk-core/xml/parser/{engines/rexml.rb → rexml_engine.rb} +0 -0
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'cbor'
4
+ require_relative 'rpc_v2/builder'
5
+ require_relative 'rpc_v2/content_type_handler'
6
+ require_relative 'rpc_v2/error_handler'
7
+ require_relative 'rpc_v2/handler'
8
+ require_relative 'rpc_v2/parser'
9
+
10
+ module Aws
11
+ # @api private
12
+ module RpcV2
13
+ class << self
14
+ # @param [Symbol,Class] engine
15
+ # Must be one of the following values:
16
+ #
17
+ # * :cbor
18
+ #
19
+ def engine=(engine)
20
+ @engine = Class === engine ? engine : load_engine(engine)
21
+ end
22
+
23
+ # @return [Class] Returns the default engine.
24
+ # One of:
25
+ #
26
+ # * {CborEngine}
27
+ #
28
+ def engine
29
+ set_default_engine unless @engine
30
+ @engine
31
+ end
32
+
33
+ def encode(data)
34
+ @engine.encode(data)
35
+ end
36
+
37
+ def decode(bytes)
38
+ bytes.force_encoding(Encoding::BINARY)
39
+ @engine.decode(bytes)
40
+ end
41
+
42
+ def set_default_engine
43
+ [:cbor].each do |name|
44
+ @engine ||= try_load_engine(name)
45
+ end
46
+
47
+ unless @engine
48
+ raise 'Unable to find a compatible cbor library.'
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def load_engine(name)
55
+ require "aws-sdk-core/rpc_v2/#{name}_engine"
56
+ const_name = name[0].upcase + name[1..-1] + 'Engine'
57
+ const_get(const_name)
58
+ end
59
+
60
+ def try_load_engine(name)
61
+ load_engine(name)
62
+ rescue LoadError
63
+ false
64
+ end
65
+ end
66
+
67
+ set_default_engine
68
+ end
69
+ end
@@ -138,7 +138,11 @@ module Aws
138
138
  role_session_name: entry['role_session_name']
139
139
  }
140
140
  cfg[:region] = opts[:region] if opts[:region]
141
- AssumeRoleWebIdentityCredentials.new(cfg)
141
+ with_metrics('CREDENTIALS_PROFILE_STS_WEB_ID_TOKEN') do
142
+ creds = AssumeRoleWebIdentityCredentials.new(cfg)
143
+ creds.metrics << 'CREDENTIALS_PROFILE_STS_WEB_ID_TOKEN'
144
+ creds
145
+ end
142
146
  end
143
147
  end
144
148
  end
@@ -167,6 +171,26 @@ module Aws
167
171
  token
168
172
  end
169
173
 
174
+ # Source a custom configured endpoint from the shared configuration file
175
+ #
176
+ # @param [Hash] opts
177
+ # @option opts [String] :profile
178
+ # @option opts [String] :service_id
179
+ def configured_endpoint(opts = {})
180
+ # services section is only allowed in the shared config file (not credentials)
181
+ profile = opts[:profile] || @profile_name
182
+ service_id = opts[:service_id]&.gsub(" ", "_")&.downcase
183
+ if @parsed_config && (prof_config = @parsed_config[profile])
184
+ services_section_name = prof_config['services']
185
+ if (services_config = @parsed_config["services #{services_section_name}"]) &&
186
+ (service_config = services_config[service_id])
187
+ return service_config['endpoint_url'] if service_config['endpoint_url']
188
+ end
189
+ return prof_config['endpoint_url']
190
+ end
191
+ nil
192
+ end
193
+
170
194
  # Add an accessor method (similar to attr_reader) to return a configuration value
171
195
  # Uses the get_config_value below to control where
172
196
  # values are loaded from
@@ -178,6 +202,9 @@ module Aws
178
202
 
179
203
  config_reader(
180
204
  :region,
205
+ :account_id_endpoint_mode,
206
+ :auth_scheme_preference,
207
+ :sigv4a_signing_region_set,
181
208
  :ca_bundle,
182
209
  :credential_process,
183
210
  :endpoint_discovery_enabled,
@@ -185,10 +212,14 @@ module Aws
185
212
  :use_fips_endpoint,
186
213
  :ec2_metadata_service_endpoint,
187
214
  :ec2_metadata_service_endpoint_mode,
215
+ :ec2_metadata_v1_disabled,
216
+ :disable_host_prefix_injection,
188
217
  :max_attempts,
189
218
  :retry_mode,
190
219
  :adaptive_retry_wait_to_fill,
191
220
  :correct_clock_skew,
221
+ :request_checksum_calculation,
222
+ :response_checksum_validation,
192
223
  :csm_client_id,
193
224
  :csm_enabled,
194
225
  :csm_host,
@@ -197,7 +228,12 @@ module Aws
197
228
  :s3_use_arn_region,
198
229
  :s3_us_east_1_regional_endpoint,
199
230
  :s3_disable_multiregion_access_points,
200
- :defaults_mode
231
+ :s3_disable_express_session_auth,
232
+ :defaults_mode,
233
+ :sdk_ua_app_id,
234
+ :disable_request_compression,
235
+ :request_min_compression_size_bytes,
236
+ :ignore_configured_endpoint_urls
201
237
  )
202
238
 
203
239
  private
@@ -225,8 +261,8 @@ module Aws
225
261
  'provide only source_profile or credential_source, not both.'
226
262
  elsif opts[:source_profile]
227
263
  opts[:visited_profiles] ||= Set.new
228
- opts[:credentials] = resolve_source_profile(opts[:source_profile], opts)
229
- if opts[:credentials]
264
+ provider = resolve_source_profile(opts[:source_profile], opts)
265
+ if provider && (opts[:credentials] = provider.credentials)
230
266
  opts[:role_session_name] ||= prof_cfg['role_session_name']
231
267
  opts[:role_session_name] ||= 'default_session'
232
268
  opts[:role_arn] ||= prof_cfg['role_arn']
@@ -235,17 +271,28 @@ module Aws
235
271
  opts[:serial_number] ||= prof_cfg['mfa_serial']
236
272
  opts[:profile] = opts.delete(:source_profile)
237
273
  opts.delete(:visited_profiles)
238
- AssumeRoleCredentials.new(opts)
274
+
275
+ metrics = provider.metrics
276
+ if provider.is_a?(AssumeRoleCredentials)
277
+ opts[:credentials] = provider
278
+ metrics.delete('CREDENTIALS_STS_ASSUME_ROLE')
279
+ else
280
+ metrics << 'CREDENTIALS_PROFILE_SOURCE_PROFILE'
281
+ end
282
+ # Set the original credentials metrics to [] to prevent duplicate metrics during sign plugin
283
+ opts[:credentials].metrics = []
284
+ with_metrics(metrics) do
285
+ creds = AssumeRoleCredentials.new(opts)
286
+ creds.metrics.push(*metrics)
287
+ creds
288
+ end
239
289
  else
240
290
  raise Errors::NoSourceProfileError,
241
291
  "Profile #{profile} has a role_arn, and source_profile, but the"\
242
292
  ' source_profile does not have credentials.'
243
293
  end
244
294
  elsif credential_source
245
- opts[:credentials] = credentials_from_source(
246
- credential_source,
247
- chain_config
248
- )
295
+ opts[:credentials] = credentials_from_source(credential_source, chain_config)
249
296
  if opts[:credentials]
250
297
  opts[:role_session_name] ||= prof_cfg['role_session_name']
251
298
  opts[:role_session_name] ||= 'default_session'
@@ -254,7 +301,16 @@ module Aws
254
301
  opts[:external_id] ||= prof_cfg['external_id']
255
302
  opts[:serial_number] ||= prof_cfg['mfa_serial']
256
303
  opts.delete(:source_profile) # Cleanup
257
- AssumeRoleCredentials.new(opts)
304
+
305
+ metrics = opts[:credentials].metrics
306
+ metrics << 'CREDENTIALS_PROFILE_NAMED_PROVIDER'
307
+ # Set the original credentials metrics to [] to prevent duplicate metrics during sign plugin
308
+ opts[:credentials].metrics = []
309
+ with_metrics(metrics) do
310
+ creds = AssumeRoleCredentials.new(opts)
311
+ creds.metrics.push(*metrics)
312
+ creds
313
+ end
258
314
  else
259
315
  raise Errors::NoSourceCredentials,
260
316
  "Profile #{profile} could not get source credentials from"\
@@ -282,12 +338,24 @@ module Aws
282
338
  elsif profile_config && profile_config['source_profile']
283
339
  opts.delete(:source_profile)
284
340
  assume_role_credentials_from_config(opts.merge(profile: profile))
285
- elsif (provider = assume_role_web_identity_credentials_from_config(opts.merge(profile: profile)))
286
- provider.credentials if provider.credentials.set?
341
+ elsif (provider = assume_role_web_identity_credentials_from_config_with_metrics(opts.merge(profile: profile)))
342
+ provider if provider.credentials.set?
287
343
  elsif (provider = assume_role_process_credentials_from_config(profile))
288
- provider.credentials if provider.credentials.set?
289
- elsif (provider = sso_credentials_from_config(profile: profile))
290
- provider.credentials if provider.credentials.set?
344
+ provider if provider.credentials.set?
345
+ elsif (provider = sso_credentials_from_config_with_metrics(profile))
346
+ provider if provider.credentials.set?
347
+ end
348
+ end
349
+
350
+ def assume_role_web_identity_credentials_from_config_with_metrics(opts)
351
+ with_metrics('CREDENTIALS_PROFILE_SOURCE_PROFILE') do
352
+ assume_role_web_identity_credentials_from_config(opts)
353
+ end
354
+ end
355
+
356
+ def sso_credentials_from_config_with_metrics(profile)
357
+ with_metrics('CREDENTIALS_PROFILE_SOURCE_PROFILE') do
358
+ sso_credentials_from_config(profile: profile)
291
359
  end
292
360
  end
293
361
 
@@ -301,6 +369,15 @@ module Aws
301
369
  )
302
370
  when 'EcsContainer'
303
371
  ECSCredentials.new
372
+ when 'Environment'
373
+ creds = Credentials.new(
374
+ ENV['AWS_ACCESS_KEY_ID'],
375
+ ENV['AWS_SECRET_ACCESS_KEY'],
376
+ ENV['AWS_SESSION_TOKEN'],
377
+ account_id: ENV['AWS_ACCOUNT_ID']
378
+ )
379
+ creds.metrics = ['CREDENTIALS_ENV_VARS']
380
+ creds
304
381
  else
305
382
  raise Errors::InvalidCredentialSourceError, "Unsupported credential_source: #{credential_source}"
306
383
  end
@@ -312,7 +389,11 @@ module Aws
312
389
  if @parsed_config
313
390
  credential_process ||= @parsed_config.fetch(profile, {})['credential_process']
314
391
  end
315
- ProcessCredentials.new(credential_process) if credential_process
392
+ if credential_process
393
+ creds = ProcessCredentials.new([credential_process])
394
+ creds.metrics << 'CREDENTIALS_PROFILE_PROCESS'
395
+ creds
396
+ end
316
397
  end
317
398
 
318
399
  def credentials_from_shared(profile, _opts)
@@ -335,12 +416,8 @@ module Aws
335
416
  !(prof_config.keys & SSO_CREDENTIAL_PROFILE_KEYS).empty?
336
417
 
337
418
  if sso_session_name = prof_config['sso_session']
338
- sso_session = cfg["sso-session #{sso_session_name}"]
339
- unless sso_session
340
- raise ArgumentError,
341
- "sso-session #{sso_session_name} must be defined in the config file. " \
342
- "Referenced by profile #{profile}"
343
- end
419
+ sso_session = sso_session(cfg, profile, sso_session_name)
420
+
344
421
  sso_region = sso_session['sso_region']
345
422
  sso_start_url = sso_session['sso_start_url']
346
423
 
@@ -360,13 +437,18 @@ module Aws
360
437
  sso_start_url = prof_config['sso_start_url']
361
438
  end
362
439
 
363
- SSOCredentials.new(
364
- sso_account_id: prof_config['sso_account_id'],
365
- sso_role_name: prof_config['sso_role_name'],
366
- sso_session: prof_config['sso_session'],
367
- sso_region: sso_region,
368
- sso_start_url: prof_config['sso_start_url']
440
+ metric = prof_config['sso_session'] ? 'CREDENTIALS_PROFILE_SSO' : 'CREDENTIALS_PROFILE_SSO_LEGACY'
441
+ with_metrics(metric) do
442
+ creds = SSOCredentials.new(
443
+ sso_account_id: prof_config['sso_account_id'],
444
+ sso_role_name: prof_config['sso_role_name'],
445
+ sso_session: prof_config['sso_session'],
446
+ sso_region: sso_region,
447
+ sso_start_url: sso_start_url
369
448
  )
449
+ creds.metrics << metric
450
+ creds
451
+ end
370
452
  end
371
453
  end
372
454
 
@@ -378,16 +460,7 @@ module Aws
378
460
  !(prof_config.keys & SSO_TOKEN_PROFILE_KEYS).empty?
379
461
 
380
462
  sso_session_name = prof_config['sso_session']
381
- sso_session = cfg["sso-session #{sso_session_name}"]
382
- unless sso_session
383
- raise ArgumentError,
384
- "sso-session #{sso_session_name} must be defined in the config file." \
385
- "Referenced by profile #{profile}"
386
- end
387
-
388
- unless sso_session['sso_region']
389
- raise ArgumentError, "sso-session #{sso_session_name} missing required parameter: sso_region"
390
- end
463
+ sso_session = sso_session(cfg, profile, sso_session_name)
391
464
 
392
465
  SSOTokenProvider.new(
393
466
  sso_session: sso_session_name,
@@ -400,8 +473,10 @@ module Aws
400
473
  creds = Credentials.new(
401
474
  prof_config['aws_access_key_id'],
402
475
  prof_config['aws_secret_access_key'],
403
- prof_config['aws_session_token']
476
+ prof_config['aws_session_token'],
477
+ account_id: prof_config['aws_account_id']
404
478
  )
479
+ creds.metrics = ['CREDENTIALS_PROFILE']
405
480
  creds if creds.set?
406
481
  end
407
482
 
@@ -445,5 +520,26 @@ module Aws
445
520
  ret ||= 'default'
446
521
  ret
447
522
  end
523
+
524
+ def sso_session(cfg, profile, sso_session_name)
525
+ # aws sso-configure may add quotes around sso session names with whitespace
526
+ sso_session = cfg["sso-session #{sso_session_name}"] || cfg["sso-session '#{sso_session_name}'"]
527
+
528
+ unless sso_session
529
+ raise ArgumentError,
530
+ "sso-session #{sso_session_name} must be defined in the config file. " \
531
+ "Referenced by profile #{profile}"
532
+ end
533
+
534
+ unless sso_session['sso_region']
535
+ raise ArgumentError, "sso-session #{sso_session_name} missing required parameter: sso_region"
536
+ end
537
+
538
+ sso_session
539
+ end
540
+
541
+ def with_metrics(metrics, &block)
542
+ Aws::Plugins::UserAgent.metric(*metrics, &block)
543
+ end
448
544
  end
449
545
  end
@@ -7,13 +7,6 @@ module Aws
7
7
 
8
8
  include CredentialProvider
9
9
 
10
- # @api private
11
- KEY_MAP = {
12
- 'aws_access_key_id' => 'access_key_id',
13
- 'aws_secret_access_key' => 'secret_access_key',
14
- 'aws_session_token' => 'session_token',
15
- }
16
-
17
10
  # Constructs a new SharedCredentials object. This will load static
18
11
  # (access_key_id, secret_access_key and session_token) AWS access
19
12
  # credentials from an ini file, which supports profiles. The default
@@ -47,6 +40,7 @@ module Aws
47
40
  )
48
41
  @credentials = config.credentials(profile: @profile_name)
49
42
  end
43
+ @metrics = ['CREDENTIALS_CODE']
50
44
  end
51
45
 
52
46
  # @return [String]
@@ -7,7 +7,7 @@ module Aws
7
7
  # {Aws::SSOTokenProvider} will be used to refresh the token if possible.
8
8
  # This class does NOT implement the SSO login token flow - tokens
9
9
  # must generated separately by running `aws login` from the
10
- # AWS CLI with the correct profile. The `SSOCredentials` will
10
+ # AWS CLI with the correct profile. The {SSOCredentials} will
11
11
  # auto-refresh the AWS credentials from SSO.
12
12
  #
13
13
  # # You must first run aws sso login --profile your-sso-profile
@@ -91,6 +91,7 @@ module Aws
91
91
  client_opts[:credentials] = nil
92
92
  @client = Aws::SSO::Client.new(client_opts)
93
93
  end
94
+ @metrics = ['CREDENTIALS_SSO']
94
95
  else # legacy behavior
95
96
  missing_keys = LEGACY_REQUIRED_OPTS.select { |k| options[k].nil? }
96
97
  unless missing_keys.empty?
@@ -111,6 +112,7 @@ module Aws
111
112
  client_opts[:credentials] = nil
112
113
 
113
114
  @client = options[:client] || Aws::SSO::Client.new(client_opts)
115
+ @metrics = ['CREDENTIALS_SSO_LEGACY']
114
116
  end
115
117
 
116
118
  @async_refresh = true
@@ -156,9 +158,10 @@ module Aws
156
158
  @credentials = Credentials.new(
157
159
  c.access_key_id,
158
160
  c.secret_access_key,
159
- c.session_token
161
+ c.session_token,
162
+ account_id: @sso_account_id
160
163
  )
161
- @expiration = c.expiration
164
+ @expiration = Time.at(c.expiration / 1000.0)
162
165
  end
163
166
 
164
167
  def sso_cache_file
@@ -2,12 +2,11 @@
2
2
 
3
3
  module Aws
4
4
  class StaticTokenProvider
5
-
6
5
  include TokenProvider
7
6
 
8
7
  # @param [String] token
9
8
  # @param [Time] expiration
10
- def initialize(token, expiration=nil)
9
+ def initialize(token, expiration = nil)
11
10
  @token = Token.new(token, expiration)
12
11
  end
13
12
  end
@@ -3,6 +3,7 @@
3
3
  module Aws
4
4
  module Stubbing
5
5
  module Protocols
6
+ # @api private
6
7
  class EC2
7
8
 
8
9
  def stub_data(api, operation, data)
@@ -16,17 +17,17 @@ module Aws
16
17
  end
17
18
 
18
19
  def stub_error(error_code)
19
- http_resp = Seahorse::Client::Http::Response.new
20
- http_resp.status_code = 400
21
- http_resp.body = <<-XML.strip
22
- <ErrorResponse>
23
- <Error>
24
- <Code>#{error_code}</Code>
25
- <Message>stubbed-response-error-message</Message>
26
- </Error>
27
- </ErrorResponse>
20
+ resp = Seahorse::Client::Http::Response.new
21
+ resp.status_code = 400
22
+ resp.body = <<~XML.strip
23
+ <ErrorResponse>
24
+ <Error>
25
+ <Code>#{error_code}</Code>
26
+ <Message>stubbed-response-error-message</Message>
27
+ </Error>
28
+ </ErrorResponse>
28
29
  XML
29
- http_resp
30
+ resp
30
31
  end
31
32
 
32
33
  private
@@ -37,7 +38,7 @@ module Aws
37
38
  xml.shift
38
39
  xml.pop
39
40
  xmlns = "http://ec2.amazonaws.com/doc/#{api.version}/".inspect
40
- xml.unshift(" <requestId>stubbed-request-id</requestId>")
41
+ xml.unshift(' <requestId>stubbed-request-id</requestId>')
41
42
  xml.unshift("<#{operation.name}Response xmlns=#{xmlns}>\n")
42
43
  xml.push("</#{operation.name}Response>\n")
43
44
  xml.join
@@ -3,27 +3,28 @@
3
3
  module Aws
4
4
  module Stubbing
5
5
  module Protocols
6
+ # @api private
6
7
  class Json
7
8
 
8
9
  def stub_data(api, operation, data)
9
10
  resp = Seahorse::Client::Http::Response.new
10
11
  resp.status_code = 200
11
- resp.headers["Content-Type"] = content_type(api)
12
- resp.headers["x-amzn-RequestId"] = "stubbed-request-id"
12
+ resp.headers['Content-Type'] = content_type(api)
13
+ resp.headers['x-amzn-RequestId'] = 'stubbed-request-id'
13
14
  resp.body = build_body(operation, data)
14
15
  resp
15
16
  end
16
17
 
17
18
  def stub_error(error_code)
18
- http_resp = Seahorse::Client::Http::Response.new
19
- http_resp.status_code = 400
20
- http_resp.body = <<-JSON.strip
21
- {
22
- "code": #{error_code.inspect},
23
- "message": "stubbed-response-error-message"
24
- }
19
+ resp = Seahorse::Client::Http::Response.new
20
+ resp.status_code = 400
21
+ resp.body = <<~JSON.strip
22
+ {
23
+ "code": #{error_code.inspect},
24
+ "message": "stubbed-response-error-message"
25
+ }
25
26
  JSON
26
- http_resp
27
+ resp
27
28
  end
28
29
 
29
30
  private
@@ -3,6 +3,7 @@
3
3
  module Aws
4
4
  module Stubbing
5
5
  module Protocols
6
+ # @api private
6
7
  class Query
7
8
 
8
9
  def stub_data(api, operation, data)
@@ -13,10 +14,10 @@ module Aws
13
14
  end
14
15
 
15
16
  def stub_error(error_code)
16
- http_resp = Seahorse::Client::Http::Response.new
17
- http_resp.status_code = 400
18
- http_resp.body = XmlError.new(error_code).to_xml
19
- http_resp
17
+ resp = Seahorse::Client::Http::Response.new
18
+ resp.status_code = 400
19
+ resp.body = XmlError.new(error_code).to_xml
20
+ resp
20
21
  end
21
22
 
22
23
  private
@@ -24,9 +25,9 @@ module Aws
24
25
  def build_body(api, operation, data)
25
26
  xml = []
26
27
  builder = Aws::Xml::DocBuilder.new(target: xml, indent: ' ')
27
- builder.node(operation.name + 'Response', xmlns: xmlns(api)) do
28
+ builder.node("#{operation.name}Response", xmlns: xmlns(api)) do
28
29
  if (rules = operation.output)
29
- rules.location_name = operation.name + 'Result'
30
+ rules.location_name = "#{operation.name}Result"
30
31
  Xml::Builder.new(rules, target: xml, pad:' ').to_xml(data)
31
32
  end
32
33
  builder.node('ResponseMetadata') do
@@ -5,6 +5,7 @@ require 'aws-eventstream'
5
5
  module Aws
6
6
  module Stubbing
7
7
  module Protocols
8
+ # @api private
8
9
  class Rest
9
10
 
10
11
  include Seahorse::Model::Shapes
@@ -22,7 +23,7 @@ module Aws
22
23
  def new_http_response
23
24
  resp = Seahorse::Client::Http::Response.new
24
25
  resp.status_code = 200
25
- resp.headers["x-amzn-RequestId"] = "stubbed-request-id"
26
+ resp.headers['x-amzn-RequestId'] = 'stubbed-request-id'
26
27
  resp
27
28
  end
28
29
 
@@ -3,6 +3,7 @@
3
3
  module Aws
4
4
  module Stubbing
5
5
  module Protocols
6
+ # @api private
6
7
  class RestJson < Rest
7
8
 
8
9
  def body_for(_a, _b, rules, data)
@@ -14,15 +15,15 @@ module Aws
14
15
  end
15
16
 
16
17
  def stub_error(error_code)
17
- http_resp = Seahorse::Client::Http::Response.new
18
- http_resp.status_code = 400
19
- http_resp.body = <<-JSON.strip
20
- {
21
- "code": #{error_code.inspect},
22
- "message": "stubbed-response-error-message"
23
- }
18
+ resp = Seahorse::Client::Http::Response.new
19
+ resp.status_code = 400
20
+ resp.body = <<~JSON.strip
21
+ {
22
+ "code": #{error_code.inspect},
23
+ "message": "stubbed-response-error-message"
24
+ }
24
25
  JSON
25
- http_resp
26
+ resp
26
27
  end
27
28
 
28
29
  end
@@ -3,6 +3,7 @@
3
3
  module Aws
4
4
  module Stubbing
5
5
  module Protocols
6
+ # @api private
6
7
  class RestXml < Rest
7
8
 
8
9
  def body_for(api, operation, rules, data)
@@ -10,7 +11,7 @@ module Aws
10
11
  encode_eventstream_response(rules, data, Xml::Builder)
11
12
  else
12
13
  xml = []
13
- rules.location_name = operation.name + 'Result'
14
+ rules.location_name = "#{operation.name}Result"
14
15
  rules['xmlNamespace'] = { 'uri' => api.metadata['xmlNamespace'] }
15
16
  Xml::Builder.new(rules, target:xml).to_xml(data)
16
17
  xml.join
@@ -18,10 +19,10 @@ module Aws
18
19
  end
19
20
 
20
21
  def stub_error(error_code)
21
- http_resp = Seahorse::Client::Http::Response.new
22
- http_resp.status_code = 400
23
- http_resp.body = XmlError.new(error_code).to_xml
24
- http_resp
22
+ resp = Seahorse::Client::Http::Response.new
23
+ resp.status_code = 400
24
+ resp.body = XmlError.new(error_code).to_xml
25
+ resp
25
26
  end
26
27
 
27
28
  def xmlns(api)
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aws
4
+ module Stubbing
5
+ module Protocols
6
+ # @api private
7
+ class RpcV2
8
+
9
+ def stub_data(_api, operation, data)
10
+ resp = Seahorse::Client::Http::Response.new
11
+ resp.status_code = 200
12
+ resp.headers['Smithy-Protocol'] = 'rpc-v2-cbor'
13
+ resp.headers['Content-Type'] = 'application/cbor'
14
+ resp.headers['x-amzn-RequestId'] = 'stubbed-request-id'
15
+ resp.body = build_body(operation, data)
16
+ resp
17
+ end
18
+
19
+ def stub_error(error_code)
20
+ resp = Seahorse::Client::Http::Response.new
21
+ resp.status_code = 400
22
+ resp.body = Aws::RpcV2.encode(
23
+ {
24
+ 'code' => error_code,
25
+ 'message' => 'stubbed-response-error-message'
26
+ }
27
+ )
28
+ resp
29
+ end
30
+
31
+ private
32
+
33
+ def build_body(operation, data)
34
+ Aws::RpcV2::Builder.new(operation.output).serialize(data)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end