|
|
@@ -17,8 +17,12 @@ package aws
|
|
|
import (
|
|
|
"context"
|
|
|
"fmt"
|
|
|
+ "time"
|
|
|
|
|
|
+ "github.com/aws/aws-sdk-go/aws"
|
|
|
+ awsclient "github.com/aws/aws-sdk-go/aws/client"
|
|
|
"github.com/aws/aws-sdk-go/aws/endpoints"
|
|
|
+ "github.com/aws/aws-sdk-go/aws/request"
|
|
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
|
|
|
|
|
esv1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
|
|
|
@@ -39,6 +43,7 @@ const (
|
|
|
errUnableCreateSession = "unable to create session: %w"
|
|
|
errUnknownProviderService = "unknown AWS Provider Service: %s"
|
|
|
errRegionNotFound = "region not found: %s"
|
|
|
+ errInitAWSProvider = "unable to initialize aws provider: %s"
|
|
|
)
|
|
|
|
|
|
// NewClient constructs a new secrets client based on the provided store.
|
|
|
@@ -98,17 +103,47 @@ func newClient(ctx context.Context, store esv1beta1.GenericStore, kube client.Cl
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
+ if store == nil {
|
|
|
+ return nil, fmt.Errorf(errInitAWSProvider, "nil store")
|
|
|
+ }
|
|
|
+ storeSpec := store.GetSpec()
|
|
|
+ var cfg *aws.Config
|
|
|
|
|
|
sess, err := awsauth.New(ctx, store, kube, namespace, assumeRoler, awsauth.DefaultJWTProvider)
|
|
|
if err != nil {
|
|
|
return nil, fmt.Errorf(errUnableCreateSession, err)
|
|
|
}
|
|
|
|
|
|
+ // Setup retry options, if present in storeSpec
|
|
|
+ if storeSpec.RetrySettings != nil {
|
|
|
+ var retryAmount int
|
|
|
+ var retryDuration time.Duration
|
|
|
+
|
|
|
+ if storeSpec.RetrySettings.MaxRetries != nil {
|
|
|
+ retryAmount = int(*storeSpec.RetrySettings.MaxRetries)
|
|
|
+ } else {
|
|
|
+ retryAmount = 3
|
|
|
+ }
|
|
|
+
|
|
|
+ if storeSpec.RetrySettings.RetryInterval != nil {
|
|
|
+ retryDuration, err = time.ParseDuration(*storeSpec.RetrySettings.RetryInterval)
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf(errInitAWSProvider, err)
|
|
|
+ }
|
|
|
+ awsRetryer := awsclient.DefaultRetryer{
|
|
|
+ NumMaxRetries: retryAmount,
|
|
|
+ MinRetryDelay: retryDuration,
|
|
|
+ MaxThrottleDelay: 120 * time.Second,
|
|
|
+ }
|
|
|
+ cfg = request.WithRetryer(aws.NewConfig(), awsRetryer)
|
|
|
+ }
|
|
|
+
|
|
|
switch prov.Service {
|
|
|
case esv1beta1.AWSServiceSecretsManager:
|
|
|
- return secretsmanager.New(sess)
|
|
|
+ return secretsmanager.New(sess, cfg)
|
|
|
case esv1beta1.AWSServiceParameterStore:
|
|
|
- return parameterstore.New(sess)
|
|
|
+ return parameterstore.New(sess, cfg)
|
|
|
}
|
|
|
return nil, fmt.Errorf(errUnknownProviderService, prov.Service)
|
|
|
}
|