You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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))
	}
}

关键说明:

  1. 修正CredentialsCache的创建方式:用aws.NewCredentialsCache(assumeRoleProvider)替代直接初始化struct,这个函数会帮你处理凭证的缓存和自动刷新,避免每次请求都重新获取临时凭证。
  2. 无需手动调用Retrieve():当你用这个配置创建服务客户端后,SDK会在首次调用API时自动触发凭证获取流程,包括提示你输入MFA令牌。
  3. 直接复用配置创建服务客户端:更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:42:43