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
|
@@ -2,21 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
require 'time'
|
|
4
4
|
require 'net/http'
|
|
5
|
+
require 'resolv'
|
|
5
6
|
|
|
6
7
|
module Aws
|
|
7
8
|
# An auto-refreshing credential provider that loads credentials from
|
|
8
|
-
# instances running in
|
|
9
|
+
# instances running in containers.
|
|
9
10
|
#
|
|
10
11
|
# ecs_credentials = Aws::ECSCredentials.new(retries: 3)
|
|
11
12
|
# ec2 = Aws::EC2::Client.new(credentials: ecs_credentials)
|
|
12
13
|
class ECSCredentials
|
|
13
|
-
|
|
14
14
|
include CredentialProvider
|
|
15
15
|
include RefreshingCredentials
|
|
16
16
|
|
|
17
17
|
# @api private
|
|
18
18
|
class Non200Response < RuntimeError; end
|
|
19
19
|
|
|
20
|
+
# Raised when the token file cannot be read.
|
|
21
|
+
class TokenFileReadError < RuntimeError; end
|
|
22
|
+
|
|
23
|
+
# Raised when the token file is invalid.
|
|
24
|
+
class InvalidTokenError < RuntimeError; end
|
|
25
|
+
|
|
20
26
|
# These are the errors we trap when attempting to talk to the
|
|
21
27
|
# instance metadata service. Any of these imply the service
|
|
22
28
|
# is not present, no responding or some other non-recoverable
|
|
@@ -29,45 +35,49 @@ module Aws
|
|
|
29
35
|
Errno::ENETUNREACH,
|
|
30
36
|
SocketError,
|
|
31
37
|
Timeout::Error,
|
|
32
|
-
Non200Response
|
|
33
|
-
]
|
|
38
|
+
Non200Response
|
|
39
|
+
].freeze
|
|
34
40
|
|
|
35
41
|
# @param [Hash] options
|
|
36
42
|
# @option options [Integer] :retries (5) Number of times to retry
|
|
37
43
|
# when retrieving credentials.
|
|
38
|
-
# @option options [String] :ip_address ('169.254.170.2')
|
|
39
|
-
#
|
|
44
|
+
# @option options [String] :ip_address ('169.254.170.2') This value is
|
|
45
|
+
# ignored if `:endpoint` is set and `:credential_path` is not set.
|
|
46
|
+
# @option options [Integer] :port (80) This value is ignored if `:endpoint`
|
|
47
|
+
# is set and `:credential_path` is not set.
|
|
40
48
|
# @option options [String] :credential_path By default, the value of the
|
|
41
|
-
# AWS_CONTAINER_CREDENTIALS_RELATIVE_URI environment variable.
|
|
49
|
+
# `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` environment variable.
|
|
50
|
+
# @option options [String] :endpoint The container credential endpoint.
|
|
51
|
+
# By default, this is the value of the `AWS_CONTAINER_CREDENTIALS_FULL_URI`
|
|
52
|
+
# environment variable. This value is ignored if `:credential_path` or
|
|
53
|
+
# `ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI']` is set.
|
|
42
54
|
# @option options [Float] :http_open_timeout (5)
|
|
43
55
|
# @option options [Float] :http_read_timeout (5)
|
|
44
|
-
# @option options [
|
|
56
|
+
# @option options [IO] :http_debug_output (nil) HTTP wire
|
|
57
|
+
# traces are sent to this object. You can specify something
|
|
58
|
+
# like `$stdout`.
|
|
59
|
+
# @option options [Numeric, Proc] :backoff By default, failures are retried
|
|
45
60
|
# with exponential back-off, i.e. `sleep(1.2 ** num_failures)`. You can
|
|
46
61
|
# pass a number of seconds to sleep between failed attempts, or
|
|
47
62
|
# a Proc that accepts the number of failures.
|
|
48
|
-
# @option options [
|
|
49
|
-
#
|
|
50
|
-
# like $stdout.
|
|
51
|
-
# @option options [Callable] before_refresh Proc called before
|
|
52
|
-
# credentials are refreshed. `before_refresh` is called
|
|
63
|
+
# @option options [Proc] :before_refresh A Proc called before
|
|
64
|
+
# credentials are refreshed. `:before_refresh` is called
|
|
53
65
|
# with an instance of this object when
|
|
54
66
|
# AWS credentials are required and need to be refreshed.
|
|
55
|
-
def initialize
|
|
67
|
+
def initialize(options = {})
|
|
68
|
+
credential_path = options[:credential_path] ||
|
|
69
|
+
ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI']
|
|
70
|
+
endpoint = options[:endpoint] ||
|
|
71
|
+
ENV['AWS_CONTAINER_CREDENTIALS_FULL_URI']
|
|
72
|
+
initialize_uri(options, credential_path, endpoint)
|
|
73
|
+
|
|
56
74
|
@retries = options[:retries] || 5
|
|
57
|
-
@ip_address = options[:ip_address] || '169.254.170.2'
|
|
58
|
-
@port = options[:port] || 80
|
|
59
|
-
@credential_path = options[:credential_path]
|
|
60
|
-
@credential_path ||= ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI']
|
|
61
|
-
unless @credential_path
|
|
62
|
-
raise ArgumentError.new(
|
|
63
|
-
"Cannot instantiate an ECS Credential Provider without a credential path."
|
|
64
|
-
)
|
|
65
|
-
end
|
|
66
75
|
@http_open_timeout = options[:http_open_timeout] || 5
|
|
67
76
|
@http_read_timeout = options[:http_read_timeout] || 5
|
|
68
77
|
@http_debug_output = options[:http_debug_output]
|
|
69
78
|
@backoff = backoff(options[:backoff])
|
|
70
79
|
@async_refresh = false
|
|
80
|
+
@metrics = ['CREDENTIALS_HTTP']
|
|
71
81
|
super
|
|
72
82
|
end
|
|
73
83
|
|
|
@@ -77,11 +87,95 @@ module Aws
|
|
|
77
87
|
|
|
78
88
|
private
|
|
79
89
|
|
|
90
|
+
def initialize_uri(options, credential_path, endpoint)
|
|
91
|
+
if credential_path
|
|
92
|
+
initialize_relative_uri(options, credential_path)
|
|
93
|
+
# Use FULL_URI/endpoint only if RELATIVE_URI/path is not set
|
|
94
|
+
elsif endpoint
|
|
95
|
+
initialize_full_uri(endpoint)
|
|
96
|
+
else
|
|
97
|
+
raise ArgumentError,
|
|
98
|
+
'Cannot instantiate an ECS Credential Provider '\
|
|
99
|
+
'without a credential path or endpoint.'
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def initialize_relative_uri(options, path)
|
|
104
|
+
@host = options[:ip_address] || '169.254.170.2'
|
|
105
|
+
@port = options[:port] || 80
|
|
106
|
+
@scheme = 'http'
|
|
107
|
+
@credential_path = path
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def initialize_full_uri(endpoint)
|
|
111
|
+
uri = URI.parse(endpoint)
|
|
112
|
+
validate_full_uri_scheme!(uri)
|
|
113
|
+
validate_full_uri!(uri)
|
|
114
|
+
@host = uri.hostname
|
|
115
|
+
@port = uri.port
|
|
116
|
+
@scheme = uri.scheme
|
|
117
|
+
@credential_path = uri.request_uri
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def validate_full_uri_scheme!(full_uri)
|
|
121
|
+
return if full_uri.is_a?(URI::HTTP) || full_uri.is_a?(URI::HTTPS)
|
|
122
|
+
|
|
123
|
+
raise ArgumentError, "'#{full_uri}' must be a valid HTTP or HTTPS URI"
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Validate that the full URI is using a loopback address if scheme is http.
|
|
127
|
+
def validate_full_uri!(full_uri)
|
|
128
|
+
return unless full_uri.scheme == 'http'
|
|
129
|
+
|
|
130
|
+
begin
|
|
131
|
+
return if valid_ip_address?(IPAddr.new(full_uri.host))
|
|
132
|
+
rescue IPAddr::InvalidAddressError
|
|
133
|
+
addresses = Resolv.getaddresses(full_uri.host)
|
|
134
|
+
return if addresses.all? { |addr| valid_ip_address?(IPAddr.new(addr)) }
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
raise ArgumentError,
|
|
138
|
+
'AWS_CONTAINER_CREDENTIALS_FULL_URI must use a local loopback '\
|
|
139
|
+
'or an ECS or EKS link-local address when using the http scheme.'
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def valid_ip_address?(ip_address)
|
|
143
|
+
ip_loopback?(ip_address) || ecs_or_eks_ip?(ip_address)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# loopback? method is available in Ruby 2.5+
|
|
147
|
+
# Replicate the logic here.
|
|
148
|
+
# loopback (IPv4 127.0.0.0/8, IPv6 ::1/128)
|
|
149
|
+
def ip_loopback?(ip_address)
|
|
150
|
+
case ip_address.family
|
|
151
|
+
when Socket::AF_INET
|
|
152
|
+
ip_address & 0xff000000 == 0x7f000000
|
|
153
|
+
when Socket::AF_INET6
|
|
154
|
+
ip_address == 1
|
|
155
|
+
else
|
|
156
|
+
false
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Verify that the IP address is a link-local address from ECS or EKS.
|
|
161
|
+
# ECS container host (IPv4 `169.254.170.2`)
|
|
162
|
+
# EKS container host (IPv4 `169.254.170.23`, IPv6 `fd00:ec2::23`)
|
|
163
|
+
def ecs_or_eks_ip?(ip_address)
|
|
164
|
+
case ip_address.family
|
|
165
|
+
when Socket::AF_INET
|
|
166
|
+
[0xa9feaa02, 0xa9feaa17].include?(ip_address)
|
|
167
|
+
when Socket::AF_INET6
|
|
168
|
+
ip_address == 0xfd00_0ec2_0000_0000_0000_0000_0000_0023
|
|
169
|
+
else
|
|
170
|
+
false
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
80
174
|
def backoff(backoff)
|
|
81
175
|
case backoff
|
|
82
176
|
when Proc then backoff
|
|
83
|
-
when Numeric then
|
|
84
|
-
else
|
|
177
|
+
when Numeric then ->(_) { sleep(backoff) }
|
|
178
|
+
else ->(num_failures) { Kernel.sleep(1.2**num_failures) }
|
|
85
179
|
end
|
|
86
180
|
end
|
|
87
181
|
|
|
@@ -89,68 +183,100 @@ module Aws
|
|
|
89
183
|
# Retry loading credentials up to 3 times is the instance metadata
|
|
90
184
|
# service is responding but is returning invalid JSON documents
|
|
91
185
|
# in response to the GET profile credentials call.
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
end
|
|
102
|
-
rescue Aws::Json::ParseError
|
|
103
|
-
raise Aws::Errors::MetadataParserError.new
|
|
186
|
+
|
|
187
|
+
retry_errors([Aws::Json::ParseError, StandardError], max_retries: 3) do
|
|
188
|
+
c = Aws::Json.load(get_credentials.to_s)
|
|
189
|
+
@credentials = Credentials.new(
|
|
190
|
+
c['AccessKeyId'],
|
|
191
|
+
c['SecretAccessKey'],
|
|
192
|
+
c['Token']
|
|
193
|
+
)
|
|
194
|
+
@expiration = c['Expiration'] ? Time.iso8601(c['Expiration']) : nil
|
|
104
195
|
end
|
|
196
|
+
rescue Aws::Json::ParseError
|
|
197
|
+
raise Aws::Errors::MetadataParserError
|
|
105
198
|
end
|
|
106
199
|
|
|
107
200
|
def get_credentials
|
|
108
201
|
# Retry loading credentials a configurable number of times if
|
|
109
202
|
# the instance metadata service is not responding.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
end
|
|
203
|
+
|
|
204
|
+
retry_errors(NETWORK_ERRORS, max_retries: @retries) do
|
|
205
|
+
open_connection do |conn|
|
|
206
|
+
http_get(conn, @credential_path)
|
|
115
207
|
end
|
|
116
|
-
rescue
|
|
117
|
-
'{}'
|
|
118
208
|
end
|
|
209
|
+
rescue TokenFileReadError, InvalidTokenError
|
|
210
|
+
raise
|
|
211
|
+
rescue StandardError => e
|
|
212
|
+
warn("Error retrieving ECS Credentials: #{e.message}")
|
|
213
|
+
'{}'
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def fetch_authorization_token
|
|
217
|
+
if (path = ENV['AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE'])
|
|
218
|
+
fetch_authorization_token_file(path)
|
|
219
|
+
elsif (token = ENV['AWS_CONTAINER_AUTHORIZATION_TOKEN'])
|
|
220
|
+
token
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def fetch_authorization_token_file(path)
|
|
225
|
+
File.read(path).strip
|
|
226
|
+
rescue Errno::ENOENT
|
|
227
|
+
raise TokenFileReadError,
|
|
228
|
+
'AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE is set '\
|
|
229
|
+
"but the file doesn't exist: #{path}"
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def validate_authorization_token!(token)
|
|
233
|
+
return unless token.include?("\r\n")
|
|
234
|
+
|
|
235
|
+
raise InvalidTokenError,
|
|
236
|
+
'Invalid Authorization token: token contains '\
|
|
237
|
+
'a newline and carriage return character.'
|
|
119
238
|
end
|
|
120
239
|
|
|
121
240
|
def open_connection
|
|
122
|
-
http = Net::HTTP.new(@
|
|
241
|
+
http = Net::HTTP.new(@host, @port, nil)
|
|
123
242
|
http.open_timeout = @http_open_timeout
|
|
124
243
|
http.read_timeout = @http_read_timeout
|
|
125
244
|
http.set_debug_output(@http_debug_output) if @http_debug_output
|
|
245
|
+
http.use_ssl = @scheme == 'https'
|
|
126
246
|
http.start
|
|
127
247
|
yield(http).tap { http.finish }
|
|
128
248
|
end
|
|
129
249
|
|
|
130
250
|
def http_get(connection, path)
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
251
|
+
request = Net::HTTP::Get.new(path)
|
|
252
|
+
set_authorization_token(request)
|
|
253
|
+
response = connection.request(request)
|
|
254
|
+
raise Non200Response unless response.code.to_i == 200
|
|
255
|
+
|
|
256
|
+
response.body
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def set_authorization_token(request)
|
|
260
|
+
if (authorization_token = fetch_authorization_token)
|
|
261
|
+
validate_authorization_token!(authorization_token)
|
|
262
|
+
request['Authorization'] = authorization_token
|
|
136
263
|
end
|
|
137
264
|
end
|
|
138
265
|
|
|
139
|
-
def retry_errors(error_classes, options = {}
|
|
266
|
+
def retry_errors(error_classes, options = {})
|
|
140
267
|
max_retries = options[:max_retries]
|
|
141
268
|
retries = 0
|
|
142
269
|
begin
|
|
143
270
|
yield
|
|
144
|
-
rescue
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
271
|
+
rescue TokenFileReadError, InvalidTokenError
|
|
272
|
+
raise
|
|
273
|
+
rescue *error_classes => _e
|
|
274
|
+
raise unless retries < max_retries
|
|
275
|
+
|
|
276
|
+
@backoff.call(retries)
|
|
277
|
+
retries += 1
|
|
278
|
+
retry
|
|
152
279
|
end
|
|
153
280
|
end
|
|
154
|
-
|
|
155
281
|
end
|
|
156
282
|
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aws
|
|
4
|
+
module Endpoints
|
|
5
|
+
# This class is deprecated. It is used by the Runtime endpoint
|
|
6
|
+
# resolution approach. It has been replaced by a code generated
|
|
7
|
+
# approach in each service gem. It can be removed in a new
|
|
8
|
+
# major version. It has to exist because
|
|
9
|
+
# old service gems can use a new core version.
|
|
10
|
+
# @api private
|
|
11
|
+
class Condition
|
|
12
|
+
def initialize(fn:, argv:, assign: nil)
|
|
13
|
+
@fn = Function.new(fn: fn, argv: argv)
|
|
14
|
+
@assign = assign
|
|
15
|
+
@assigned = {}
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
attr_reader :fn
|
|
19
|
+
attr_reader :argv
|
|
20
|
+
attr_reader :assign
|
|
21
|
+
|
|
22
|
+
attr_reader :assigned
|
|
23
|
+
|
|
24
|
+
def match?(parameters, assigns)
|
|
25
|
+
output = @fn.call(parameters, assigns)
|
|
26
|
+
@assigned = @assigned.merge({ @assign => output }) if @assign
|
|
27
|
+
output
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.from_json(conditions_json)
|
|
31
|
+
conditions_json.each.with_object([]) do |condition, conditions|
|
|
32
|
+
conditions << new(
|
|
33
|
+
fn: condition['fn'],
|
|
34
|
+
argv: condition['argv'],
|
|
35
|
+
assign: condition['assign']
|
|
36
|
+
)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aws
|
|
4
|
+
module Endpoints
|
|
5
|
+
class Endpoint
|
|
6
|
+
def initialize(url:, properties: {}, headers: {}, metadata: {})
|
|
7
|
+
@url = url
|
|
8
|
+
@properties = properties
|
|
9
|
+
@headers = headers
|
|
10
|
+
@metadata = metadata
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
attr_reader :url
|
|
14
|
+
attr_reader :properties
|
|
15
|
+
attr_reader :headers
|
|
16
|
+
attr_reader :metadata
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aws
|
|
4
|
+
module Endpoints
|
|
5
|
+
# This class is deprecated. It is used by the Runtime endpoint
|
|
6
|
+
# resolution approach. It has been replaced by a code generated
|
|
7
|
+
# approach in each service gem. It can be removed in a new
|
|
8
|
+
# major version. It has to exist because
|
|
9
|
+
# old service gems can use a new core version. # @api private
|
|
10
|
+
class EndpointRule < Rule
|
|
11
|
+
def initialize(type: 'endpoint', conditions:, endpoint:,
|
|
12
|
+
documentation: nil)
|
|
13
|
+
@type = type
|
|
14
|
+
@conditions = Condition.from_json(conditions)
|
|
15
|
+
@endpoint = endpoint
|
|
16
|
+
@documentation = documentation
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
attr_reader :type
|
|
20
|
+
attr_reader :conditions
|
|
21
|
+
attr_reader :endpoint
|
|
22
|
+
attr_reader :documentation
|
|
23
|
+
|
|
24
|
+
def match(parameters, assigned = {})
|
|
25
|
+
assigns = assigned.dup
|
|
26
|
+
matched = conditions.all? do |condition|
|
|
27
|
+
output = condition.match?(parameters, assigns)
|
|
28
|
+
assigns = assigns.merge(condition.assigned) if condition.assign
|
|
29
|
+
output
|
|
30
|
+
end
|
|
31
|
+
resolved_endpoint(parameters, assigns) if matched
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def resolved_endpoint(parameters, assigns)
|
|
35
|
+
Endpoint.new(
|
|
36
|
+
url: resolve_value(@endpoint['url'], parameters, assigns),
|
|
37
|
+
properties: resolve_properties(
|
|
38
|
+
@endpoint['properties'] || {},
|
|
39
|
+
parameters,
|
|
40
|
+
assigns
|
|
41
|
+
),
|
|
42
|
+
headers: resolve_headers(parameters, assigns)
|
|
43
|
+
)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def resolve_headers(parameters, assigns)
|
|
49
|
+
(@endpoint['headers'] || {}).each.with_object({}) do |(key, arr), headers|
|
|
50
|
+
headers[key] = []
|
|
51
|
+
arr.each do |value|
|
|
52
|
+
headers[key] << resolve_value(value, parameters, assigns)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def resolve_properties(obj, parameters, assigns)
|
|
58
|
+
case obj
|
|
59
|
+
when Hash
|
|
60
|
+
obj.each.with_object({}) do |(key, value), hash|
|
|
61
|
+
hash[key] = resolve_properties(value, parameters, assigns)
|
|
62
|
+
end
|
|
63
|
+
when Array
|
|
64
|
+
obj.collect { |value| resolve_properties(value, parameters, assigns) }
|
|
65
|
+
else
|
|
66
|
+
if obj.is_a?(String)
|
|
67
|
+
Templater.resolve(obj, parameters, assigns)
|
|
68
|
+
else
|
|
69
|
+
obj
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aws
|
|
4
|
+
module Endpoints
|
|
5
|
+
# This class is deprecated. It is used by the Runtime endpoint
|
|
6
|
+
# resolution approach. It has been replaced by a code generated
|
|
7
|
+
# approach in each service gem. It can be removed in a new
|
|
8
|
+
# major version. It has to exist because
|
|
9
|
+
# old service gems can use a new core version.
|
|
10
|
+
# @api private
|
|
11
|
+
class ErrorRule < Rule
|
|
12
|
+
def initialize(type: 'error', conditions:, error: nil, documentation: nil)
|
|
13
|
+
@type = type
|
|
14
|
+
@conditions = Condition.from_json(conditions)
|
|
15
|
+
@error = error
|
|
16
|
+
@documentation = documentation
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
attr_reader :type
|
|
20
|
+
attr_reader :conditions
|
|
21
|
+
attr_reader :error
|
|
22
|
+
attr_reader :documentation
|
|
23
|
+
|
|
24
|
+
def match(parameters, assigned = {})
|
|
25
|
+
assigns = assigned.dup
|
|
26
|
+
matched = conditions.all? do |condition|
|
|
27
|
+
output = condition.match?(parameters, assigns)
|
|
28
|
+
assigns = assigns.merge(condition.assigned) if condition.assign
|
|
29
|
+
output
|
|
30
|
+
end
|
|
31
|
+
resolved_error(parameters, assigns) if matched
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def resolved_error(parameters, assigns)
|
|
37
|
+
error = resolve_value(@error, parameters, assigns)
|
|
38
|
+
ArgumentError.new(error)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aws
|
|
4
|
+
module Endpoints
|
|
5
|
+
# This class is deprecated. It is used by the Runtime endpoint
|
|
6
|
+
# resolution approach. It has been replaced by a code generated
|
|
7
|
+
# approach in each service gem. It can be removed in a new
|
|
8
|
+
# major version. It has to exist because
|
|
9
|
+
# old service gems can use a new core version.
|
|
10
|
+
# @api private
|
|
11
|
+
class Function
|
|
12
|
+
def initialize(fn:, argv:)
|
|
13
|
+
@fn = fn
|
|
14
|
+
@argv = build_argv(argv)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
attr_reader :fn
|
|
18
|
+
attr_reader :argv
|
|
19
|
+
|
|
20
|
+
def call(parameters, assigns)
|
|
21
|
+
args = []
|
|
22
|
+
@argv.each do |arg|
|
|
23
|
+
if arg.is_a?(Reference)
|
|
24
|
+
args << arg.resolve(parameters, assigns)
|
|
25
|
+
elsif arg.is_a?(Function)
|
|
26
|
+
args << arg.call(parameters, assigns)
|
|
27
|
+
else
|
|
28
|
+
if arg.is_a?(String)
|
|
29
|
+
arg = Templater.resolve(arg, parameters, assigns)
|
|
30
|
+
end
|
|
31
|
+
args << arg
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
case @fn
|
|
36
|
+
when 'isSet'
|
|
37
|
+
Matchers.set?(*args)
|
|
38
|
+
when 'not'
|
|
39
|
+
Matchers.not(*args)
|
|
40
|
+
when 'getAttr'
|
|
41
|
+
Matchers.attr(*args)
|
|
42
|
+
when 'substring'
|
|
43
|
+
Matchers.substring(*args)
|
|
44
|
+
when 'stringEquals'
|
|
45
|
+
Matchers.string_equals?(*args)
|
|
46
|
+
when 'booleanEquals'
|
|
47
|
+
Matchers.boolean_equals?(*args)
|
|
48
|
+
when 'uriEncode'
|
|
49
|
+
Matchers.uri_encode(*args)
|
|
50
|
+
when 'parseURL'
|
|
51
|
+
Matchers.parse_url(*args)
|
|
52
|
+
when 'isValidHostLabel'
|
|
53
|
+
Matchers.valid_host_label?(*args)
|
|
54
|
+
when 'aws.partition'
|
|
55
|
+
Matchers.aws_partition(*args)
|
|
56
|
+
when 'aws.parseArn'
|
|
57
|
+
Matchers.aws_parse_arn(*args)
|
|
58
|
+
when 'aws.isVirtualHostableS3Bucket'
|
|
59
|
+
Matchers.aws_virtual_hostable_s3_bucket?(*args)
|
|
60
|
+
else
|
|
61
|
+
raise "Function not found: #{@fn}"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
def build_argv(argv_json)
|
|
68
|
+
argv_json.each.with_object([]) do |arg, argv|
|
|
69
|
+
argv << if arg.is_a?(Hash) && arg['ref']
|
|
70
|
+
Reference.new(ref: arg['ref'])
|
|
71
|
+
elsif arg.is_a?(Hash) && arg['fn']
|
|
72
|
+
Function.new(fn: arg['fn'], argv: arg['argv'])
|
|
73
|
+
else
|
|
74
|
+
arg
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|