Skip to content

Commit 8de09c7

Browse files
committed
fix: rely on AWS SDK error propagation for missing credentials
1 parent 28f7f23 commit 8de09c7

2 files changed

Lines changed: 76 additions & 23 deletions

File tree

internal/aws/aws.go

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,9 @@ import (
1515
// colorizer
1616
var style aurora.Aurora
1717

18-
func checkCredentialsEnvVar() bool {
19-
if os.Getenv("AWS_ACCESS_KEY_ID") == "" || os.Getenv("AWS_SECRET_ACCESS_KEY") == "" {
20-
return false
21-
} else if os.Getenv("AWS_REGION") == "" {
22-
23-
if os.Getenv("AWS_DEFAULT_REGION") == "" {
24-
return false
25-
}
26-
os.Setenv("AWS_REGION", os.Getenv("AWS_DEFAULT_REGION"))
27-
28-
}
29-
return true
30-
}
31-
3218
// ReadFile reads a file from S3 bucket and saves it in a desired location.
3319
func ReadFile(bucketName string, filename string, outFile string, noColors bool) {
3420
style = aurora.NewAurora(!noColors)
35-
// Checking env vars are set to configure AWS
36-
if !checkCredentialsEnvVar() {
37-
log.Println("WARN: Failed to find the AWS env vars needed to configure AWS. Please make sure they are set in the environment.")
38-
}
3921

4022
// Create Session -- use config (credentials + region) from env vars or aws profile
4123
sess, err := session.NewSession()
@@ -68,11 +50,6 @@ func ReadFile(bucketName string, filename string, outFile string, noColors bool)
6850
func ReadSSMParam(keyname string, withDecryption bool, noColors bool) string {
6951
style = aurora.NewAurora(!noColors)
7052

71-
// Checking env vars are set to configure AWS
72-
if !checkCredentialsEnvVar() {
73-
log.Println("WARN: Failed to find the AWS env vars needed to configure AWS. Please make sure they are set in the environment.")
74-
}
75-
7653
// Create Session -- use config (credentials + region) from env vars or aws profile
7754
sess, err := session.NewSession()
7855
if err != nil {

internal/aws/aws_test.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package aws
2+
3+
import (
4+
"flag"
5+
"os"
6+
"strings"
7+
"testing"
8+
9+
"github.com/aws/aws-sdk-go/aws"
10+
"github.com/aws/aws-sdk-go/aws/credentials"
11+
"github.com/aws/aws-sdk-go/aws/session"
12+
"github.com/aws/aws-sdk-go/service/s3"
13+
"github.com/aws/aws-sdk-go/service/s3/s3manager"
14+
)
15+
16+
var _ = flag.String("f", "", "") // Accept -f flag from Makefile
17+
18+
// Verify AWS SDK returns an error when no valid credentials are found.
19+
func TestS3DownloadFailsWithoutCredentials(t *testing.T) {
20+
// Clear AWS-related env vars and restore them later
21+
envVars := []string{
22+
"AWS_ACCESS_KEY_ID",
23+
"AWS_SECRET_ACCESS_KEY",
24+
"AWS_SESSION_TOKEN",
25+
"AWS_PROFILE",
26+
"AWS_SHARED_CREDENTIALS_FILE",
27+
"AWS_CONFIG_FILE",
28+
}
29+
saved := make(map[string]string)
30+
for _, v := range envVars {
31+
saved[v] = os.Getenv(v)
32+
os.Unsetenv(v)
33+
}
34+
defer func() {
35+
for k, v := range saved {
36+
if v != "" {
37+
os.Setenv(k, v)
38+
}
39+
}
40+
}()
41+
42+
sess, err := session.NewSession(&aws.Config{
43+
Region: aws.String("us-east-1"),
44+
Credentials: credentials.NewCredentials(&credentials.ChainProvider{
45+
Providers: []credentials.Provider{
46+
&credentials.EnvProvider{},
47+
&credentials.SharedCredentialsProvider{Filename: "/nonexistent", Profile: "nonexistent"},
48+
},
49+
VerboseErrors: true,
50+
}),
51+
})
52+
if err != nil {
53+
t.Fatalf("session creation failed: %v", err)
54+
}
55+
56+
downloader := s3manager.NewDownloader(sess)
57+
_, err = downloader.Download(&fakeWriterAt{}, &s3.GetObjectInput{
58+
Bucket: aws.String("test-bucket"),
59+
Key: aws.String("test-key"),
60+
})
61+
62+
if err == nil {
63+
t.Fatal("expected error when no credentials available, got nil")
64+
}
65+
66+
errMsg := err.Error()
67+
if !strings.Contains(errMsg, "NoCredentialProviders") {
68+
t.Errorf("expected NoCredentialProviders error, got: %v", err)
69+
}
70+
}
71+
72+
type fakeWriterAt struct{}
73+
74+
func (f *fakeWriterAt) WriteAt(p []byte, off int64) (n int, err error) {
75+
return len(p), nil
76+
}

0 commit comments

Comments
 (0)