启用MFA的AWS账号无法通过Go SDK v2认证求助
解决Go SDK v2启用MFA的AWS AssumeRole报InvalidClientTokenId问题
你遇到的InvalidClientTokenId错误本质是STS服务无法识别请求中的源凭证,结合Boto3可以正常工作的情况,问题大概率出在Go SDK v2的凭证加载或参数配置上,以下是具体排查和解决步骤:
1. 确认源凭证的加载逻辑
Go SDK v2的凭证链加载逻辑和Boto3略有差异,若你手动构建STS客户端,可能未正确加载有效源凭证(IAM用户的长期密钥或实例角色凭证)。必须确保使用默认凭证链加载配置:
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("us-east-1")) if err != nil { log.Fatalf("加载SDK配置失败: %v", err) } client := sts.NewFromConfig(cfg)
默认凭证链会自动从环境变量、~/.aws/credentials文件、IAM实例角色(如果在AWS资源上运行)中加载有效凭证,避免硬编码密钥导致的错误。
2. 验证MFA参数的正确性
调用AssumeRole时,必须传入完整的MFA设备ARN和正确的验证码,这两个参数不能出错:
SerialNumber:必须是MFA设备的完整ARN(如arn:aws:iam::123456789012:mfa/your-iam-username),不能只填设备名称TokenCode:MFA设备生成的6位动态验证码
对比你在Boto3中使用的参数,确保这两个值完全一致。
3. 检查源凭证的有效性和权限
首先用AWS CLI验证源凭证是否有效:
aws sts get-caller-identity
如果该命令报错,说明源凭证本身已过期、被禁用或配置错误,和SDK无关。
同时要确保源IAM用户拥有sts:AssumeRole权限,且目标角色的信任策略允许该用户扮演角色。
4. 避免使用临时凭证作为源凭证
如果你的源凭证是之前通过AssumeRole获取的临时凭证,默认情况下无法再次用来扮演其他角色(除非目标角色的信任策略明确允许),必须使用长期IAM用户凭证或实例角色凭证。
完整可运行示例代码
以下是包含MFA验证的AssumeRole完整示例,替换为你的实际参数即可使用:
package main import ( "context" "fmt" "log" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/sts" ) func main() { // 加载默认配置,自动获取源凭证 cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("us-east-1")) if err != nil { log.Fatalf("加载配置失败: %v", err) } stsClient := sts.NewFromConfig(cfg) // 构建AssumeRole请求参数 assumeRoleInput := &sts.AssumeRoleInput{ RoleArn: aws.String("arn:aws:iam::123456789012:role/你的目标角色ARN"), RoleSessionName: aws.String("mfa-session-123"), // 自定义会话名称 SerialNumber: aws.String("arn:aws:iam::123456789012:mfa/你的IAM用户名"), TokenCode: aws.String("123456"), // 当前MFA验证码 } // 发起请求 result, err := stsClient.AssumeRole(context.TODO(), assumeRoleInput) if err != nil { log.Fatalf("扮演角色失败: %v", err) } // 输出临时凭证 fmt.Printf("临时凭证获取成功:\n") fmt.Printf("Access Key ID: %s\n", aws.ToString(result.Credentials.AccessKeyId)) fmt.Printf("Secret Access Key: %s\n", aws.ToString(result.Credentials.SecretAccessKey)) fmt.Printf("Session Token: %s\n", aws.ToString(result.Credentials.SessionToken)) }
总结排查流程
- 用
aws sts get-caller-identity验证源凭证有效性 - 对比Boto3的MFA参数,确保Go代码中的
SerialNumber和TokenCode完全一致 - 确认使用默认凭证链加载配置,而非手动硬编码错误的密钥
- 检查目标角色的信任策略是否允许源用户访问
内容的提问来源于stack exchange,提问作者Yuvaraj Selvarajan
相关产品推荐
相关产品推荐

