internal/ssm/credentials.go (36 lines of code) (raw):

package ssm import ( "context" "fmt" "os" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/feature/ec2/imds" "github.com/aws/eks-hybrid/internal/api" "github.com/aws/eks-hybrid/internal/util/file" ) const awsSharedCredentialsFileEnvVar = "AWS_SHARED_CREDENTIALS_FILE" func WaitForAWSConfig(ctx context.Context, nodeConfig *api.NodeConfig, backoff time.Duration) (aws.Config, error) { credsFile := awsCredsFile() for !file.Exists(credsFile) { select { case <-ctx.Done(): return aws.Config{}, fmt.Errorf("ssm AWS creds file %s hasn't been created on time: %w", credsFile, ctx.Err()) case <-time.After(backoff): } } return config.LoadDefaultConfig(ctx, config.WithRegion(nodeConfig.Spec.Cluster.Region), config.WithSharedCredentialsFiles([]string{credsFile}), // important to pass empty slice instead of nil to stop // the SDK from using the default paths config.WithSharedConfigFiles([]string{}), // This is helpful if the machine happens to be running on an EC2 instance // so we avoid defaulting to IMDS by mistake. config.WithEC2IMDSClientEnableState(imds.ClientDisabled), ) } func awsCredsFile() string { credsFile := awsCredentialsFilePath if cFile, ok := os.LookupEnv(awsSharedCredentialsFileEnvVar); ok { credsFile = cFile } return credsFile }