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相关环境变量,覆盖系统环境:
- 打开
Run > Edit Configurations - 找到你的脚本配置,切换到
Environment Variables - 添加以下变量(替换为你的长期凭证值):
AWS_ACCESS_KEY_ID: 你的IAM用户Access KeyAWS_SECRET_ACCESS_KEY: 你的IAM用户Secret Key
或者添加AWS_PROFILE,值为你配置了长期凭证的profile名称
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

