aws-sdk-core 2.11.400 → 2.11.401

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.
@@ -2061,10 +2061,13 @@
2061
2061
  "nodejs6.10",
2062
2062
  "nodejs8.10",
2063
2063
  "nodejs10.x",
2064
+ "nodejs12.x",
2064
2065
  "java8",
2066
+ "java11",
2065
2067
  "python2.7",
2066
2068
  "python3.6",
2067
2069
  "python3.7",
2070
+ "python3.8",
2068
2071
  "dotnetcore1.0",
2069
2072
  "dotnetcore2.0",
2070
2073
  "dotnetcore2.1",
@@ -2651,6 +2651,10 @@
2651
2651
  "qldb" : {
2652
2652
  "endpoints" : {
2653
2653
  "ap-northeast-1" : { },
2654
+ "ap-northeast-2" : { },
2655
+ "ap-southeast-1" : { },
2656
+ "ap-southeast-2" : { },
2657
+ "eu-central-1" : { },
2654
2658
  "eu-west-1" : { },
2655
2659
  "us-east-1" : { },
2656
2660
  "us-east-2" : { },
@@ -3326,6 +3330,10 @@
3326
3330
  "session.qldb" : {
3327
3331
  "endpoints" : {
3328
3332
  "ap-northeast-1" : { },
3333
+ "ap-northeast-2" : { },
3334
+ "ap-southeast-1" : { },
3335
+ "ap-southeast-2" : { },
3336
+ "eu-central-1" : { },
3329
3337
  "eu-west-1" : { },
3330
3338
  "us-east-1" : { },
3331
3339
  "us-east-2" : { },
@@ -11,6 +11,15 @@ module Aws
11
11
  # @api private
12
12
  class Non200Response < RuntimeError; end
13
13
 
14
+ # @api private
15
+ class TokenRetrivalError < RuntimeError; end
16
+
17
+ # @api private
18
+ class TokenExpiredError < RuntimeError; end
19
+
20
+ # @api private
21
+ class TokenRetrivalUnavailableError < RuntimeError; end
22
+
14
23
  # These are the errors we trap when attempting to talk to the
15
24
  # instance metadata service. Any of these imply the service
16
25
  # is not present, no responding or some other non-recoverable
@@ -26,6 +35,14 @@ module Aws
26
35
  Non200Response,
27
36
  ]
28
37
 
38
+ # Path base for GET request for profile and credentials
39
+ # @api private
40
+ METADATA_PATH_BASE = '/latest/meta-data/iam/security-credentials/'
41
+
42
+ # Path for PUT request for token
43
+ # @api private
44
+ METADATA_TOKEN_PATH = '/latest/api/token'
45
+
29
46
  # @param [Hash] options
30
47
  # @option options [Integer] :retries (5) Number of times to retry
31
48
  # when retrieving credentials.
@@ -40,6 +57,8 @@ module Aws
40
57
  # @option options [IO] :http_debug_output (nil) HTTP wire
41
58
  # traces are sent to this object. You can specify something
42
59
  # like $stdout.
60
+ # @option options [Integer] :token_ttl (21600) Time-to-Live in seconds for
61
+ # EC2 Metadata Token used for fetching Metadata Profile Credentials.
43
62
  def initialize options = {}
44
63
  @retries = options[:retries] || 5
45
64
  @ip_address = options[:ip_address] || '169.254.169.254'
@@ -48,11 +67,13 @@ module Aws
48
67
  @http_read_timeout = options[:http_read_timeout] || 5
49
68
  @http_debug_output = options[:http_debug_output]
50
69
  @backoff = backoff(options[:backoff])
70
+ @token_ttl = options[:token_ttl] || 21600
51
71
  super
52
72
  end
53
73
 
54
- # @return [Integer] The number of times to retry failed attempts to
55
- # fetch credentials from the instance metadata service. Defaults to 0.
74
+ # @return [Integer] Number of times to retry when retrieving credentials
75
+ # from the instance metadata service. Defaults to 0 when resolving from
76
+ # the default credential chain ({Aws::CredentialProviderChain}).
56
77
  attr_reader :retries
57
78
 
58
79
  private
@@ -93,9 +114,11 @@ module Aws
93
114
  begin
94
115
  retry_errors(NETWORK_ERRORS, max_retries: @retries) do
95
116
  open_connection do |conn|
96
- path = '/latest/meta-data/iam/security-credentials/'
97
- profile_name = http_get(conn, path).lines.first.strip
98
- http_get(conn, path + profile_name)
117
+ _token_attempt(conn)
118
+ token_value = @token.value if token_set?
119
+ profile_name = http_get(conn, METADATA_PATH_BASE, token_value)
120
+ .lines.first.strip
121
+ http_get(conn, METADATA_PATH_BASE + profile_name, token_value)
99
122
  end
100
123
  end
101
124
  rescue
@@ -104,6 +127,28 @@ module Aws
104
127
  end
105
128
  end
106
129
 
130
+ def token_set?
131
+ @token && !@token.expired?
132
+ end
133
+
134
+ # attempt to fetch token with retries baked in
135
+ # would be skipped if token already set
136
+ def _token_attempt(conn)
137
+ begin
138
+ retry_errors(NETWORK_ERRORS, max_retries: @retries) do
139
+ unless token_set?
140
+ token_value, ttl = http_put(conn, METADATA_TOKEN_PATH, @token_ttl)
141
+ @token = Token.new(token_value, ttl) if token_value && ttl
142
+ end
143
+ end
144
+ rescue *NETWORK_ERRORS, TokenRetrivalUnavailableError
145
+ # token attempt failed with allowable errors (those indicating
146
+ # token retrieval not available on the instance), reset token to
147
+ # allow safe failover to non-token mode
148
+ @token = nil
149
+ end
150
+ end
151
+
107
152
  def _metadata_disabled?
108
153
  flag = ENV["AWS_EC2_METADATA_DISABLED"]
109
154
  !flag.nil? && flag.downcase == "true"
@@ -118,10 +163,40 @@ module Aws
118
163
  yield(http).tap { http.finish }
119
164
  end
120
165
 
121
- def http_get(connection, path)
122
- response = connection.request(Net::HTTP::Get.new(path))
123
- if response.code.to_i == 200
166
+ # GET request fetch profile and credentials
167
+ def http_get(connection, path, token=nil)
168
+ headers = {"User-Agent" => "aws-sdk-ruby2/#{VERSION}"}
169
+ headers["x-aws-ec2-metadata-token"] = token if token
170
+ response = connection.request(Net::HTTP::Get.new(path, headers))
171
+ case response.code.to_i
172
+ when 200
124
173
  response.body
174
+ when 401
175
+ raise TokenExpiredError
176
+ else
177
+ raise Non200Response
178
+ end
179
+ end
180
+
181
+ # PUT request fetch token with ttl
182
+ def http_put(connection, path, ttl)
183
+ headers = {
184
+ "User-Agent" => "aws-sdk-ruby2/#{VERSION}",
185
+ "x-aws-ec2-metadata-token-ttl-seconds" => ttl.to_s
186
+ }
187
+ response = connection.request(Net::HTTP::Put.new(path, headers))
188
+ case response.code.to_i
189
+ when 200
190
+ [
191
+ response.body,
192
+ response.header["x-aws-ec2-metadata-token-ttl-seconds"].to_i
193
+ ]
194
+ when 400
195
+ raise TokenRetrivalError
196
+ when 403
197
+ when 404
198
+ when 405
199
+ raise TokenRetrivalUnavailableError
125
200
  else
126
201
  raise Non200Response
127
202
  end
@@ -143,5 +218,24 @@ module Aws
143
218
  end
144
219
  end
145
220
 
221
+ # @api private
222
+ # Token used to fetch IMDS profile and credentials
223
+ class Token
224
+
225
+ def initialize(value, ttl)
226
+ @ttl = ttl
227
+ @value = value
228
+ @created_time = Time.now
229
+ end
230
+
231
+ # [String] token value
232
+ attr_reader :value
233
+
234
+ def expired?
235
+ Time.now - @created_time > @ttl
236
+ end
237
+
238
+ end
239
+
146
240
  end
147
241
  end
@@ -1,3 +1,3 @@
1
1
  module Aws
2
- VERSION = '2.11.400'
2
+ VERSION = '2.11.401'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws-sdk-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.11.400
4
+ version: 2.11.401
5
5
  platform: ruby
6
6
  authors:
7
7
  - Amazon Web Services
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-18 00:00:00.000000000 Z
11
+ date: 2019-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jmespath