如何使用AWS SDK for Go v2结合MFA实现跨AWS账号的STS角色切换
解决AWS SDK for Go v2中用MFA角色凭证更新配置的问题
你遇到的CredentialsCache字段错误是因为AWS SDK Go v2的API设计变化——aws.CredentialsCache不再通过直接初始化struct的方式创建,而是需要用aws.NewCredentialsCache()工厂函数来生成实例。而且你其实不需要手动调用Retrieve()获取凭证,SDK会在需要的时候自动触发凭证获取(包括MFA令牌输入)。
下面是修正后的完整代码,展示如何将AssumeRole的临时凭证整合到配置中,并用它创建AWS服务客户端(比如S3):
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/s3" "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() // 加载账号A的基础配置 cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(region), config.WithSharedConfigProfile(profile), ) if err != nil { log.Fatalf("加载基础配置失败: %v", err) } // 创建AssumeRole凭证提供者,配置MFA、外部ID等参数 assumeRoleProvider := stscreds.NewAssumeRoleProvider( sts.NewFromConfig(cfg), roleToAssume, func(o *stscreds.AssumeRoleOptions) { o.SerialNumber = aws.String(mfaSerial) o.ExternalID = aws.String(externalID) o.TokenProvider = stscreds.StdinTokenProvider // 自动从标准输入获取MFA令牌 }, ) // 将提供者包装成凭证缓存,自动处理凭证过期刷新 cfg.Credentials = aws.NewCredentialsCache(assumeRoleProvider) // 现在用更新后的配置创建S3客户端 s3Client := s3.NewFromConfig(cfg) // 示例:调用S3的ListBuckets API测试 buckets, err := s3Client.ListBuckets(ctx, &s3.ListBucketsInput{}) if err != nil { log.Fatalf("调用S3 ListBuckets失败: %v", err) } log.Println("账号B下的S3桶:") for _, bucket := range buckets.Buckets { log.Printf("- %s", aws.ToString(bucket.Name)) } }
关键说明:
- 修正CredentialsCache的创建方式:用
aws.NewCredentialsCache(assumeRoleProvider)替代直接初始化struct,这个函数会帮你处理凭证的缓存和自动刷新,避免每次请求都重新获取临时凭证。 - 无需手动调用Retrieve():当你用这个配置创建服务客户端后,SDK会在首次调用API时自动触发凭证获取流程,包括提示你输入MFA令牌。
- 直接复用配置创建服务客户端:更新
cfg.Credentials后,所有基于这个cfg创建的服务客户端(比如S3、EC2等)都会自动使用账号B的角色凭证。
另外,你也可以在加载配置时直接指定凭证提供者,这样代码更简洁:
cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(region), config.WithSharedConfigProfile(profile), config.WithCredentialsProvider(aws.NewCredentialsCache(assumeRoleProvider)), )
两种方式效果一致,选择你觉得更清晰的写法即可。
内容的提问来源于stack exchange,提问作者Aakash
相关产品推荐
相关产品推荐

