如何解决Apache Spark/Databricks写入S3时的AmazonS3Exception: Forbidden错误
解决Spark/Databricks写入S3时的AmazonS3Exception: Forbidden问题
问题根源分析
- 报错中的HEAD请求针对已写入的part文件,该操作依赖
s3:GetObject权限,但原IAM政策中s3:GetObject绑定的是桶级ARN(arn:aws:s3:::my-bucket),而s3:GetObject属于对象级操作,必须绑定arn:aws:s3:::my-bucket/*这类对象级ARN才会生效。 - Spark生成
_success文件的流程需要验证part文件的存在性(即执行HEAD请求),同时可能涉及对象的重命名/删除,这些操作都需要正确的对象级权限配置。
修正后的IAM权限政策
将原政策拆分,确保桶级操作和对象级操作的Resource与对应的Action匹配:
{ "Statement": [ { "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::some-bucket", "arn:aws:s3:::my-bucket" ], "Sid": "" }, { "Action": [ "s3:GetObject", "s3:PutObject", "s3:PutObjectAcl", "s3:DeleteObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::some-bucket/*", "arn:aws:s3:::my-bucket/*" ], "Sid": "" } ], "Version": "2012-10-17" }
关键调整说明
- 单独拆分
s3:ListBucket权限到桶级ARN的Statement:该权限用于Spark遍历桶内文件、确认写入完整性。 - 将
s3:GetObject移到对象级ARN的Statement:确保HEAD/读取对象的权限覆盖所有桶内文件,满足Spark验证part文件的需求。 - 保留写入相关权限:
s3:PutObject/s3:PutObjectAcl/s3:DeleteObject支持part文件、临时文件的写入及_success文件的生成操作。
额外排查步骤
- 确认Databricks集群使用的角色已正确关联该IAM政策,且无冲突的Deny权限规则。
- 检查目标S3桶的Bucket Policy,确保没有额外的Deny语句限制写入操作。
- 启用Spark S3调试日志(添加配置
log4j.logger.org.apache.hadoop.fs.s3a=DEBUG),查看具体的权限失败步骤,进一步定位问题。
内容的提问来源于stack exchange,提问作者Georg Heiler
相关产品推荐
相关产品推荐

