S3 TablesのMERGEにLake FormationのINSERT/DELETE権限は本当に効くのか

  • AWS
  • Lake Formation
  • Iceberg
  • S3 Tables

この記事は、構成と文章の整理に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 のメッセージを見るのが一番早そう。次回試したら追記する。