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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:26:22