From 01548aca2dcdea2111c781a8f4e2bd20a9a52f68 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 10 Apr 2024 11:55:01 -0400 Subject: [PATCH 1/5] Set Retryer MaxBackoff to 5 minutes to match AWS SDK for Go v1 DefaultRetryerMaxRetryDelay. --- aws_config.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/aws_config.go b/aws_config.go index ad4379bf..256176ac 100644 --- a/aws_config.go +++ b/aws_config.go @@ -201,6 +201,12 @@ func resolveRetryer(ctx context.Context, tokenBucketRateLimiterCapacity int, aws } var standardOptions []func(*retry.StandardOptions) + standardOptions = append(standardOptions, func(so *retry.StandardOptions) { + // AWS SDK for Go v1 DefaultRetryerMaxRetryDelay: https://github.com/aws/aws-sdk-go/blob/9f6e3bb9f523aef97fa1cd5c5f8ba8ecf212e44e/aws/client/default_retryer.go#L48-L49. + // Note that certain EC2 operations have a lower value: https://github.com/aws/aws-sdk-go/blob/9f6e3bb9f523aef97fa1cd5c5f8ba8ecf212e44e/service/ec2/customizations.go#L34-L46 + so.MaxBackoff = 300 * time.Second + }) + if v, found, _ := awsconfig.GetRetryMaxAttempts(ctx, awsConfig.ConfigSources); found && v != 0 { standardOptions = append(standardOptions, func(so *retry.StandardOptions) { so.MaxAttempts = v From 7c9d53062348ddde8653c7fad0c00d1c185861d8 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Thu, 11 Apr 2024 08:07:30 -0400 Subject: [PATCH 2/5] Add 'Config.MaxBackoff'. --- aws_config.go | 38 ++++++++++++++++++++------------------ internal/config/config.go | 1 + 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/aws_config.go b/aws_config.go index 10de683d..ce85ee6c 100644 --- a/aws_config.go +++ b/aws_config.go @@ -174,7 +174,7 @@ func GetAwsConfig(ctx context.Context, c *Config) (context.Context, aws.Config, } } - resolveRetryer(baseCtx, c.TokenBucketRateLimiterCapacity, &awsConfig) + resolveRetryer(baseCtx, c, &awsConfig) if !c.SkipCredsValidation { if _, _, err := getAccountIDAndPartitionFromSTSGetCallerIdentity(baseCtx, stsClient(baseCtx, awsConfig, c)); err != nil { @@ -187,7 +187,7 @@ func GetAwsConfig(ctx context.Context, c *Config) (context.Context, aws.Config, // Adapted from the per-service-client `resolveRetryer()` functions in the AWS SDK for Go v2 // e.g. https://github.com/aws/aws-sdk-go-v2/blob/main/service/accessanalyzer/api_client.go -func resolveRetryer(ctx context.Context, tokenBucketRateLimiterCapacity int, awsConfig *aws.Config) { +func resolveRetryer(ctx context.Context, c *Config, awsConfig *aws.Config) { retryMode := awsConfig.RetryMode if len(retryMode) == 0 { defaultsMode := resolveDefaultsMode(ctx, awsConfig) @@ -201,10 +201,6 @@ func resolveRetryer(ctx context.Context, tokenBucketRateLimiterCapacity int, aws } var standardOptions []func(*retry.StandardOptions) - standardOptions = append(standardOptions, func(so *retry.StandardOptions) { - // AWS SDK for Go v1 DefaultRetryerMaxRetryDelay: https://github.com/aws/aws-sdk-go/blob/9f6e3bb9f523aef97fa1cd5c5f8ba8ecf212e44e/aws/client/default_retryer.go#L48-L49. - so.MaxBackoff = 300 * time.Second - }) if v, found, _ := awsconfig.GetRetryMaxAttempts(ctx, awsConfig.ConfigSources); found && v != 0 { standardOptions = append(standardOptions, func(so *retry.StandardOptions) { @@ -212,18 +208,24 @@ func resolveRetryer(ctx context.Context, tokenBucketRateLimiterCapacity int, aws }) } - newRetryer := func(retryMode aws.RetryMode, standardOptions []func(*retry.StandardOptions), tokenBucketRateLimiterCapacity int) aws.RetryerV2 { - var retryer aws.RetryerV2 + if maxBackoff := c.MaxBackoff; maxBackoff > 0 { + standardOptions = append(standardOptions, func(so *retry.StandardOptions) { + so.MaxBackoff = maxBackoff + }) + } - if tokenBucketRateLimiterCapacity > 0 { - standardOptions = append(standardOptions, func(so *retry.StandardOptions) { - so.RateLimiter = ratelimit.NewTokenRateLimit(uint(tokenBucketRateLimiterCapacity)) - }) - } else { - standardOptions = append(standardOptions, func(so *retry.StandardOptions) { - so.RateLimiter = ratelimit.None - }) - } + if tokenBucketRateLimiterCapacity := c.TokenBucketRateLimiterCapacity; tokenBucketRateLimiterCapacity > 0 { + standardOptions = append(standardOptions, func(so *retry.StandardOptions) { + so.RateLimiter = ratelimit.NewTokenRateLimit(uint(tokenBucketRateLimiterCapacity)) + }) + } else { + standardOptions = append(standardOptions, func(so *retry.StandardOptions) { + so.RateLimiter = ratelimit.None + }) + } + + newRetryer := func(retryMode aws.RetryMode, standardOptions []func(*retry.StandardOptions)) aws.RetryerV2 { + var retryer aws.RetryerV2 switch retryMode { case aws.RetryModeAdaptive: @@ -245,7 +247,7 @@ func resolveRetryer(ctx context.Context, tokenBucketRateLimiterCapacity int, aws awsConfig.Retryer = func() aws.Retryer { return &networkErrorShortcutter{ // Ensure that each invocation of this function returns an independent Retryer. - RetryerV2: newRetryer(retryMode, slices.Clone(standardOptions), tokenBucketRateLimiterCapacity), + RetryerV2: newRetryer(retryMode, slices.Clone(standardOptions)), } } } diff --git a/internal/config/config.go b/internal/config/config.go index 16416934..ac3906ba 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -47,6 +47,7 @@ type Config struct { IamEndpoint string Insecure bool Logger logging.Logger + MaxBackoff time.Duration MaxRetries int NoProxy string Profile string From b78c18eb91aec33ce14e1df38f3842e226b41e36 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Thu, 11 Apr 2024 08:10:57 -0400 Subject: [PATCH 3/5] Add CHANGELOG entry. --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93733f01..a35ce5ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ # v2.0.0 (Unreleased) +BUG FIXES + +* Updates dependencies. + +ENHANCEMENTS + +* Adds `MaxBackoff` parameter to configure the maximum backoff delay that is allowed to occur between retrying a failed request + # v2.0.0-beta.51 (2024-04-04) BUG FIXES From 0fac7445d8200c1e65697c059895613cc093bbb1 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Thu, 11 Apr 2024 11:05:06 -0400 Subject: [PATCH 4/5] Add 'v2.0.0-beta.52' CHANGELOG entry. --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a35ce5ff..69111a03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,15 @@ # v2.0.0 (Unreleased) +# v2.0.0-beta.52 (2024-04-11) + BUG FIXES * Updates dependencies. ENHANCEMENTS -* Adds `MaxBackoff` parameter to configure the maximum backoff delay that is allowed to occur between retrying a failed request +* Adds `MaxBackoff` parameter to configure the maximum backoff delay that is allowed to occur between retrying a failed request ([#1011](https://github.com/hashicorp/aws-sdk-go-base/pull/1011)) # v2.0.0-beta.51 (2024-04-04) From 761ed31a68b1fda6d71a473e629f7e5e3e092ec4 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Thu, 11 Apr 2024 11:07:56 -0400 Subject: [PATCH 5/5] Update `v2/awsv1shim/go.mod`. --- v2/awsv1shim/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2/awsv1shim/go.mod b/v2/awsv1shim/go.mod index 97c17f97..85a9d1b6 100644 --- a/v2/awsv1shim/go.mod +++ b/v2/awsv1shim/go.mod @@ -10,7 +10,7 @@ require ( github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 github.com/google/go-cmp v0.6.0 - github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.51 + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.52 github.com/hashicorp/go-cleanhttp v0.5.2 github.com/hashicorp/terraform-plugin-log v0.9.0 go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.50.0