package config import ( "context" "errors" "fmt" "math/rand" "time" aws_config "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/secretsmanager" "github.com/aws/aws-sdk-go-v2/service/secretsmanager/types" "github.com/fleetdm/fleet/v4/server/aws_common" ) // SecretsManagerClient interface for dependency injection and testing type SecretsManagerClient interface { GetSecretValue(ctx context.Context, params *secretsmanager.GetSecretValueInput, optFns ...func(*secretsmanager.Options)) (*secretsmanager.GetSecretValueOutput, error) } // retrieveSecretWithRetry retrieves the secret from AWS with retry logic func retrieveSecretWithRetry(ctx context.Context, client SecretsManagerClient, secretArn string) (string, error) { const maxRetries = 3 var lastErr error for attempt := 0; attempt < maxRetries; attempt++ { if attempt > 0 { // Exponential backoff with jitter: base 500ms with ±50% randomization baseBackoff := time.Duration(500*(1<