https://kb.databricks.com/security/forbidden-access-to-s3-data.html
以下は、Databricks Knowledge Base の「Forbidden error while accessing S3 data」記事を日本語に訳し、Markdown 形式でまとめた内容です(※2022年5月17日掲載)(Databricks コミュニティ)。
S3 データにアクセスしようとした際の forbidden エラー
DBFS マウントや Spark API を通じて S3 データにアクセスしようとしたとき、次のような例外が発生します:
com.amazonaws.services.s3.model.AmazonS3Exception: Forbidden; … Status Code: 403; Error Code: 403 Forbidden; …
以下のような設定や権限の問題が典型的です:
- IAM ロールではなく、AWS キーを使っている(特に global init スクリプトで設定している)
- Spark 設定(例:
spark.hadoop.fs.s3a.secret.key
)で AWS キーが IAM ロールと競合している - インタラクティブなクラスタ/ノートブック内で、ドライバーノードの環境変数に AWS キーを設定している
- 以前に AWS キーで作成した DBFS マウントを、IAM ロール切り替え後もそのまま使用している
- バケットオーナーに読み取り権限がない(クロスアカウントの ACL 関連)
- クラスターに IAM ロールがアタッチされていない
- IAM ロールに読み取り権限のみで、書き込み操作を行おうとしている(十分な権限がない)(Databricks コミュニティ)
以下の対応を推奨します:
-
AWS キーではなく IAM ロールの使用を推奨。キーは避ける。
-
AWS キーから IAM ロールへ移行する際には、
- 既存の DBFS マウント(AWS キーで作成されたもの)をアンマウント
- IAM ロールを使って再マウント
-
Global init スクリプトで AWS キーを設定しない。必要な場合はクラスタ単位で設定する init スクリプトを活用
-
ノートブックやクラスタ Spark 設定で AWS キーを直接設定するのを避ける(Databricks コミュニティ)
-
Delta Lake 書き込み時の 403 エラー Delta 形式では
_delta_log
ディレクトリ作成などが必要で、通常より権限も多く要求されます。IAM とバケットポリシーに以下のアクションが必要です:- IAM ポリシー:
s3:PutObject
,DeleteObject
,ListBucket
,GetObject
,PutObjectAcl
- バケットポリシー:
GetObjectVersion
,ListBucket
,GetBucketLocation
など(Databricks コミュニティ)
- IAM ポリシー:
-
クロスアカウントの Unity Catalog 外部ロケーション 外部ロケーション用 S3 バケットポリシーに、削除済みの IAM ロールの ARN(もしくはロール ID)が残っていると、再作成したロールでは拒否される場合があります。ポリシー内の ARN を現在の正しい IAM ロール ARN に更新し、必要なら外部ロケーションを再作成することで解決可能です(Databricks コミュニティ)
項目 | 内容 |
---|---|
発生状況 | S3データに対する読み書き操作で 403 Forbidden エラー |
主な原因 | AWS キーの使用や設定の競合、IAM ロール未設定/権限不足など |
推奨対応 | IAM ロールを使う、旧マウントを解除→再マウント、グローバルスクリプト非推奨など |
補足事項 | Delta Lake 書き込みでは追加の S3 アクセス許可が必要、Unity Catalog 外部ロケーションでは IAM ARN 更新が必須 |