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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +942 -1
- data/VERSION +1 -1
- data/lib/aws-defaults/default_configuration.rb +5 -6
- data/lib/aws-defaults.rb +4 -1
- data/lib/aws-sdk-core/arn.rb +14 -3
- data/lib/aws-sdk-core/assume_role_credentials.rb +21 -13
- data/lib/aws-sdk-core/assume_role_web_identity_credentials.rb +16 -9
- data/lib/aws-sdk-core/binary/decode_handler.rb +3 -9
- data/lib/aws-sdk-core/binary/encode_handler.rb +13 -2
- data/lib/aws-sdk-core/binary/event_builder.rb +34 -37
- data/lib/aws-sdk-core/binary/event_stream_decoder.rb +1 -0
- data/lib/aws-sdk-core/binary/event_stream_encoder.rb +4 -3
- data/lib/aws-sdk-core/cbor/decoder.rb +308 -0
- data/lib/aws-sdk-core/cbor/encoder.rb +243 -0
- data/lib/aws-sdk-core/cbor.rb +53 -0
- data/lib/aws-sdk-core/client_side_monitoring.rb +9 -0
- data/lib/aws-sdk-core/client_stubs.rb +33 -55
- data/lib/aws-sdk-core/credential_provider.rb +8 -1
- data/lib/aws-sdk-core/credential_provider_chain.rb +81 -29
- data/lib/aws-sdk-core/credentials.rb +19 -6
- data/lib/aws-sdk-core/ec2_metadata.rb +1 -1
- data/lib/aws-sdk-core/ecs_credentials.rb +186 -60
- data/lib/aws-sdk-core/endpoints/condition.rb +41 -0
- data/lib/aws-sdk-core/endpoints/endpoint.rb +19 -0
- data/lib/aws-sdk-core/endpoints/endpoint_rule.rb +75 -0
- data/lib/aws-sdk-core/endpoints/error_rule.rb +42 -0
- data/lib/aws-sdk-core/endpoints/function.rb +80 -0
- data/lib/aws-sdk-core/endpoints/matchers.rb +129 -0
- data/lib/aws-sdk-core/endpoints/reference.rb +31 -0
- data/lib/aws-sdk-core/endpoints/rule.rb +25 -0
- data/lib/aws-sdk-core/endpoints/rule_set.rb +52 -0
- data/lib/aws-sdk-core/endpoints/rules_provider.rb +37 -0
- data/lib/aws-sdk-core/endpoints/templater.rb +58 -0
- data/lib/aws-sdk-core/endpoints/tree_rule.rb +45 -0
- data/lib/aws-sdk-core/endpoints/url.rb +60 -0
- data/lib/aws-sdk-core/endpoints.rb +158 -0
- data/lib/aws-sdk-core/error_handler.rb +46 -0
- data/lib/aws-sdk-core/errors.rb +14 -5
- data/lib/aws-sdk-core/event_emitter.rb +1 -17
- data/lib/aws-sdk-core/ini_parser.rb +7 -0
- data/lib/aws-sdk-core/instance_profile_credentials.rb +168 -155
- data/lib/aws-sdk-core/json/builder.rb +8 -1
- data/lib/aws-sdk-core/json/error_handler.rb +46 -11
- data/lib/aws-sdk-core/json/handler.rb +13 -6
- data/lib/aws-sdk-core/json/json_engine.rb +3 -1
- data/lib/aws-sdk-core/json/oj_engine.rb +7 -1
- data/lib/aws-sdk-core/json/parser.rb +33 -3
- data/lib/aws-sdk-core/json.rb +43 -14
- data/lib/aws-sdk-core/log/formatter.rb +6 -0
- data/lib/aws-sdk-core/log/param_filter.rb +2 -2
- data/lib/aws-sdk-core/log/param_formatter.rb +7 -3
- data/lib/aws-sdk-core/log.rb +10 -0
- data/lib/aws-sdk-core/lru_cache.rb +75 -0
- data/lib/aws-sdk-core/pageable_response.rb +3 -1
- data/lib/aws-sdk-core/param_validator.rb +9 -4
- data/lib/aws-sdk-core/plugins/bearer_authorization.rb +2 -0
- data/lib/aws-sdk-core/plugins/checksum_algorithm.rb +348 -169
- data/lib/aws-sdk-core/plugins/client_metrics_plugin.rb +1 -1
- data/lib/aws-sdk-core/plugins/client_metrics_send_plugin.rb +14 -2
- data/lib/aws-sdk-core/plugins/credentials_configuration.rb +84 -38
- data/lib/aws-sdk-core/plugins/endpoint_discovery.rb +6 -2
- data/lib/aws-sdk-core/plugins/endpoint_pattern.rb +40 -32
- data/lib/aws-sdk-core/plugins/global_configuration.rb +8 -9
- data/lib/aws-sdk-core/plugins/http_checksum.rb +3 -8
- data/lib/aws-sdk-core/plugins/invocation_id.rb +1 -11
- data/lib/aws-sdk-core/plugins/logging.rb +2 -0
- data/lib/aws-sdk-core/plugins/protocols/api_gateway.rb +3 -1
- data/lib/aws-sdk-core/plugins/protocols/ec2.rb +2 -24
- data/lib/aws-sdk-core/plugins/protocols/json_rpc.rb +6 -8
- data/lib/aws-sdk-core/plugins/protocols/query.rb +4 -2
- data/lib/aws-sdk-core/plugins/protocols/rest_json.rb +3 -15
- data/lib/aws-sdk-core/plugins/protocols/rest_xml.rb +3 -0
- data/lib/aws-sdk-core/plugins/protocols/rpc_v2.rb +17 -0
- data/lib/aws-sdk-core/plugins/regional_endpoint.rb +164 -34
- data/lib/aws-sdk-core/plugins/request_compression.rb +226 -0
- data/lib/aws-sdk-core/plugins/retries/error_inspector.rb +2 -1
- data/lib/aws-sdk-core/plugins/retry_errors.rb +12 -3
- data/lib/aws-sdk-core/plugins/sign.rb +222 -0
- data/lib/aws-sdk-core/plugins/signature_v2.rb +2 -0
- data/lib/aws-sdk-core/plugins/signature_v4.rb +2 -0
- data/lib/aws-sdk-core/plugins/stub_responses.rb +59 -9
- data/lib/aws-sdk-core/plugins/telemetry.rb +75 -0
- data/lib/aws-sdk-core/plugins/transfer_encoding.rb +16 -9
- data/lib/aws-sdk-core/plugins/user_agent.rb +192 -14
- data/lib/aws-sdk-core/plugins.rb +39 -0
- data/lib/aws-sdk-core/process_credentials.rb +48 -29
- data/lib/aws-sdk-core/query/ec2_handler.rb +27 -0
- data/lib/aws-sdk-core/query/ec2_param_builder.rb +5 -7
- data/lib/aws-sdk-core/query/handler.rb +4 -4
- data/lib/aws-sdk-core/query/param_builder.rb +2 -2
- data/lib/aws-sdk-core/query.rb +2 -1
- data/lib/aws-sdk-core/refreshing_credentials.rb +20 -23
- data/lib/aws-sdk-core/resources.rb +8 -0
- data/lib/aws-sdk-core/rest/content_type_handler.rb +60 -0
- data/lib/aws-sdk-core/rest/handler.rb +3 -4
- data/lib/aws-sdk-core/rest/request/body.rb +32 -5
- data/lib/aws-sdk-core/rest/request/endpoint.rb +24 -4
- data/lib/aws-sdk-core/rest/request/headers.rb +14 -10
- data/lib/aws-sdk-core/rest/request/querystring_builder.rb +62 -36
- data/lib/aws-sdk-core/rest/response/body.rb +15 -1
- data/lib/aws-sdk-core/rest/response/header_list_parser.rb +79 -0
- data/lib/aws-sdk-core/rest/response/headers.rb +8 -3
- data/lib/aws-sdk-core/rest.rb +1 -0
- data/lib/aws-sdk-core/rpc_v2/builder.rb +62 -0
- data/lib/aws-sdk-core/rpc_v2/cbor_engine.rb +18 -0
- data/lib/aws-sdk-core/rpc_v2/content_type_handler.rb +47 -0
- data/lib/aws-sdk-core/rpc_v2/error_handler.rb +95 -0
- data/lib/aws-sdk-core/rpc_v2/handler.rb +79 -0
- data/lib/aws-sdk-core/rpc_v2/parser.rb +98 -0
- data/lib/aws-sdk-core/rpc_v2.rb +69 -0
- data/lib/aws-sdk-core/shared_config.rb +160 -36
- data/lib/aws-sdk-core/shared_credentials.rb +1 -7
- data/lib/aws-sdk-core/sso_credentials.rb +84 -46
- data/lib/aws-sdk-core/sso_token_provider.rb +3 -2
- data/lib/aws-sdk-core/static_token_provider.rb +1 -2
- data/lib/aws-sdk-core/stubbing/protocols/ec2.rb +12 -11
- data/lib/aws-sdk-core/stubbing/protocols/json.rb +11 -10
- data/lib/aws-sdk-core/stubbing/protocols/query.rb +7 -6
- data/lib/aws-sdk-core/stubbing/protocols/rest.rb +2 -1
- data/lib/aws-sdk-core/stubbing/protocols/rest_json.rb +9 -8
- data/lib/aws-sdk-core/stubbing/protocols/rest_xml.rb +6 -5
- data/lib/aws-sdk-core/stubbing/protocols/rpc_v2.rb +39 -0
- data/lib/aws-sdk-core/stubbing/stub_data.rb +11 -0
- data/lib/aws-sdk-core/stubbing.rb +22 -0
- data/lib/aws-sdk-core/telemetry/base.rb +177 -0
- data/lib/aws-sdk-core/telemetry/no_op.rb +70 -0
- data/lib/aws-sdk-core/telemetry/otel.rb +235 -0
- data/lib/aws-sdk-core/telemetry/span_kind.rb +22 -0
- data/lib/aws-sdk-core/telemetry/span_status.rb +59 -0
- data/lib/aws-sdk-core/telemetry.rb +78 -0
- data/lib/aws-sdk-core/token.rb +3 -3
- data/lib/aws-sdk-core/token_provider.rb +4 -0
- data/lib/aws-sdk-core/token_provider_chain.rb +2 -6
- data/lib/aws-sdk-core/util.rb +41 -1
- data/lib/aws-sdk-core/waiters/poller.rb +12 -5
- data/lib/aws-sdk-core/xml/builder.rb +17 -9
- data/lib/aws-sdk-core/xml/error_handler.rb +35 -43
- data/lib/aws-sdk-core/xml/parser/frame.rb +4 -20
- data/lib/aws-sdk-core/xml/parser/{engines/oga.rb → oga_engine.rb} +2 -0
- data/lib/aws-sdk-core/xml/parser/stack.rb +2 -0
- data/lib/aws-sdk-core/xml/parser.rb +2 -6
- data/lib/aws-sdk-core.rb +82 -103
- data/lib/aws-sdk-sso/client.rb +219 -89
- data/lib/aws-sdk-sso/client_api.rb +7 -0
- data/lib/aws-sdk-sso/endpoint_parameters.rb +69 -0
- data/lib/aws-sdk-sso/endpoint_provider.rb +53 -0
- data/lib/aws-sdk-sso/endpoints.rb +20 -0
- data/lib/aws-sdk-sso/plugins/endpoints.rb +77 -0
- data/lib/aws-sdk-sso/types.rb +1 -35
- data/lib/aws-sdk-sso.rb +15 -7
- data/lib/aws-sdk-ssooidc/client.rb +650 -118
- data/lib/aws-sdk-ssooidc/client_api.rb +94 -1
- data/lib/aws-sdk-ssooidc/endpoint_parameters.rb +69 -0
- data/lib/aws-sdk-ssooidc/endpoint_provider.rb +53 -0
- data/lib/aws-sdk-ssooidc/endpoints.rb +20 -0
- data/lib/aws-sdk-ssooidc/errors.rb +62 -0
- data/lib/aws-sdk-ssooidc/plugins/endpoints.rb +77 -0
- data/lib/aws-sdk-ssooidc/types.rb +437 -67
- data/lib/aws-sdk-ssooidc.rb +15 -7
- data/lib/aws-sdk-sts/client.rb +670 -368
- data/lib/aws-sdk-sts/client_api.rb +48 -9
- data/lib/aws-sdk-sts/customizations.rb +5 -2
- data/lib/aws-sdk-sts/endpoint_parameters.rb +79 -0
- data/lib/aws-sdk-sts/endpoint_provider.rb +107 -0
- data/lib/aws-sdk-sts/endpoints.rb +20 -0
- data/lib/aws-sdk-sts/errors.rb +15 -0
- data/lib/aws-sdk-sts/plugins/endpoints.rb +77 -0
- data/lib/aws-sdk-sts/presigner.rb +12 -18
- data/lib/aws-sdk-sts/types.rb +296 -222
- data/lib/aws-sdk-sts.rb +15 -7
- data/lib/seahorse/client/async_base.rb +4 -6
- data/lib/seahorse/client/async_response.rb +19 -0
- data/lib/seahorse/client/base.rb +18 -21
- data/lib/seahorse/client/configuration.rb +1 -5
- data/lib/seahorse/client/h2/connection.rb +27 -36
- data/lib/seahorse/client/h2/handler.rb +14 -3
- data/lib/seahorse/client/handler.rb +1 -1
- data/lib/seahorse/client/http/response.rb +1 -1
- data/lib/seahorse/client/net_http/connection_pool.rb +15 -12
- data/lib/seahorse/client/net_http/handler.rb +21 -9
- data/lib/seahorse/client/net_http/patches.rb +1 -4
- data/lib/seahorse/client/networking_error.rb +1 -1
- data/lib/seahorse/client/plugin.rb +9 -0
- data/lib/seahorse/client/plugins/endpoint.rb +0 -1
- data/lib/seahorse/client/plugins/h2.rb +4 -4
- data/lib/seahorse/client/plugins/net_http.rb +57 -16
- data/lib/seahorse/client/plugins/request_callback.rb +40 -9
- data/lib/seahorse/client/request_context.rb +9 -2
- data/lib/seahorse/client/response.rb +8 -0
- data/lib/seahorse/model/operation.rb +3 -0
- data/lib/seahorse/model/shapes.rb +2 -2
- data/lib/seahorse/util.rb +6 -1
- data/sig/aws-sdk-core/async_client_stubs.rbs +21 -0
- data/sig/aws-sdk-core/client_stubs.rbs +10 -0
- data/sig/aws-sdk-core/errors.rbs +22 -0
- data/sig/aws-sdk-core/resources/collection.rbs +21 -0
- data/sig/aws-sdk-core/structure.rbs +4 -0
- data/sig/aws-sdk-core/telemetry/base.rbs +46 -0
- data/sig/aws-sdk-core/telemetry/otel.rbs +22 -0
- data/sig/aws-sdk-core/telemetry/span_kind.rbs +15 -0
- data/sig/aws-sdk-core/telemetry/span_status.rbs +24 -0
- data/sig/aws-sdk-core/waiters/errors.rbs +20 -0
- data/sig/aws-sdk-core.rbs +7 -0
- data/sig/seahorse/client/async_base.rbs +18 -0
- data/sig/seahorse/client/base.rbs +25 -0
- data/sig/seahorse/client/handler_builder.rbs +16 -0
- data/sig/seahorse/client/response.rbs +61 -0
- metadata +133 -23
- /data/lib/aws-sdk-core/xml/parser/{engines/libxml.rb → libxml_engine.rb} +0 -0
- /data/lib/aws-sdk-core/xml/parser/{engines/nokogiri.rb → nokogiri_engine.rb} +0 -0
- /data/lib/aws-sdk-core/xml/parser/{engines/ox.rb → ox_engine.rb} +0 -0
- /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
|
-
|
|
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
|
-
|
|
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
|
-
:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
285
|
-
provider
|
|
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
|
|
288
|
-
elsif (provider =
|
|
289
|
-
provider
|
|
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
|
-
|
|
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 &
|
|
416
|
+
!(prof_config.keys & SSO_CREDENTIAL_PROFILE_KEYS).empty?
|
|
335
417
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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
|
|
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]
|