aws-sdk-core 3.152.0 → 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 (213) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +942 -1
  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 +14 -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 +13 -2
  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 +81 -29
  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 +186 -60
  24. data/lib/aws-sdk-core/endpoints/condition.rb +41 -0
  25. data/lib/aws-sdk-core/endpoints/endpoint.rb +19 -0
  26. data/lib/aws-sdk-core/endpoints/endpoint_rule.rb +75 -0
  27. data/lib/aws-sdk-core/endpoints/error_rule.rb +42 -0
  28. data/lib/aws-sdk-core/endpoints/function.rb +80 -0
  29. data/lib/aws-sdk-core/endpoints/matchers.rb +129 -0
  30. data/lib/aws-sdk-core/endpoints/reference.rb +31 -0
  31. data/lib/aws-sdk-core/endpoints/rule.rb +25 -0
  32. data/lib/aws-sdk-core/endpoints/rule_set.rb +52 -0
  33. data/lib/aws-sdk-core/endpoints/rules_provider.rb +37 -0
  34. data/lib/aws-sdk-core/endpoints/templater.rb +58 -0
  35. data/lib/aws-sdk-core/endpoints/tree_rule.rb +45 -0
  36. data/lib/aws-sdk-core/endpoints/url.rb +60 -0
  37. data/lib/aws-sdk-core/endpoints.rb +158 -0
  38. data/lib/aws-sdk-core/error_handler.rb +46 -0
  39. data/lib/aws-sdk-core/errors.rb +14 -5
  40. data/lib/aws-sdk-core/event_emitter.rb +1 -17
  41. data/lib/aws-sdk-core/ini_parser.rb +7 -0
  42. data/lib/aws-sdk-core/instance_profile_credentials.rb +168 -155
  43. data/lib/aws-sdk-core/json/builder.rb +8 -1
  44. data/lib/aws-sdk-core/json/error_handler.rb +46 -11
  45. data/lib/aws-sdk-core/json/handler.rb +13 -6
  46. data/lib/aws-sdk-core/json/json_engine.rb +3 -1
  47. data/lib/aws-sdk-core/json/oj_engine.rb +7 -1
  48. data/lib/aws-sdk-core/json/parser.rb +33 -3
  49. data/lib/aws-sdk-core/json.rb +43 -14
  50. data/lib/aws-sdk-core/log/formatter.rb +6 -0
  51. data/lib/aws-sdk-core/log/param_filter.rb +2 -2
  52. data/lib/aws-sdk-core/log/param_formatter.rb +7 -3
  53. data/lib/aws-sdk-core/log.rb +10 -0
  54. data/lib/aws-sdk-core/lru_cache.rb +75 -0
  55. data/lib/aws-sdk-core/pageable_response.rb +3 -1
  56. data/lib/aws-sdk-core/param_validator.rb +9 -4
  57. data/lib/aws-sdk-core/plugins/bearer_authorization.rb +2 -0
  58. data/lib/aws-sdk-core/plugins/checksum_algorithm.rb +348 -169
  59. data/lib/aws-sdk-core/plugins/client_metrics_plugin.rb +1 -1
  60. data/lib/aws-sdk-core/plugins/client_metrics_send_plugin.rb +14 -2
  61. data/lib/aws-sdk-core/plugins/credentials_configuration.rb +84 -38
  62. data/lib/aws-sdk-core/plugins/endpoint_discovery.rb +6 -2
  63. data/lib/aws-sdk-core/plugins/endpoint_pattern.rb +40 -32
  64. data/lib/aws-sdk-core/plugins/global_configuration.rb +8 -9
  65. data/lib/aws-sdk-core/plugins/http_checksum.rb +3 -8
  66. data/lib/aws-sdk-core/plugins/invocation_id.rb +1 -11
  67. data/lib/aws-sdk-core/plugins/logging.rb +2 -0
  68. data/lib/aws-sdk-core/plugins/protocols/api_gateway.rb +3 -1
  69. data/lib/aws-sdk-core/plugins/protocols/ec2.rb +2 -24
  70. data/lib/aws-sdk-core/plugins/protocols/json_rpc.rb +6 -8
  71. data/lib/aws-sdk-core/plugins/protocols/query.rb +4 -2
  72. data/lib/aws-sdk-core/plugins/protocols/rest_json.rb +3 -15
  73. data/lib/aws-sdk-core/plugins/protocols/rest_xml.rb +3 -0
  74. data/lib/aws-sdk-core/plugins/protocols/rpc_v2.rb +17 -0
  75. data/lib/aws-sdk-core/plugins/regional_endpoint.rb +164 -34
  76. data/lib/aws-sdk-core/plugins/request_compression.rb +226 -0
  77. data/lib/aws-sdk-core/plugins/retries/error_inspector.rb +2 -1
  78. data/lib/aws-sdk-core/plugins/retry_errors.rb +12 -3
  79. data/lib/aws-sdk-core/plugins/sign.rb +222 -0
  80. data/lib/aws-sdk-core/plugins/signature_v2.rb +2 -0
  81. data/lib/aws-sdk-core/plugins/signature_v4.rb +2 -0
  82. data/lib/aws-sdk-core/plugins/stub_responses.rb +59 -9
  83. data/lib/aws-sdk-core/plugins/telemetry.rb +75 -0
  84. data/lib/aws-sdk-core/plugins/transfer_encoding.rb +16 -9
  85. data/lib/aws-sdk-core/plugins/user_agent.rb +192 -14
  86. data/lib/aws-sdk-core/plugins.rb +39 -0
  87. data/lib/aws-sdk-core/process_credentials.rb +48 -29
  88. data/lib/aws-sdk-core/query/ec2_handler.rb +27 -0
  89. data/lib/aws-sdk-core/query/ec2_param_builder.rb +5 -7
  90. data/lib/aws-sdk-core/query/handler.rb +4 -4
  91. data/lib/aws-sdk-core/query/param_builder.rb +2 -2
  92. data/lib/aws-sdk-core/query.rb +2 -1
  93. data/lib/aws-sdk-core/refreshing_credentials.rb +20 -23
  94. data/lib/aws-sdk-core/resources.rb +8 -0
  95. data/lib/aws-sdk-core/rest/content_type_handler.rb +60 -0
  96. data/lib/aws-sdk-core/rest/handler.rb +3 -4
  97. data/lib/aws-sdk-core/rest/request/body.rb +32 -5
  98. data/lib/aws-sdk-core/rest/request/endpoint.rb +24 -4
  99. data/lib/aws-sdk-core/rest/request/headers.rb +14 -10
  100. data/lib/aws-sdk-core/rest/request/querystring_builder.rb +62 -36
  101. data/lib/aws-sdk-core/rest/response/body.rb +15 -1
  102. data/lib/aws-sdk-core/rest/response/header_list_parser.rb +79 -0
  103. data/lib/aws-sdk-core/rest/response/headers.rb +8 -3
  104. data/lib/aws-sdk-core/rest.rb +1 -0
  105. data/lib/aws-sdk-core/rpc_v2/builder.rb +62 -0
  106. data/lib/aws-sdk-core/rpc_v2/cbor_engine.rb +18 -0
  107. data/lib/aws-sdk-core/rpc_v2/content_type_handler.rb +47 -0
  108. data/lib/aws-sdk-core/rpc_v2/error_handler.rb +95 -0
  109. data/lib/aws-sdk-core/rpc_v2/handler.rb +79 -0
  110. data/lib/aws-sdk-core/rpc_v2/parser.rb +98 -0
  111. data/lib/aws-sdk-core/rpc_v2.rb +69 -0
  112. data/lib/aws-sdk-core/shared_config.rb +160 -36
  113. data/lib/aws-sdk-core/shared_credentials.rb +1 -7
  114. data/lib/aws-sdk-core/sso_credentials.rb +84 -46
  115. data/lib/aws-sdk-core/sso_token_provider.rb +3 -2
  116. data/lib/aws-sdk-core/static_token_provider.rb +1 -2
  117. data/lib/aws-sdk-core/stubbing/protocols/ec2.rb +12 -11
  118. data/lib/aws-sdk-core/stubbing/protocols/json.rb +11 -10
  119. data/lib/aws-sdk-core/stubbing/protocols/query.rb +7 -6
  120. data/lib/aws-sdk-core/stubbing/protocols/rest.rb +2 -1
  121. data/lib/aws-sdk-core/stubbing/protocols/rest_json.rb +9 -8
  122. data/lib/aws-sdk-core/stubbing/protocols/rest_xml.rb +6 -5
  123. data/lib/aws-sdk-core/stubbing/protocols/rpc_v2.rb +39 -0
  124. data/lib/aws-sdk-core/stubbing/stub_data.rb +11 -0
  125. data/lib/aws-sdk-core/stubbing.rb +22 -0
  126. data/lib/aws-sdk-core/telemetry/base.rb +177 -0
  127. data/lib/aws-sdk-core/telemetry/no_op.rb +70 -0
  128. data/lib/aws-sdk-core/telemetry/otel.rb +235 -0
  129. data/lib/aws-sdk-core/telemetry/span_kind.rb +22 -0
  130. data/lib/aws-sdk-core/telemetry/span_status.rb +59 -0
  131. data/lib/aws-sdk-core/telemetry.rb +78 -0
  132. data/lib/aws-sdk-core/token.rb +3 -3
  133. data/lib/aws-sdk-core/token_provider.rb +4 -0
  134. data/lib/aws-sdk-core/token_provider_chain.rb +2 -6
  135. data/lib/aws-sdk-core/util.rb +41 -1
  136. data/lib/aws-sdk-core/waiters/poller.rb +12 -5
  137. data/lib/aws-sdk-core/xml/builder.rb +17 -9
  138. data/lib/aws-sdk-core/xml/error_handler.rb +35 -43
  139. data/lib/aws-sdk-core/xml/parser/frame.rb +4 -20
  140. data/lib/aws-sdk-core/xml/parser/{engines/oga.rb → oga_engine.rb} +2 -0
  141. data/lib/aws-sdk-core/xml/parser/stack.rb +2 -0
  142. data/lib/aws-sdk-core/xml/parser.rb +2 -6
  143. data/lib/aws-sdk-core.rb +82 -103
  144. data/lib/aws-sdk-sso/client.rb +219 -89
  145. data/lib/aws-sdk-sso/client_api.rb +7 -0
  146. data/lib/aws-sdk-sso/endpoint_parameters.rb +69 -0
  147. data/lib/aws-sdk-sso/endpoint_provider.rb +53 -0
  148. data/lib/aws-sdk-sso/endpoints.rb +20 -0
  149. data/lib/aws-sdk-sso/plugins/endpoints.rb +77 -0
  150. data/lib/aws-sdk-sso/types.rb +1 -35
  151. data/lib/aws-sdk-sso.rb +15 -7
  152. data/lib/aws-sdk-ssooidc/client.rb +650 -118
  153. data/lib/aws-sdk-ssooidc/client_api.rb +94 -1
  154. data/lib/aws-sdk-ssooidc/endpoint_parameters.rb +69 -0
  155. data/lib/aws-sdk-ssooidc/endpoint_provider.rb +53 -0
  156. data/lib/aws-sdk-ssooidc/endpoints.rb +20 -0
  157. data/lib/aws-sdk-ssooidc/errors.rb +62 -0
  158. data/lib/aws-sdk-ssooidc/plugins/endpoints.rb +77 -0
  159. data/lib/aws-sdk-ssooidc/types.rb +437 -67
  160. data/lib/aws-sdk-ssooidc.rb +15 -7
  161. data/lib/aws-sdk-sts/client.rb +670 -368
  162. data/lib/aws-sdk-sts/client_api.rb +48 -9
  163. data/lib/aws-sdk-sts/customizations.rb +5 -2
  164. data/lib/aws-sdk-sts/endpoint_parameters.rb +79 -0
  165. data/lib/aws-sdk-sts/endpoint_provider.rb +107 -0
  166. data/lib/aws-sdk-sts/endpoints.rb +20 -0
  167. data/lib/aws-sdk-sts/errors.rb +15 -0
  168. data/lib/aws-sdk-sts/plugins/endpoints.rb +77 -0
  169. data/lib/aws-sdk-sts/presigner.rb +12 -18
  170. data/lib/aws-sdk-sts/types.rb +296 -222
  171. data/lib/aws-sdk-sts.rb +15 -7
  172. data/lib/seahorse/client/async_base.rb +4 -6
  173. data/lib/seahorse/client/async_response.rb +19 -0
  174. data/lib/seahorse/client/base.rb +18 -21
  175. data/lib/seahorse/client/configuration.rb +1 -5
  176. data/lib/seahorse/client/h2/connection.rb +27 -36
  177. data/lib/seahorse/client/h2/handler.rb +14 -3
  178. data/lib/seahorse/client/handler.rb +1 -1
  179. data/lib/seahorse/client/http/response.rb +1 -1
  180. data/lib/seahorse/client/net_http/connection_pool.rb +15 -12
  181. data/lib/seahorse/client/net_http/handler.rb +21 -9
  182. data/lib/seahorse/client/net_http/patches.rb +1 -4
  183. data/lib/seahorse/client/networking_error.rb +1 -1
  184. data/lib/seahorse/client/plugin.rb +9 -0
  185. data/lib/seahorse/client/plugins/endpoint.rb +0 -1
  186. data/lib/seahorse/client/plugins/h2.rb +4 -4
  187. data/lib/seahorse/client/plugins/net_http.rb +57 -16
  188. data/lib/seahorse/client/plugins/request_callback.rb +40 -9
  189. data/lib/seahorse/client/request_context.rb +9 -2
  190. data/lib/seahorse/client/response.rb +8 -0
  191. data/lib/seahorse/model/operation.rb +3 -0
  192. data/lib/seahorse/model/shapes.rb +2 -2
  193. data/lib/seahorse/util.rb +6 -1
  194. data/sig/aws-sdk-core/async_client_stubs.rbs +21 -0
  195. data/sig/aws-sdk-core/client_stubs.rbs +10 -0
  196. data/sig/aws-sdk-core/errors.rbs +22 -0
  197. data/sig/aws-sdk-core/resources/collection.rbs +21 -0
  198. data/sig/aws-sdk-core/structure.rbs +4 -0
  199. data/sig/aws-sdk-core/telemetry/base.rbs +46 -0
  200. data/sig/aws-sdk-core/telemetry/otel.rbs +22 -0
  201. data/sig/aws-sdk-core/telemetry/span_kind.rbs +15 -0
  202. data/sig/aws-sdk-core/telemetry/span_status.rbs +24 -0
  203. data/sig/aws-sdk-core/waiters/errors.rbs +20 -0
  204. data/sig/aws-sdk-core.rbs +7 -0
  205. data/sig/seahorse/client/async_base.rbs +18 -0
  206. data/sig/seahorse/client/base.rbs +25 -0
  207. data/sig/seahorse/client/handler_builder.rbs +16 -0
  208. data/sig/seahorse/client/response.rbs +61 -0
  209. metadata +133 -23
  210. /data/lib/aws-sdk-core/xml/parser/{engines/libxml.rb → libxml_engine.rb} +0 -0
  211. /data/lib/aws-sdk-core/xml/parser/{engines/nokogiri.rb → nokogiri_engine.rb} +0 -0
  212. /data/lib/aws-sdk-core/xml/parser/{engines/ox.rb → ox_engine.rb} +0 -0
  213. /data/lib/aws-sdk-core/xml/parser/{engines/rexml.rb → rexml_engine.rb} +0 -0
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aws
4
+ module RpcV2
5
+ class Handler < Seahorse::Client::Handler
6
+ # @param [Seahorse::Client::RequestContext] context
7
+ # @return [Seahorse::Client::Response]
8
+ def call(context)
9
+ build_request(context)
10
+ response = with_metric { @handler.call(context) }
11
+ response.on(200..299) { |resp| resp.data = parse_body(context) }
12
+ response.on(200..599) { |_resp| apply_request_id(context) }
13
+ response
14
+ end
15
+
16
+ private
17
+
18
+ def with_metric(&block)
19
+ Aws::Plugins::UserAgent.metric('PROTOCOL_RPC_V2_CBOR', &block)
20
+ end
21
+
22
+ def build_request(context)
23
+ context.http_request.headers['Smithy-Protocol'] = 'rpc-v2-cbor'
24
+ context.http_request.headers['X-Amzn-Query-Mode'] = 'true' if query_compatible?(context)
25
+ context.http_request.http_method = 'POST'
26
+ context.http_request.body = build_body(context)
27
+ build_url(context)
28
+ end
29
+
30
+ def build_url(context)
31
+ base = context.http_request.endpoint
32
+ service_name = context.config.api.metadata['targetPrefix']
33
+ base.path += "/service/#{service_name}/operation/#{context.operation.name}"
34
+ end
35
+
36
+ def build_body(context)
37
+ Builder.new(context.operation.input).serialize(context.params)
38
+ end
39
+
40
+ def parse_body(context)
41
+ cbor = context.http_response.body_contents
42
+ if (rules = context.operation.output)
43
+ if cbor.is_a?(Array)
44
+ # an array of emitted events
45
+ if cbor[0].respond_to?(:response)
46
+ # initial response exists
47
+ # it must be the first event arrived
48
+ resp_struct = cbor.shift.response
49
+ else
50
+ resp_struct = context.operation.output.shape.struct_class.new
51
+ end
52
+
53
+ rules.shape.members.each do |name, ref|
54
+ if ref.eventstream
55
+ resp_struct.send("#{name}=", cbor.to_enum)
56
+ end
57
+ end
58
+ resp_struct
59
+ else
60
+ Parser.new(
61
+ rules,
62
+ query_compatible: query_compatible?(context)
63
+ ).parse(cbor)
64
+ end
65
+ else
66
+ EmptyStructure.new
67
+ end
68
+ end
69
+
70
+ def apply_request_id(context)
71
+ context[:request_id] = context.http_response.headers['x-amzn-requestid']
72
+ end
73
+
74
+ def query_compatible?(context)
75
+ context.config.api.metadata.key?('awsQueryCompatible')
76
+ end
77
+ end
78
+ end
79
+ end
@@ -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
@@ -3,9 +3,10 @@
3
3
  module Aws
4
4
  # @api private
5
5
  class SharedConfig
6
- SSO_PROFILE_KEYS = %w[sso_start_url sso_region sso_account_id sso_role_name].freeze
6
+ SSO_CREDENTIAL_PROFILE_KEYS = %w[sso_account_id sso_role_name].freeze
7
+ SSO_PROFILE_KEYS = %w[sso_session sso_start_url sso_region sso_account_id sso_role_name].freeze
7
8
  SSO_TOKEN_PROFILE_KEYS = %w[sso_session].freeze
8
- SSO_SESSION_KEYS = %w[sso_region]
9
+ SSO_SESSION_KEYS = %w[sso_region sso_start_url].freeze
9
10
 
10
11
 
11
12
  # @return [String]
@@ -137,7 +138,11 @@ module Aws
137
138
  role_session_name: entry['role_session_name']
138
139
  }
139
140
  cfg[:region] = opts[:region] if opts[:region]
140
- 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
141
146
  end
142
147
  end
143
148
  end
@@ -166,6 +171,26 @@ module Aws
166
171
  token
167
172
  end
168
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
+
169
194
  # Add an accessor method (similar to attr_reader) to return a configuration value
170
195
  # Uses the get_config_value below to control where
171
196
  # values are loaded from
@@ -177,6 +202,9 @@ module Aws
177
202
 
178
203
  config_reader(
179
204
  :region,
205
+ :account_id_endpoint_mode,
206
+ :auth_scheme_preference,
207
+ :sigv4a_signing_region_set,
180
208
  :ca_bundle,
181
209
  :credential_process,
182
210
  :endpoint_discovery_enabled,
@@ -184,10 +212,14 @@ module Aws
184
212
  :use_fips_endpoint,
185
213
  :ec2_metadata_service_endpoint,
186
214
  :ec2_metadata_service_endpoint_mode,
215
+ :ec2_metadata_v1_disabled,
216
+ :disable_host_prefix_injection,
187
217
  :max_attempts,
188
218
  :retry_mode,
189
219
  :adaptive_retry_wait_to_fill,
190
220
  :correct_clock_skew,
221
+ :request_checksum_calculation,
222
+ :response_checksum_validation,
191
223
  :csm_client_id,
192
224
  :csm_enabled,
193
225
  :csm_host,
@@ -196,7 +228,12 @@ module Aws
196
228
  :s3_use_arn_region,
197
229
  :s3_us_east_1_regional_endpoint,
198
230
  :s3_disable_multiregion_access_points,
199
- :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
200
237
  )
201
238
 
202
239
  private
@@ -224,8 +261,8 @@ module Aws
224
261
  'provide only source_profile or credential_source, not both.'
225
262
  elsif opts[:source_profile]
226
263
  opts[:visited_profiles] ||= Set.new
227
- opts[:credentials] = resolve_source_profile(opts[:source_profile], opts)
228
- if opts[:credentials]
264
+ provider = resolve_source_profile(opts[:source_profile], opts)
265
+ if provider && (opts[:credentials] = provider.credentials)
229
266
  opts[:role_session_name] ||= prof_cfg['role_session_name']
230
267
  opts[:role_session_name] ||= 'default_session'
231
268
  opts[:role_arn] ||= prof_cfg['role_arn']
@@ -234,17 +271,28 @@ module Aws
234
271
  opts[:serial_number] ||= prof_cfg['mfa_serial']
235
272
  opts[:profile] = opts.delete(:source_profile)
236
273
  opts.delete(:visited_profiles)
237
- 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
238
289
  else
239
290
  raise Errors::NoSourceProfileError,
240
291
  "Profile #{profile} has a role_arn, and source_profile, but the"\
241
292
  ' source_profile does not have credentials.'
242
293
  end
243
294
  elsif credential_source
244
- opts[:credentials] = credentials_from_source(
245
- credential_source,
246
- chain_config
247
- )
295
+ opts[:credentials] = credentials_from_source(credential_source, chain_config)
248
296
  if opts[:credentials]
249
297
  opts[:role_session_name] ||= prof_cfg['role_session_name']
250
298
  opts[:role_session_name] ||= 'default_session'
@@ -253,7 +301,16 @@ module Aws
253
301
  opts[:external_id] ||= prof_cfg['external_id']
254
302
  opts[:serial_number] ||= prof_cfg['mfa_serial']
255
303
  opts.delete(:source_profile) # Cleanup
256
- 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
257
314
  else
258
315
  raise Errors::NoSourceCredentials,
259
316
  "Profile #{profile} could not get source credentials from"\
@@ -281,12 +338,24 @@ module Aws
281
338
  elsif profile_config && profile_config['source_profile']
282
339
  opts.delete(:source_profile)
283
340
  assume_role_credentials_from_config(opts.merge(profile: profile))
284
- elsif (provider = assume_role_web_identity_credentials_from_config(opts.merge(profile: profile)))
285
- 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?
286
343
  elsif (provider = assume_role_process_credentials_from_config(profile))
287
- provider.credentials if provider.credentials.set?
288
- elsif (provider = sso_credentials_from_config(profile: profile))
289
- 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)
290
359
  end
291
360
  end
292
361
 
@@ -300,6 +369,15 @@ module Aws
300
369
  )
301
370
  when 'EcsContainer'
302
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
303
381
  else
304
382
  raise Errors::InvalidCredentialSourceError, "Unsupported credential_source: #{credential_source}"
305
383
  end
@@ -311,7 +389,11 @@ module Aws
311
389
  if @parsed_config
312
390
  credential_process ||= @parsed_config.fetch(profile, {})['credential_process']
313
391
  end
314
- 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
315
397
  end
316
398
 
317
399
  def credentials_from_shared(profile, _opts)
@@ -331,14 +413,42 @@ module Aws
331
413
  def sso_credentials_from_profile(cfg, profile)
332
414
  if @parsed_config &&
333
415
  (prof_config = cfg[profile]) &&
334
- !(prof_config.keys & SSO_PROFILE_KEYS).empty?
416
+ !(prof_config.keys & SSO_CREDENTIAL_PROFILE_KEYS).empty?
335
417
 
336
- SSOCredentials.new(
337
- sso_start_url: prof_config['sso_start_url'],
338
- sso_region: prof_config['sso_region'],
339
- sso_account_id: prof_config['sso_account_id'],
340
- sso_role_name: prof_config['sso_role_name']
341
- )
418
+ if sso_session_name = prof_config['sso_session']
419
+ sso_session = sso_session(cfg, profile, sso_session_name)
420
+
421
+ sso_region = sso_session['sso_region']
422
+ sso_start_url = sso_session['sso_start_url']
423
+
424
+ # validate sso_region and sso_start_url don't conflict if set on profile and session
425
+ if prof_config['sso_region'] && prof_config['sso_region'] != sso_region
426
+ raise ArgumentError,
427
+ "sso-session #{sso_session_name}'s sso_region (#{sso_region}) " \
428
+ "does not match the profile #{profile}'s sso_region (#{prof_config['sso_region']}'"
429
+ end
430
+ if prof_config['sso_start_url'] && prof_config['sso_start_url'] != sso_start_url
431
+ raise ArgumentError,
432
+ "sso-session #{sso_session_name}'s sso_start_url (#{sso_start_url}) " \
433
+ "does not match the profile #{profile}'s sso_start_url (#{prof_config['sso_start_url']}'"
434
+ end
435
+ else
436
+ sso_region = prof_config['sso_region']
437
+ sso_start_url = prof_config['sso_start_url']
438
+ end
439
+
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
448
+ )
449
+ creds.metrics << metric
450
+ creds
451
+ end
342
452
  end
343
453
  end
344
454
 
@@ -350,16 +460,7 @@ module Aws
350
460
  !(prof_config.keys & SSO_TOKEN_PROFILE_KEYS).empty?
351
461
 
352
462
  sso_session_name = prof_config['sso_session']
353
- sso_session = cfg["sso-session #{sso_session_name}"]
354
- unless sso_session
355
- raise ArgumentError,
356
- "sso-session #{sso_session_name} must be defined in the config file." /
357
- "Referenced by profile #{profile}"
358
- end
359
-
360
- unless sso_session['sso_region']
361
- raise ArgumentError, "sso-session #{sso_session_name} missing required parameter: sso_region"
362
- end
463
+ sso_session = sso_session(cfg, profile, sso_session_name)
363
464
 
364
465
  SSOTokenProvider.new(
365
466
  sso_session: sso_session_name,
@@ -372,8 +473,10 @@ module Aws
372
473
  creds = Credentials.new(
373
474
  prof_config['aws_access_key_id'],
374
475
  prof_config['aws_secret_access_key'],
375
- prof_config['aws_session_token']
476
+ prof_config['aws_session_token'],
477
+ account_id: prof_config['aws_account_id']
376
478
  )
479
+ creds.metrics = ['CREDENTIALS_PROFILE']
377
480
  creds if creds.set?
378
481
  end
379
482
 
@@ -417,5 +520,26 @@ module Aws
417
520
  ret ||= 'default'
418
521
  ret
419
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
420
544
  end
421
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]