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

启用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))
}

总结排查流程

  1. 用aws sts get-caller-identity验证源凭证有效性
  2. 对比Boto3的MFA参数,确保Go代码中的SerialNumber和TokenCode完全一致
  3. 确认使用默认凭证链加载配置,而非手动硬编码错误的密钥
  4. 检查目标角色的信任策略是否允许源用户访问

内容的提问来源于stack exchange,提问作者Yuvaraj Selvarajan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:16:06