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

PyArrow S3FileSystem如何使用自定义AWS Profile访问S3

问题结论

pyarrow.fs.S3FileSystem 原生支持加载自定义AWS Profile完成S3访问,你遇到的Access Denied错误是代码参数使用错误导致的:你传入的session_name参数仅用于指定角色角色扮演时的会话名称字符串,不支持接收boto3会话对象,传入的会话完全没有被识别,S3FileSystem最终 fallback 到默认凭证链加载了default profile的凭证,该凭证没有对应MFA权限,因此访问被拒。

正确实现方案

方案1:直接指定Profile名称(最简便,推荐)

不需要额外依赖boto3,S3FileSystem底层基于AWS C++ SDK实现,会自动读取本地~/.aws/credentials、~/.aws/config下的配置,自动识别Profile内的长期密钥、MFA生成的临时会话令牌(aws_session_token字段),只需要在实例化时传入profile参数指定自定义Profile名称即可:

from pyarrow import fs

# 直接指定自定义MFA Profile
s3 = fs.S3FileSystem(profile="custom_profile")

# 执行S3操作
s3.get_file_info(fs.FileSelector('bucket_name', recursive=True))

如果你的AWS凭证文件不在默认路径,提前在代码里设置标准AWS环境变量AWS_SHARED_CREDENTIALS_FILE指定凭证文件路径即可,S3FileSystem会自动遵循AWS SDK的环境变量规则加载配置。

方案2:复用boto3会话的动态凭证

如果你需要在代码中动态生成临时凭证、不想依赖本地AWS配置文件,可以从boto3会话中提取出明文凭证后传入S3FileSystem初始化参数,不要直接传入boto3会话对象:

import boto3
from pyarrow import fs

# 创建对应Profile的boto3会话
session = boto3.session.Session(profile_name="custom_profile")
# 提取冻结的有效凭证
cred = session.get_credentials().get_frozen_credentials()

s3 = fs.S3FileSystem(
    access_key=cred.access_key,
    secret_key=cred.secret_key,
    session_token=cred.token,
    region=session.region_name # 显式指定区域,避免跨区访问异常
)

# 执行S3操作
s3.get_file_info(fs.FileSelector('bucket_name', recursive=True))
注意事项
  • 如果你使用的PyArrow版本低于6.0.0,建议升级到新版本,旧版本对带会话令牌的临时凭证加载存在已知bug,可能出现识别失败的问题
  • MFA生成的临时会话凭证存在有效期(通常为12小时),如果再次出现Access Denied错误,先检查本地credentials文件中custom_profile对应的凭证是否过期,过期后重新通过AWS CLI完成MFA认证刷新即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:27:22