aws-sdk-core 2.11.400 → 2.11.401

Sign up to get free protection for your applications and to get access to all the features.
@@ -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