internal/sharedcredsrotater/rotating_shared_credentials_provider.go (42 lines of code) (raw):
package sharedcredsrotater
import (
"context"
"fmt"
"os"
"time"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
)
const (
defaultRotationInterval = time.Minute
awsSharedCredentialsFileEnvVar = "AWS_SHARED_CREDENTIALS_FILE"
rotatingSharedCredentialsProviderName = "RotatingSharedCredentialsProvider"
)
// RotatingSharedCredentialsProvider is a provider that retrieves credentials via the
// shared credentials file, and adds the functionality of expiring and re-retrieving
// those credentials from the file.
type RotatingSharedCredentialsProvider struct {
// rotationInterval is the interval at which the credentials will be rotated.
rotationInterval time.Duration
// sharedCredentialsFiles is the list of shared credentials files to use.
sharedCredentialsFiles []string
}
// NewRotatingSharedCredentials returns a rotating shared credentials provider
// with default values set.
func NewRotatingSharedCredentialsProvider() *RotatingSharedCredentialsProvider {
credsFile := config.DefaultSharedCredentialsFiles
if cFile, ok := os.LookupEnv(awsSharedCredentialsFileEnvVar); ok {
credsFile = []string{cFile}
}
return &RotatingSharedCredentialsProvider{
rotationInterval: defaultRotationInterval,
sharedCredentialsFiles: credsFile,
}
}
// Retrieve retrieves the credentials from the shared credentials file and returns it.
func (p *RotatingSharedCredentialsProvider) Retrieve(ctx context.Context) (aws.Credentials, error) {
sharedConfig, err := config.LoadSharedConfigProfile(ctx, config.DefaultSharedConfigProfile, func(c *config.LoadSharedConfigOptions) {
c.ConfigFiles = []string{}
c.CredentialsFiles = p.sharedCredentialsFiles
})
if err != nil {
return aws.Credentials{}, fmt.Errorf("loading shared credentials: %s", err)
}
creds := sharedConfig.Credentials
creds.Source = fmt.Sprintf("%s: %s", rotatingSharedCredentialsProviderName, p.sharedCredentialsFiles)
creds.CanExpire = true
creds.Expires = time.Now().Add(p.rotationInterval)
return creds, nil
}