@@ -36,8 +36,7 @@ class InstanceProfileCredentials
3636 # called with an instance of this object when AWS credentials are required and need to be refreshed.
3737 def initialize ( options = { } )
3838 @ec2_metadata = options . delete ( :ec2_metadata ) || build_ec2_metadata_client ( options )
39- @retries = options . delete ( :retries ) || 3
40- @backoff = resolve_backoff ( options [ :backoff ] )
39+
4140 @no_refresh_until = nil
4241 @async_refresh = false
4342 @metrics = [ 'CREDENTIALS_IMDS' ]
@@ -53,9 +52,7 @@ def build_ec2_metadata_client(options)
5352 opts = options . merge (
5453 endpoint_mode : resolve_endpoint_mode ( options ) ,
5554 endpoint : resolve_endpoint ( options ) ,
56- disable_imds_v1 : resolve_disable_v1 ( options ) ,
57- retries : 0 ,
58- backoff : 0
55+ disable_imds_v1 : resolve_disable_v1 ( options )
5956 )
6057 if ( delay = opts . delete ( :delay ) )
6158 warn ( 'The `:delay` option is deprecated. Use `:backoff` instead.' )
@@ -97,7 +94,15 @@ def refresh
9794 return
9895 end
9996
100- new_creds = retry_errors { Aws ::Json . load ( fetch_credentials ) }
97+ new_creds =
98+ begin
99+ retry_json_errors { Aws ::Json . load ( fetch_credentials ) }
100+ rescue Aws ::Json ::ParseError
101+ raise Aws ::Errors ::MetadataParserError
102+ rescue StandardError => e
103+ warn ( "Error retrieving instance profile credentials: #{ e } " )
104+ '{}'
105+ end
101106
102107 if !empty_credentials? ( @credentials ) && ( !new_creds [ 'AccessKeyId' ] || new_creds [ 'AccessKeyId' ] . empty? )
103108 # credentials are already set, but there was an error getting new credentials
@@ -120,6 +125,9 @@ def fetch_credentials
120125 metadata = @ec2_metadata . get ( METADATA_PATH_BASE )
121126 profile_name = metadata . lines . first . strip
122127 @ec2_metadata . get ( METADATA_PATH_BASE + profile_name )
128+ rescue StandardError => e
129+ warn ( "Error retrieving instance profile credentials: #{ e } " )
130+ '{}'
123131 end
124132
125133 def update_credentials ( creds )
@@ -140,42 +148,15 @@ def ec2_metadata_disabled?
140148 ENV . fetch ( 'AWS_EC2_METADATA_DISABLED' , 'false' ) . downcase == 'true'
141149 end
142150
143- def resolve_backoff ( backoff )
144- case backoff
145- when Proc then backoff
146- when Numeric then -> ( _ ) { Kernel . sleep ( backoff ) }
147- else -> ( num_failures ) { Kernel . sleep ( 1.2 **num_failures ) }
148- end
149- end
150-
151- def retry_errors ( &_block )
151+ def retry_json_errors ( &_block )
152152 attempts = 0
153- unretryable_errors = [
154- EC2Metadata ::TokenRetrievalError ,
155- EC2Metadata ::MetadataNotFoundError ,
156- EC2Metadata ::RequestForbiddenError
157- ]
158-
159153 begin
160154 yield
161155 rescue Aws ::Json ::ParseError
162- raise Aws :: Errors :: MetadataParserError unless attempts < @retries
156+ raise unless attempts < 3
163157
164- @backoff . call ( attempts )
165158 attempts += 1
166159 retry
167- rescue *unretryable_errors => e
168- warn ( "Error retrieving instance profile credentials: #{ e } " )
169- '{}'
170- rescue StandardError
171- if attempts < @retries
172- @backoff . call ( attempts )
173- attempts += 1
174- retry
175- else
176- warn ( "Error retrieving instance profile credentials: #{ e } " )
177- '{}'
178- end
179160 end
180161 end
181162 end
0 commit comments