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

Boto3 AWS MFA认证在Mac原生终端与PyCharm失效,VSCode终端正常求助

问题原因与解决方法

核心错误原因

报错Cannot call GetSessionToken with session credentials的本质是:你的PyCharm/原生终端环境已经加载了AWS会话凭证(临时凭证),而GetSessionToken API只能通过IAM用户的长期凭证(永久Access Key/Secret Key)调用。

VSCode终端能成功,是因为该环境使用的是长期IAM凭证;而另外两个环境里,你可能之前通过AWS CLI或其他方式获取过临时会话凭证(比如aws sts assume-role或自动MFA验证生成的token),这些凭证被boto3自动加载,导致调用API时权限被拒。

至于“额外请求MFA”,这不是你的代码触发的,而是AWS CLI的凭证缓存/自动验证机制在起作用——当环境里的会话凭证过期或配置了强制MFA时,CLI会自动弹出MFA请求,但这和你代码里手动调用GetSessionToken的逻辑冲突了。

解决步骤

1. 清理环境中的会话凭证

  • 检查终端环境变量,移除会话相关的变量:
    unset AWS_SESSION_TOKEN
    unset AWS_ACCESS_KEY_ID
    unset AWS_SECRET_ACCESS_KEY
    
  • 打开~/.aws/credentials文件,确认当前默认profile或你使用的profile是长期IAM用户凭证(没有session_token字段),示例格式:
    [default]
    aws_access_key_id = AKIAXXXXXXXXX
    aws_secret_access_key = XXXXXXXXXXX
    

2. 在代码中指定长期凭证的Profile

修改boto3客户端初始化代码,明确指定使用长期凭证的profile,避免自动加载会话凭证:

def create_authenticated_dynamo_dict() -> dict:
    user_serial_number = input('Enter ARN serial number, e.g. arn:aws:iam::123456789012:mfa/user: ')
    user_role = 'arn:aws:iam::XXXXXXXXXXXXXXX:role/{role_name}'
    mfa = input('Enter the user device MFA code: ')
    # 指定使用长期凭证的profile
    client = boto3.client('sts', profile_name='your-long-term-iam-profile')
    mfa_sts_client = client.get_session_token(
        DurationSeconds=900,
        SerialNumber=user_serial_number,
        TokenCode=mfa
    )
    # 后续创建DynamoDB客户端的逻辑
    ...

3. 配置PyCharm的独立AWS环境

在PyCharm的Run/Debug配置中,单独设置AWS相关环境变量,覆盖系统环境:

  1. 打开Run > Edit Configurations
  2. 找到你的脚本配置,切换到Environment Variables
  3. 添加以下变量(替换为你的长期凭证值):
    • AWS_ACCESS_KEY_ID: 你的IAM用户Access Key
    • AWS_SECRET_ACCESS_KEY: 你的IAM用户Secret Key
      或者添加AWS_PROFILE,值为你配置了长期凭证的profile名称

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:10:28