

S3 TablesのMERGEにLake FormationのINSERT/DELETE権限は本当に効くのか
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
Iceberg(S3 Tables)に MERGE INTO を投げるとき、Lake Formation側で何権限が要るのか気になったので調べてみた。
そもそもMERGEは何をしているか
AthenaのMERGEは行を直接書き換えているわけじゃなくて、マッチした行を消して新しい行を書き直す、という実装になっていることが多い。Iceberg v2だとUPDATE/DELETE/MERGEは位置削除ファイル(position-delete file)を書くmerge-on-read方式で、テーブルを丸ごと書き直すcopy-on-writeではないらしい。
なのでLake Formation権限的には最低でも INSERT と DELETE が要るはず、という前提で調べ始めた。
通常のGlue Catalog上のIcebergだと事情が違う
最初に見つけたAWS公式ドキュメントにはこう書いてあった。
Lake FormationはIceberg/Hudi/Delta LakeのようなTTF(Transaction Table Format)に対して読み取り権限は管理できるが、VACUUM・MERGE・UPDATE・OPTIMIZEのような操作の権限は管理できない
つまり通常のS3上に自前で置いたIcebergテーブル(Glue Catalog経由)だと、Lake FormationはSELECT(読み取り)しか制御できず、書き込み系はIAM/S3側のポリシーで別途制御する必要がある。実際、AWSの2025年のブログでも「読み取りはLake Formation、書き込みはIAM」というハイブリッド構成がわざわざ紹介されていて、これが必要になる理由そのものがこの制約だった。
flowchart TD
A[Athena MERGE] --> B{テーブル種別}
B -->|通常のGlue Catalog上のIceberg| C[SELECT: Lake Formation管理]
B -->|通常のGlue Catalog上のIceberg| D[INSERT/DELETE: IAM/S3ポリシー管理]
B -->|S3 Tables| E[SELECT/INSERT/DELETE: Lake Formation管理]
style A fill:#4a90d959,stroke:#2c5f8a,stroke-width:2px,color:#1a3550
style B fill:#f2c94c59,stroke:#b8901f,stroke-width:2px,color:#4d3b0f
style C fill:#6fcf9759,stroke:#2f9e5c,stroke-width:2px,color:#1a4a30
style D fill:#eb575759,stroke:#b03a3a,stroke-width:2px,color:#4a1a1a
style E fill:#6fcf9759,stroke:#2f9e5c,stroke-width:2px,color:#1a4a30
S3 Tablesだと話が変わる
S3 Tables(マネージドIcebergサービス)はLake Formationとの統合が前提の設計になっていて、テーブルバケット・データベース・テーブル単位でLake Formation権限を付与できる。Athena engine v3もS3 Tables上でINSERT/UPDATE/DELETE/MERGE INTOをサポートしていて、この構成だとLake FormationのSELECT+INSERT+DELETEの権限セットでMERGEを制御できる、という理解に落ち着いた。
つまり「通常のIceberg on Glue Catalog」と「S3 Tables」で、Lake Formationの書き込み権限が効くかどうかが違う。ここを混同すると権限設計を間違える。
最小権限セット(S3 Tables前提)
- SELECT
- INSERT
- DELETE
SELECTが要る理由は単純で、MERGEの ON 条件や WHEN MATCHED の判定で既存データを読む必要があるから。INSERT/DELETEだけだと足りずAccessDeniedになりがち。
まだ実機で確認できていないこと
- S3 Tables特有のテーブルバケットレイヤー(
s3tables:*のIAMアクション)がLake Formation権限とは別に必要になるかどうか - MERGE実行時に一時テーブルが絡んでDROP権限を要求されるケースがあるらしい(
Required Drop on temp_table_...というエラー事例をGitHub issueで見かけた) - Glue ETL Job経由でMERGEした場合に権限モデルが変わるかどうか
このあたりは最小権限だけ付与した状態で実際にMERGEを叩いて、AccessDeniedException のメッセージを見るのが一番早そう。次回試したら追記する。