aws-sdk-core 3.178.0 → 3.233.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 (196) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +709 -0
  3. data/VERSION +1 -1
  4. data/lib/aws-defaults/default_configuration.rb +1 -2
  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 +13 -5
  8. data/lib/aws-sdk-core/assume_role_web_identity_credentials.rb +14 -7
  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 +5 -1
  20. data/lib/aws-sdk-core/credential_provider_chain.rb +38 -11
  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 +79 -11
  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 +101 -21
  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 +8 -1
  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/param_filter.rb +2 -2
  40. data/lib/aws-sdk-core/log/param_formatter.rb +7 -3
  41. data/lib/aws-sdk-core/log.rb +10 -0
  42. data/lib/aws-sdk-core/lru_cache.rb +75 -0
  43. data/lib/aws-sdk-core/pageable_response.rb +1 -1
  44. data/lib/aws-sdk-core/param_validator.rb +9 -4
  45. data/lib/aws-sdk-core/plugins/bearer_authorization.rb +2 -0
  46. data/lib/aws-sdk-core/plugins/checksum_algorithm.rb +332 -167
  47. data/lib/aws-sdk-core/plugins/client_metrics_plugin.rb +1 -1
  48. data/lib/aws-sdk-core/plugins/client_metrics_send_plugin.rb +14 -2
  49. data/lib/aws-sdk-core/plugins/credentials_configuration.rb +78 -56
  50. data/lib/aws-sdk-core/plugins/endpoint_pattern.rb +40 -32
  51. data/lib/aws-sdk-core/plugins/global_configuration.rb +8 -9
  52. data/lib/aws-sdk-core/plugins/http_checksum.rb +3 -8
  53. data/lib/aws-sdk-core/plugins/invocation_id.rb +1 -11
  54. data/lib/aws-sdk-core/plugins/logging.rb +2 -0
  55. data/lib/aws-sdk-core/plugins/protocols/api_gateway.rb +3 -1
  56. data/lib/aws-sdk-core/plugins/protocols/ec2.rb +2 -24
  57. data/lib/aws-sdk-core/plugins/protocols/json_rpc.rb +6 -8
  58. data/lib/aws-sdk-core/plugins/protocols/query.rb +4 -2
  59. data/lib/aws-sdk-core/plugins/protocols/rest_json.rb +3 -15
  60. data/lib/aws-sdk-core/plugins/protocols/rest_xml.rb +3 -0
  61. data/lib/aws-sdk-core/plugins/protocols/rpc_v2.rb +17 -0
  62. data/lib/aws-sdk-core/plugins/regional_endpoint.rb +74 -25
  63. data/lib/aws-sdk-core/plugins/request_compression.rb +11 -2
  64. data/lib/aws-sdk-core/plugins/retry_errors.rb +12 -3
  65. data/lib/aws-sdk-core/plugins/sign.rb +55 -34
  66. data/lib/aws-sdk-core/plugins/signature_v2.rb +2 -1
  67. data/lib/aws-sdk-core/plugins/signature_v4.rb +2 -1
  68. data/lib/aws-sdk-core/plugins/stub_responses.rb +59 -9
  69. data/lib/aws-sdk-core/plugins/telemetry.rb +75 -0
  70. data/lib/aws-sdk-core/plugins/transfer_encoding.rb +16 -9
  71. data/lib/aws-sdk-core/plugins/user_agent.rb +101 -26
  72. data/lib/aws-sdk-core/plugins.rb +39 -0
  73. data/lib/aws-sdk-core/process_credentials.rb +48 -29
  74. data/lib/aws-sdk-core/query/ec2_handler.rb +27 -0
  75. data/lib/aws-sdk-core/query/ec2_param_builder.rb +5 -7
  76. data/lib/aws-sdk-core/query/handler.rb +4 -4
  77. data/lib/aws-sdk-core/query/param_builder.rb +2 -2
  78. data/lib/aws-sdk-core/query.rb +2 -1
  79. data/lib/aws-sdk-core/refreshing_credentials.rb +12 -6
  80. data/lib/aws-sdk-core/resources.rb +8 -0
  81. data/lib/aws-sdk-core/rest/content_type_handler.rb +60 -0
  82. data/lib/aws-sdk-core/rest/handler.rb +3 -4
  83. data/lib/aws-sdk-core/rest/request/body.rb +32 -5
  84. data/lib/aws-sdk-core/rest/request/endpoint.rb +24 -4
  85. data/lib/aws-sdk-core/rest/request/headers.rb +15 -7
  86. data/lib/aws-sdk-core/rest/request/querystring_builder.rb +62 -36
  87. data/lib/aws-sdk-core/rest/response/body.rb +15 -1
  88. data/lib/aws-sdk-core/rest/response/header_list_parser.rb +79 -0
  89. data/lib/aws-sdk-core/rest/response/headers.rb +8 -3
  90. data/lib/aws-sdk-core/rest.rb +1 -0
  91. data/lib/aws-sdk-core/rpc_v2/builder.rb +62 -0
  92. data/lib/aws-sdk-core/rpc_v2/cbor_engine.rb +18 -0
  93. data/lib/aws-sdk-core/rpc_v2/content_type_handler.rb +47 -0
  94. data/lib/aws-sdk-core/rpc_v2/error_handler.rb +95 -0
  95. data/lib/aws-sdk-core/rpc_v2/handler.rb +79 -0
  96. data/lib/aws-sdk-core/rpc_v2/parser.rb +98 -0
  97. data/lib/aws-sdk-core/rpc_v2.rb +69 -0
  98. data/lib/aws-sdk-core/shared_config.rb +113 -41
  99. data/lib/aws-sdk-core/shared_credentials.rb +1 -7
  100. data/lib/aws-sdk-core/sso_credentials.rb +4 -1
  101. data/lib/aws-sdk-core/static_token_provider.rb +1 -2
  102. data/lib/aws-sdk-core/stubbing/protocols/ec2.rb +12 -11
  103. data/lib/aws-sdk-core/stubbing/protocols/json.rb +11 -10
  104. data/lib/aws-sdk-core/stubbing/protocols/query.rb +7 -6
  105. data/lib/aws-sdk-core/stubbing/protocols/rest.rb +2 -1
  106. data/lib/aws-sdk-core/stubbing/protocols/rest_json.rb +9 -8
  107. data/lib/aws-sdk-core/stubbing/protocols/rest_xml.rb +6 -5
  108. data/lib/aws-sdk-core/stubbing/protocols/rpc_v2.rb +39 -0
  109. data/lib/aws-sdk-core/stubbing/stub_data.rb +11 -0
  110. data/lib/aws-sdk-core/stubbing.rb +22 -0
  111. data/lib/aws-sdk-core/telemetry/base.rb +177 -0
  112. data/lib/aws-sdk-core/telemetry/no_op.rb +70 -0
  113. data/lib/aws-sdk-core/telemetry/otel.rb +235 -0
  114. data/lib/aws-sdk-core/telemetry/span_kind.rb +22 -0
  115. data/lib/aws-sdk-core/telemetry/span_status.rb +59 -0
  116. data/lib/aws-sdk-core/telemetry.rb +78 -0
  117. data/lib/aws-sdk-core/token.rb +3 -3
  118. data/lib/aws-sdk-core/token_provider.rb +4 -0
  119. data/lib/aws-sdk-core/token_provider_chain.rb +2 -6
  120. data/lib/aws-sdk-core/util.rb +41 -1
  121. data/lib/aws-sdk-core/waiters/poller.rb +10 -5
  122. data/lib/aws-sdk-core/xml/builder.rb +17 -9
  123. data/lib/aws-sdk-core/xml/error_handler.rb +35 -43
  124. data/lib/aws-sdk-core/xml/parser/frame.rb +4 -20
  125. data/lib/aws-sdk-core/xml/parser/stack.rb +2 -0
  126. data/lib/aws-sdk-core/xml/parser.rb +2 -6
  127. data/lib/aws-sdk-core.rb +82 -107
  128. data/lib/aws-sdk-sso/client.rb +189 -96
  129. data/lib/aws-sdk-sso/client_api.rb +7 -0
  130. data/lib/aws-sdk-sso/endpoint_parameters.rb +9 -6
  131. data/lib/aws-sdk-sso/endpoint_provider.rb +30 -28
  132. data/lib/aws-sdk-sso/endpoints.rb +2 -54
  133. data/lib/aws-sdk-sso/plugins/endpoints.rb +23 -22
  134. data/lib/aws-sdk-sso/types.rb +1 -0
  135. data/lib/aws-sdk-sso.rb +15 -11
  136. data/lib/aws-sdk-ssooidc/client.rb +609 -129
  137. data/lib/aws-sdk-ssooidc/client_api.rb +94 -1
  138. data/lib/aws-sdk-ssooidc/endpoint_parameters.rb +9 -6
  139. data/lib/aws-sdk-ssooidc/endpoint_provider.rb +30 -28
  140. data/lib/aws-sdk-ssooidc/endpoints.rb +2 -40
  141. data/lib/aws-sdk-ssooidc/errors.rb +62 -0
  142. data/lib/aws-sdk-ssooidc/plugins/endpoints.rb +23 -20
  143. data/lib/aws-sdk-ssooidc/types.rb +419 -53
  144. data/lib/aws-sdk-ssooidc.rb +15 -11
  145. data/lib/aws-sdk-sts/client.rb +414 -147
  146. data/lib/aws-sdk-sts/client_api.rb +48 -9
  147. data/lib/aws-sdk-sts/customizations.rb +5 -2
  148. data/lib/aws-sdk-sts/endpoint_parameters.rb +10 -9
  149. data/lib/aws-sdk-sts/endpoint_provider.rb +52 -57
  150. data/lib/aws-sdk-sts/endpoints.rb +2 -118
  151. data/lib/aws-sdk-sts/errors.rb +15 -0
  152. data/lib/aws-sdk-sts/plugins/endpoints.rb +23 -30
  153. data/lib/aws-sdk-sts/presigner.rb +3 -7
  154. data/lib/aws-sdk-sts/types.rb +209 -27
  155. data/lib/aws-sdk-sts.rb +15 -11
  156. data/lib/seahorse/client/async_base.rb +4 -5
  157. data/lib/seahorse/client/async_response.rb +19 -0
  158. data/lib/seahorse/client/base.rb +18 -21
  159. data/lib/seahorse/client/h2/connection.rb +18 -28
  160. data/lib/seahorse/client/h2/handler.rb +14 -3
  161. data/lib/seahorse/client/handler.rb +1 -1
  162. data/lib/seahorse/client/http/response.rb +1 -1
  163. data/lib/seahorse/client/net_http/connection_pool.rb +15 -12
  164. data/lib/seahorse/client/net_http/handler.rb +21 -9
  165. data/lib/seahorse/client/net_http/patches.rb +1 -4
  166. data/lib/seahorse/client/networking_error.rb +1 -1
  167. data/lib/seahorse/client/plugin.rb +9 -0
  168. data/lib/seahorse/client/plugins/endpoint.rb +0 -1
  169. data/lib/seahorse/client/plugins/h2.rb +4 -4
  170. data/lib/seahorse/client/plugins/net_http.rb +57 -16
  171. data/lib/seahorse/client/plugins/request_callback.rb +31 -0
  172. data/lib/seahorse/client/request_context.rb +9 -2
  173. data/lib/seahorse/client/response.rb +8 -0
  174. data/lib/seahorse/model/shapes.rb +2 -2
  175. data/lib/seahorse/util.rb +2 -1
  176. data/sig/aws-sdk-core/async_client_stubs.rbs +21 -0
  177. data/sig/aws-sdk-core/client_stubs.rbs +10 -0
  178. data/sig/aws-sdk-core/errors.rbs +22 -0
  179. data/sig/aws-sdk-core/resources/collection.rbs +21 -0
  180. data/sig/aws-sdk-core/structure.rbs +4 -0
  181. data/sig/aws-sdk-core/telemetry/base.rbs +46 -0
  182. data/sig/aws-sdk-core/telemetry/otel.rbs +22 -0
  183. data/sig/aws-sdk-core/telemetry/span_kind.rbs +15 -0
  184. data/sig/aws-sdk-core/telemetry/span_status.rbs +24 -0
  185. data/sig/aws-sdk-core/waiters/errors.rbs +20 -0
  186. data/sig/aws-sdk-core.rbs +7 -0
  187. data/sig/seahorse/client/async_base.rbs +18 -0
  188. data/sig/seahorse/client/base.rbs +25 -0
  189. data/sig/seahorse/client/handler_builder.rbs +16 -0
  190. data/sig/seahorse/client/response.rbs +61 -0
  191. metadata +105 -23
  192. /data/lib/aws-sdk-core/xml/parser/{engines/libxml.rb → libxml_engine.rb} +0 -0
  193. /data/lib/aws-sdk-core/xml/parser/{engines/nokogiri.rb → nokogiri_engine.rb} +0 -0
  194. /data/lib/aws-sdk-core/xml/parser/{engines/oga.rb → oga_engine.rb} +0 -0
  195. /data/lib/aws-sdk-core/xml/parser/{engines/ox.rb → ox_engine.rb} +0 -0
  196. /data/lib/aws-sdk-core/xml/parser/{engines/rexml.rb → rexml_engine.rb} +0 -0
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+
5
+ module Aws
6
+ module RpcV2
7
+ class Parser
8
+ include Seahorse::Model::Shapes
9
+
10
+ # @param [Seahorse::Model::ShapeRef] rules
11
+ def initialize(rules, query_compatible: false)
12
+ @rules = rules
13
+ @query_compatible = query_compatible
14
+ end
15
+
16
+ def parse(cbor, target = nil)
17
+ return {} if cbor.empty?
18
+
19
+ parse_ref(@rules, RpcV2.decode(cbor), target)
20
+ end
21
+
22
+ private
23
+
24
+ def structure(ref, values, target = nil)
25
+ shape = ref.shape
26
+ target = ref.shape.struct_class.new if target.nil?
27
+ values.each do |key, value|
28
+ member_name, member_ref = shape.member_by_location_name(key)
29
+ if member_ref
30
+ target[member_name] = parse_ref(member_ref, value)
31
+ elsif shape.union && key != '__type'
32
+ target[:unknown] = { 'name' => key, 'value' => value }
33
+ end
34
+ end
35
+ # In services that were previously Query/XML, members that were
36
+ # "flattened" defaulted to empty lists. In JSON, these values are nil,
37
+ # which is backwards incompatible. To preserve backwards compatibility,
38
+ # we set a default value of [] for these members.
39
+ if @query_compatible
40
+ ref.shape.members.each do |member_name, member_target|
41
+ next unless target[member_name].nil?
42
+
43
+ if flattened_list?(member_target.shape)
44
+ target[member_name] = []
45
+ elsif flattened_map?(member_target.shape)
46
+ target[member_name] = {}
47
+ end
48
+ end
49
+ end
50
+
51
+ if shape.union
52
+ # convert to subclass
53
+ member_subclass = shape.member_subclass(target.member).new
54
+ member_subclass[target.member] = target.value
55
+ target = member_subclass
56
+ end
57
+ target
58
+ end
59
+
60
+ def list(ref, values, target = nil)
61
+ target = [] if target.nil?
62
+ values.each do |value|
63
+ target << parse_ref(ref.shape.member, value)
64
+ end
65
+ target
66
+ end
67
+
68
+ def map(ref, values, target = nil)
69
+ target = {} if target.nil?
70
+ values.each do |key, value|
71
+ target[key] = parse_ref(ref.shape.value, value) unless value.nil?
72
+ end
73
+ target
74
+ end
75
+
76
+ def parse_ref(ref, value, target = nil)
77
+ if value.nil?
78
+ nil
79
+ else
80
+ case ref.shape
81
+ when StructureShape then structure(ref, value, target)
82
+ when ListShape then list(ref, value, target)
83
+ when MapShape then map(ref, value, target)
84
+ else value
85
+ end
86
+ end
87
+ end
88
+
89
+ def flattened_list?(shape)
90
+ shape.is_a?(ListShape) && shape.flattened
91
+ end
92
+
93
+ def flattened_map?(shape)
94
+ shape.is_a?(MapShape) && shape.flattened
95
+ end
96
+ end
97
+ end
98
+ end
@@ -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
@@ -169,9 +173,9 @@ module Aws
169
173
 
170
174
  # Source a custom configured endpoint from the shared configuration file
171
175
  #
172
- # @param [Hash] options
173
- # @option options [String] :profile
174
- # @option options [String] :service_id
176
+ # @param [Hash] opts
177
+ # @option opts [String] :profile
178
+ # @option opts [String] :service_id
175
179
  def configured_endpoint(opts = {})
176
180
  # services section is only allowed in the shared config file (not credentials)
177
181
  profile = opts[:profile] || @profile_name
@@ -198,6 +202,9 @@ module Aws
198
202
 
199
203
  config_reader(
200
204
  :region,
205
+ :account_id_endpoint_mode,
206
+ :auth_scheme_preference,
207
+ :sigv4a_signing_region_set,
201
208
  :ca_bundle,
202
209
  :credential_process,
203
210
  :endpoint_discovery_enabled,
@@ -205,10 +212,14 @@ module Aws
205
212
  :use_fips_endpoint,
206
213
  :ec2_metadata_service_endpoint,
207
214
  :ec2_metadata_service_endpoint_mode,
215
+ :ec2_metadata_v1_disabled,
216
+ :disable_host_prefix_injection,
208
217
  :max_attempts,
209
218
  :retry_mode,
210
219
  :adaptive_retry_wait_to_fill,
211
220
  :correct_clock_skew,
221
+ :request_checksum_calculation,
222
+ :response_checksum_validation,
212
223
  :csm_client_id,
213
224
  :csm_enabled,
214
225
  :csm_host,
@@ -217,6 +228,7 @@ module Aws
217
228
  :s3_use_arn_region,
218
229
  :s3_us_east_1_regional_endpoint,
219
230
  :s3_disable_multiregion_access_points,
231
+ :s3_disable_express_session_auth,
220
232
  :defaults_mode,
221
233
  :sdk_ua_app_id,
222
234
  :disable_request_compression,
@@ -249,8 +261,8 @@ module Aws
249
261
  'provide only source_profile or credential_source, not both.'
250
262
  elsif opts[:source_profile]
251
263
  opts[:visited_profiles] ||= Set.new
252
- opts[:credentials] = resolve_source_profile(opts[:source_profile], opts)
253
- if opts[:credentials]
264
+ provider = resolve_source_profile(opts[:source_profile], opts)
265
+ if provider && (opts[:credentials] = provider.credentials)
254
266
  opts[:role_session_name] ||= prof_cfg['role_session_name']
255
267
  opts[:role_session_name] ||= 'default_session'
256
268
  opts[:role_arn] ||= prof_cfg['role_arn']
@@ -259,17 +271,28 @@ module Aws
259
271
  opts[:serial_number] ||= prof_cfg['mfa_serial']
260
272
  opts[:profile] = opts.delete(:source_profile)
261
273
  opts.delete(:visited_profiles)
262
- 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
263
289
  else
264
290
  raise Errors::NoSourceProfileError,
265
291
  "Profile #{profile} has a role_arn, and source_profile, but the"\
266
292
  ' source_profile does not have credentials.'
267
293
  end
268
294
  elsif credential_source
269
- opts[:credentials] = credentials_from_source(
270
- credential_source,
271
- chain_config
272
- )
295
+ opts[:credentials] = credentials_from_source(credential_source, chain_config)
273
296
  if opts[:credentials]
274
297
  opts[:role_session_name] ||= prof_cfg['role_session_name']
275
298
  opts[:role_session_name] ||= 'default_session'
@@ -278,7 +301,16 @@ module Aws
278
301
  opts[:external_id] ||= prof_cfg['external_id']
279
302
  opts[:serial_number] ||= prof_cfg['mfa_serial']
280
303
  opts.delete(:source_profile) # Cleanup
281
- 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
282
314
  else
283
315
  raise Errors::NoSourceCredentials,
284
316
  "Profile #{profile} could not get source credentials from"\
@@ -306,12 +338,24 @@ module Aws
306
338
  elsif profile_config && profile_config['source_profile']
307
339
  opts.delete(:source_profile)
308
340
  assume_role_credentials_from_config(opts.merge(profile: profile))
309
- elsif (provider = assume_role_web_identity_credentials_from_config(opts.merge(profile: profile)))
310
- 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?
311
343
  elsif (provider = assume_role_process_credentials_from_config(profile))
312
- provider.credentials if provider.credentials.set?
313
- elsif (provider = sso_credentials_from_config(profile: profile))
314
- 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)
315
359
  end
316
360
  end
317
361
 
@@ -325,6 +369,15 @@ module Aws
325
369
  )
326
370
  when 'EcsContainer'
327
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
328
381
  else
329
382
  raise Errors::InvalidCredentialSourceError, "Unsupported credential_source: #{credential_source}"
330
383
  end
@@ -336,7 +389,11 @@ module Aws
336
389
  if @parsed_config
337
390
  credential_process ||= @parsed_config.fetch(profile, {})['credential_process']
338
391
  end
339
- 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
340
397
  end
341
398
 
342
399
  def credentials_from_shared(profile, _opts)
@@ -359,12 +416,8 @@ module Aws
359
416
  !(prof_config.keys & SSO_CREDENTIAL_PROFILE_KEYS).empty?
360
417
 
361
418
  if sso_session_name = prof_config['sso_session']
362
- sso_session = cfg["sso-session #{sso_session_name}"]
363
- unless sso_session
364
- raise ArgumentError,
365
- "sso-session #{sso_session_name} must be defined in the config file. " \
366
- "Referenced by profile #{profile}"
367
- end
419
+ sso_session = sso_session(cfg, profile, sso_session_name)
420
+
368
421
  sso_region = sso_session['sso_region']
369
422
  sso_start_url = sso_session['sso_start_url']
370
423
 
@@ -384,13 +437,18 @@ module Aws
384
437
  sso_start_url = prof_config['sso_start_url']
385
438
  end
386
439
 
387
- SSOCredentials.new(
388
- sso_account_id: prof_config['sso_account_id'],
389
- sso_role_name: prof_config['sso_role_name'],
390
- sso_session: prof_config['sso_session'],
391
- sso_region: sso_region,
392
- 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
393
448
  )
449
+ creds.metrics << metric
450
+ creds
451
+ end
394
452
  end
395
453
  end
396
454
 
@@ -402,16 +460,7 @@ module Aws
402
460
  !(prof_config.keys & SSO_TOKEN_PROFILE_KEYS).empty?
403
461
 
404
462
  sso_session_name = prof_config['sso_session']
405
- sso_session = cfg["sso-session #{sso_session_name}"]
406
- unless sso_session
407
- raise ArgumentError,
408
- "sso-session #{sso_session_name} must be defined in the config file." \
409
- "Referenced by profile #{profile}"
410
- end
411
-
412
- unless sso_session['sso_region']
413
- raise ArgumentError, "sso-session #{sso_session_name} missing required parameter: sso_region"
414
- end
463
+ sso_session = sso_session(cfg, profile, sso_session_name)
415
464
 
416
465
  SSOTokenProvider.new(
417
466
  sso_session: sso_session_name,
@@ -424,8 +473,10 @@ module Aws
424
473
  creds = Credentials.new(
425
474
  prof_config['aws_access_key_id'],
426
475
  prof_config['aws_secret_access_key'],
427
- prof_config['aws_session_token']
476
+ prof_config['aws_session_token'],
477
+ account_id: prof_config['aws_account_id']
428
478
  )
479
+ creds.metrics = ['CREDENTIALS_PROFILE']
429
480
  creds if creds.set?
430
481
  end
431
482
 
@@ -469,5 +520,26 @@ module Aws
469
520
  ret ||= 'default'
470
521
  ret
471
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
472
544
  end
473
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]
@@ -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,7 +158,8 @@ 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
164
  @expiration = Time.at(c.expiration / 1000.0)
162
165
  end
@@ -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