@@ -3,12 +3,13 @@ package registry
33import (
44 "encoding/base64"
55 "fmt"
6+ "strings"
7+
68 "github.com/aws/aws-sdk-go/aws"
79 "github.com/aws/aws-sdk-go/aws/credentials"
8- "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds"
910 "github.com/aws/aws-sdk-go/aws/session"
1011 "github.com/aws/aws-sdk-go/service/ecr"
11- "strings "
12+ "github.com/aws/aws-sdk-go/service/sts "
1213)
1314
1415func ExtractCredentialsForRegistry (registryCredential * RegistryCredential ) (string , string , error ) {
@@ -24,28 +25,53 @@ func ExtractCredentialsForRegistry(registryCredential *RegistryCredential) (stri
2425 }
2526 if registryCredential .RegistryType == DOCKER_REGISTRY_TYPE_ECR {
2627 accessKey , secretKey := registryCredential .AWSAccessKeyId , registryCredential .AWSSecretAccessKey
27- var creds * credentials.Credentials
28+ var sess * session.Session
29+ var err error
2830
29- if len (registryCredential .AWSAccessKeyId ) == 0 || len (registryCredential .AWSSecretAccessKey ) == 0 {
30- sess , err := session .NewSession (& aws.Config {
31+ if len (accessKey ) == 0 || len (secretKey ) == 0 {
32+ // Case 1: IAM role — use default credential chain (IRSA, instance profile, task role, env vars)
33+ sess , err = session .NewSession (& aws.Config {
3134 Region : & registryCredential .AWSRegion ,
3235 })
33- if err != nil {
34- fmt .Printf ("Error in creating AWS client" , "err" , err )
35- return "" , "" , err
36- }
37- creds = ec2rolecreds .NewCredentials (sess )
3836 } else {
39- creds = credentials .NewStaticCredentials (accessKey , secretKey , "" )
37+ // Case 2: Static credentials
38+ creds := credentials .NewStaticCredentials (accessKey , secretKey , "" )
39+ sess , err = session .NewSession (& aws.Config {
40+ Region : & registryCredential .AWSRegion ,
41+ Credentials : creds ,
42+ })
4043 }
41- sess , err := session .NewSession (& aws.Config {
42- Region : & registryCredential .AWSRegion ,
43- Credentials : creds ,
44- })
4544 if err != nil {
4645 fmt .Println ("Error in creating AWS client session" , "err" , err )
4746 return "" , "" , err
4847 }
48+
49+ // Case 3: AssumeRole (cross-account) — layered on top of Case 1 or 2
50+ if len (registryCredential .AssumeRoleArn ) > 0 {
51+ stsClient := sts .New (sess )
52+ assumeOutput , err := stsClient .AssumeRole (& sts.AssumeRoleInput {
53+ RoleArn : aws .String (registryCredential .AssumeRoleArn ),
54+ RoleSessionName : aws .String ("devtron-ecr-cross-account" ),
55+ })
56+ if err != nil {
57+ fmt .Printf ("Error in assuming role %s: %v" , registryCredential .AssumeRoleArn , err )
58+ return "" , "" , err
59+ }
60+ assumedCreds := credentials .NewStaticCredentials (
61+ * assumeOutput .Credentials .AccessKeyId ,
62+ * assumeOutput .Credentials .SecretAccessKey ,
63+ * assumeOutput .Credentials .SessionToken ,
64+ )
65+ sess , err = session .NewSession (& aws.Config {
66+ Region : & registryCredential .AWSRegion ,
67+ Credentials : assumedCreds ,
68+ })
69+ if err != nil {
70+ fmt .Println ("Error in creating AWS session with assumed role credentials" , "err" , err )
71+ return "" , "" , err
72+ }
73+ }
74+
4975 svc := ecr .New (sess )
5076 input := & ecr.GetAuthorizationTokenInput {}
5177 authData , err := svc .GetAuthorizationToken (input )
0 commit comments