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

Azure Databricks读取非公开S3桶内指定目录报错403解决方案咨询

问题根因
  • S3权限校验逻辑限制:即使目标目录已开放访问权限,Spark读取S3路径时会先触发桶级的ListBucket权限校验,若对应身份未获得桶级List权限(或未限定前缀的List权限),会直接返回403错误。
  • 配置项不生效:Databricks 8.3运行时(Spark 3.1.1)默认使用s3a作为S3文件系统实现,你配置的s3n前缀的身份认证参数不会被读取,导致请求未携带认证信息。
  • 缺失区域配置:未指定S3桶所在区域时,请求可能被路由到错误的区域端点,触发S3的权限拦截返回403。
需额外配置的内容

1. 更新Hadoop S3配置项

替换原有s3n前缀的配置,新增区域、访问规则相关参数:

# 身份认证配置
sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", access_key)
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", secret_key)
# 替换为你的S3桶实际所在区域,例如us-west-2
sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3.<桶区域代码>.amazonaws.com")
# 开启路径样式访问,适配S3权限校验规则
sc._jsc.hadoopConfiguration().set("fs.s3a.path.style.access", "true")
# 关闭实现类缓存,避免旧配置残留导致认证失败
sc._jsc.hadoopConfiguration().set("fs.s3a.impl.disable.cache", "true")

若使用目录公共访问身份读取,可将上方身份认证配置替换为:

sc._jsc.hadoopConfiguration().set("fs.s3a.anonymous.access", "true")

2. 补充S3桶策略配置

在S3桶的权限配置中,给对应IAM身份新增指定前缀的ListBucket权限,示例策略如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {"AWS": "<你的IAM用户/角色ARN>"},
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::<你的桶名称>",
            "Condition": {
                "StringLike": {"s3:prefix": ["<目标目录名>/*", "<目标目录名>"]}
            }
        },
        {
            "Effect": "Allow",
            "Principal": {"AWS": "<你的IAM用户/角色ARN>"},
            "Action": ["s3:GetObject", "s3:GetObjectVersion"],
            "Resource": "arn:aws:s3:::<你的桶名称>/<目标目录名>/*"
        }
    ]
}

3. 修改读取路径的协议前缀

将原有s3n://前缀替换为s3a://:

AWS_S3_BUCKET_NAME = BUCKET_NAME
read_df = spark.read \
    .format("parquet") \
    .option("header", "true") \
    .load("s3a://{}/{}".format(AWS_S3_BUCKET_NAME, directory_name))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:21:03