訪問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密鑰。