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
相关产品推荐
相关产品推荐

