访问S3数据时禁止出错

写的亚当Pavlacka

最后发布日期:2022年5月17日

问题

当试图通过DBFS挂载或直接在Spark api中访问S3数据时,命令失败,并出现类似如下的异常:

com.amazonaws.services.s3.model。AmazonS3Exception:禁止;请求ID: XXXXXXXXXXXXX,扩展请求ID: XXXXXXXXXXXXXXXXXXX,云提供商:AWS,实例ID: XXXXXXXXXX(服务:Amazon S3;状态代码:403;错误码:403禁止;请求ID: XXXXXXXXXXX;S3扩展请求ID:

导致

以下是常见的原因:

  • 除了IAM角色外,还使用AWS密钥。使用全局初始化脚本设置AWS密钥可能会导致这种行为。
  • IAM角色具有访问S3数据所需的权限,但AWS密钥在Spark配置中设置。例如,设置spark.hadoop.fs.s3a.secret.key可以与IAM角色冲突。
  • 从交互式集群通过笔记本在驱动程序节点上设置环境级别的AWS密钥。
  • DBFS挂载点之前是用AWS密钥创建的,现在试图使用IAM角色访问。
  • 文件被写入Databricks外部,且桶所有者没有读权限(参见步骤7:更新跨帐户S3对象acl).
  • 集群中没有关联IAM角色。
  • 日志含义已连接具有读权限的IAM角色,但您正在执行写操作。也就是说,IAM角色对您要执行的操作没有足够的权限。

解决方案

以下是避免此问题的建议和最佳实践:

  • 使用IAM角色代替AWS密钥。
  • 如果您试图将配置从AWS密钥切换到IAM角色,请卸载使用AWS密钥创建的S3桶的DBFS挂载点,并使用IAM角色重新挂载。
  • 避免使用全局初始化脚本设置AWS密钥。如果需要,总是使用集群范围的初始化脚本。
  • 避免在笔记本或集群Spark配置中设置AWS密钥。