Как использовать роль AWS STS Assume с MFA с помощью AWS SDK Go v2?

Вот что я пытаюсь сделать. У меня есть две учетные записи AWS A и B. Используя AWS SDK для Go v2, я хочу использовать профиль CLI с учетными данными для Acct A и взять на себя роль в учетной записи B, для которой требуется MFA.

Я прочитал документацию по пакету для конфигурации и stscreds https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/stscreds. Это настолько запутанное множество проблем (ошибки компиляции). Я попробовал https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/[email protected]/stscreds так же, как вы видите в коде, но в строке ниже ошибки.

cfg.Credentials = &aws.CredentialsCache{Provider: creds} 

ОШИБКА: неизвестное поле «Поставщик» в структурном литерале типа aws.CredentialsCache

Вот что у меня есть до сих пор.

    package main 
    
    import (
        "context"
        "log"
    
        "github.com/aws/aws-sdk-go-v2/aws"
        "github.com/aws/aws-sdk-go-v2/config"
        "github.com/aws/aws-sdk-go-v2/credentials/stscreds"
        "github.com/aws/aws-sdk-go-v2/service/sts"
    )
    
    func main() {
        region := "us-west-2"
        profile := "acctacliprofile"
        roleToAssume := "arn:aws:iam::accountB:role/TestRole"
        externalID := "TestingOnly"
        mfaSerial := "arn:aws:iam::acctA:mfa/user"
        ctx := context.TODO()
        cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(region), 
        config.WithSharedConfigProfile(profile))
        if err != nil {
          log.Fatal(err)
        }
        creds := stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), roleToAssume, func(o 
        *stscreds.AssumeRoleOptions) {
           o.SerialNumber = aws.String(mfaSerial)
           o.ExternalID = aws.String(externalID)
           o.TokenProvider = stscreds.StdinTokenProvider
        })
        c, err := creds.Retrieve(ctx)
        if err != nil {
         log.Fatal(err)
        }
        log.Printf("%T\n", c)
        log.Printf("%v\n", c.AccessKeyID)
        log.Printf("%v\n", c.SecretAccessKey)
        log.Printf("%v\n", c.SessionToken)
}

Это в основном работает, просит предоставить токен MFA и предположить, что роль выполнена успешно, но как мне использовать эти учетные данные для создания клиентов службы и т. Д., Поскольку cfg был создан с локальным профилем cli, и я хочу использовать временные учетные данные для выполнения вызовов службы.

Поскольку приведенный ниже код из документации не работает, как мне обновить cfg с новыми учетными данными и выполнить вызовы s3 или других служб с помощью учетных данных.

cfg.Credentials = &aws.CredentialsCache{Provider: creds}

// Create service client value configured for credentials
// from assumed role.
svc := s3.NewFromConfig(cfg)

Хотелось бы, чтобы документы для нового AWS Go SDK v2 не оставляли желать лучшего.

Спасибо за любую помощь.


person Aakash    schedule 19.05.2021    source источник


Ответы (1)


Код, который наконец-то работает с использованием Go SDK v2

go version go1.15.11 darwin/amd64

go.mod

module stsassumerolemfav2

go 1.15

require (
    github.com/aws/aws-sdk-go-v2 v1.5.0
    github.com/aws/aws-sdk-go-v2/config v1.2.0
    github.com/aws/aws-sdk-go-v2/credentials v1.2.0
    github.com/aws/aws-sdk-go-v2/service/sns v1.4.0
    github.com/aws/aws-sdk-go-v2/service/sts v1.4.0
)

main.go

import (
    "context"
    "log"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/credentials/stscreds"
    "github.com/aws/aws-sdk-go-v2/service/sns"
    "github.com/aws/aws-sdk-go-v2/service/sts"
)

    func main(){
        region := "region" //add region
        profile := "cli-profile" //add cli profile account A
        roleToAssume := "arn:aws:iam::acctB:role/TestRole"
        externalID := "TestingOnly"
        mfaSerial := "arn:aws:iam::acctA:mfa/usermfadevice"
    
        ctx := context.TODO()
        cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(region), config.WithSharedConfigProfile(profile))
    
        if err != nil {
            log.Fatal(err)
        }
        // Create the credentials from AssumeRoleProvider to assume the role
        // referenced by the "myRoleARN" ARN using the MFA token code provided.
        creds := stscreds.NewAssumeRoleProvider(sts.NewFromConfig(cfg), roleToAssume, func(o *stscreds.AssumeRoleOptions) {
            o.SerialNumber = aws.String(mfaSerial)
            o.ExternalID = aws.String(externalID)
            o.TokenProvider = stscreds.StdinTokenProvider
        })
    
        cfg.Credentials = aws.NewCredentialsCache(creds)
        // Create service client value configured for credentials from assumed role.
        //Note: Not checking NextToken since test results are small dataset and do not need pagination.

        snsclient := sns.NewFromConfig(cfg)
        lti := &sns.ListTopicsInput{}
        lto, err := snsclient.ListTopics(ctx, lti)
        if err != nil {
            log.Println(err)
        }
        if lto != nil {
            for _, t := range lto.Topics {
                log.Println(*t.TopicArn)
            }
        }
    }
person Aakash    schedule 20.05.2021