S3 TablesのAthena連携がLake Formation不要に — IAMポリシーだけで完結するようになりました

AWSAmazon S3S3 TablesIAMLake FormationGlue Data CatalogAthenaアクセス制御

S3 TablesとIcebergマテリアライズドビューに対して、IAMベースの認可がサポートされました(2026年3月17日 AWS What’s New)。これにより、ストレージ・カタログ・クエリエンジンの権限をIAMポリシー1つで定義できるようになります。

自分はつい先日S3 Tablesの検証記事を書いたばかりなのですが、その際にGlue Data Catalogとの連携設定がかなり面倒だった経験があります。Lake Formation用のIAMロール作成、リソース登録、フェデレーテッドカタログの作成…と3ステップが必要で、「テーブルを作ってAthenaでクエリするだけなのに、なぜこんなに手順が多いのか」と正直感じていました。今回のアップデートはまさにその課題を解決するものです。

何が変わったのか

Before — Lake Formationが必須だった

これまでS3 TablesにAthena等の分析サービスからアクセスするには、以下の3ステップが必須でした。

ステップ1: Lake Formation用IAMロールの作成

aws iam create-role \
  --role-name S3TablesRoleForLakeFormation \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [{
      "Effect": "Allow",
      "Principal": {"Service": "lakeformation.amazonaws.com"},
      "Action": ["sts:AssumeRole", "sts:SetContext", "sts:SetSourceIdentity"],
      "Condition": {
        "StringEquals": {"aws:SourceAccount": "123456789012"}
      }
    }]
  }'

ロールにはs3tables:*系の権限を付与する必要もあります。

ステップ2: Lake Formationへのリソース登録

aws lakeformation register-resource \
  --with-privileged-access \
  --resource-arn "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/*" \
  --with-federation \
  --role-arn "arn:aws:iam::123456789012:role/S3TablesRoleForLakeFormation"

ステップ3: Glueフェデレーテッドカタログの作成

aws glue create-catalog --cli-input-json '{
  "Name": "s3tablescatalog",
  "CatalogInput": {
    "FederatedCatalog": {
      "Identifier": "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/*",
      "ConnectionName": "aws:s3tables"
    },
    "CreateDatabaseDefaultPermissions": [],
    "CreateTableDefaultPermissions": [],
    "AllowFullTableExternalDataAccess": "True"
  }
}'

テーブルバケットを作っただけではAthenaからは見えず、この3ステップを完了してはじめてクエリできる状態になっていました。

After — IAMポリシーだけで完結

今回のアップデートで、上記のステップ1・2が不要になりました。必要なのはGlueカタログの作成のみで、その際にIAM_ALLOWED_PRINCIPALSを指定することで、認可をIAMに委譲します。

aws glue create-catalog --cli-input-json '{
  "Name": "s3tablescatalog",
  "CatalogInput": {
    "FederatedCatalog": {
      "Identifier": "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/*",
      "ConnectionName": "aws:s3tables"
    },
    "CreateDatabaseDefaultPermissions": [{
      "Principal": {
        "DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"
      },
      "Permissions": ["ALL"]
    }],
    "CreateTableDefaultPermissions": [{
      "Principal": {
        "DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"
      },
      "Permissions": ["ALL"]
    }],
    "AllowFullTableExternalDataAccess": "True"
  }
}'

ポイントはCreateDatabaseDefaultPermissionsCreateTableDefaultPermissionsIAM_ALLOWED_PRINCIPALSを指定している部分です。これにより、Lake Formationのグラント管理を経由せず、IAMポリシーだけでアクセス制御が完結します。

手順の比較

ステップBeforeAfter
Lake Formation用IAMロール作成必要不要
Lake Formationリソース登録必要不要
Glueカタログ作成必要必要(IAM_ALLOWED_PRINCIPALSを指定)
Lake Formation権限付与必要不要

3ステップから1ステップに減りました。

2つのアクセス制御モデル

現在、S3 Tablesには2つのアクセス制御アプローチが用意されています(S3 Tables ドキュメント)。

IAMアクセス制御(新)Lake Formationアクセス制御
認可方式IAMポリシーのみIAM + Lake Formationグラント
セットアップGlueカタログ作成のみIAMロール + リソース登録 + カタログ
粒度テーブル/ネームスペース/バケット単位列レベル・行レベルのセキュリティ
ユースケースシンプルなアクセス制御マルチテナント、機密データの部分公開
移行いつでもLake Formationに移行可能IAMに戻すことも可能

IAMベースの方がシンプルですが、列レベルや行レベルの細かいアクセス制御が必要な場合はLake Formationが必要です。どちらからどちらへも移行できるので、まずはIAMで始めて、必要になったらLake Formationを有効化するという段階的なアプローチが取れます。

実際に試してみた

Lake Formationを一切使わずに、S3 Tablesの作成からAthenaクエリまでの一連の流れを検証してみました。

  • AWS CLI: aws-cli/2.34.8
  • リージョン: ap-northeast-1

テーブルバケット・テーブルの作成

# テーブルバケット作成
aws s3tables create-table-bucket \
  --profile your-profile \
  --region ap-northeast-1 \
  --name simplified-perm-test

# ネームスペース作成
aws s3tables create-namespace \
  --profile your-profile \
  --region ap-northeast-1 \
  --table-bucket-arn arn:aws:s3tables:ap-northeast-1:123456789012:bucket/simplified-perm-test \
  --namespace demo

# テーブル作成(スキーマ付き)
aws s3tables create-table \
  --profile your-profile \
  --region ap-northeast-1 \
  --table-bucket-arn arn:aws:s3tables:ap-northeast-1:123456789012:bucket/simplified-perm-test \
  --namespace demo \
  --name orders \
  --format ICEBERG \
  --metadata '{
    "iceberg": {
      "schema": {
        "fields": [
          {"name": "id", "type": "int", "required": true},
          {"name": "item", "type": "string"},
          {"name": "price", "type": "int"}
        ]
      }
    }
  }'

ここまでは前回の記事と同じです。

IAMベースでGlueカタログを作成

ここが今回のポイントです。Lake Formation用のIAMロール作成もリソース登録も行わず、直接Glueカタログを作成します。

aws glue create-catalog \
  --profile your-profile \
  --region ap-northeast-1 \
  --name s3tablescatalog \
  --catalog-input '{
    "FederatedCatalog": {
      "Identifier": "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/*",
      "ConnectionName": "aws:s3tables"
    },
    "CreateDatabaseDefaultPermissions": [{
      "Principal": {
        "DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"
      },
      "Permissions": ["ALL"]
    }],
    "CreateTableDefaultPermissions": [{
      "Principal": {
        "DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"
      },
      "Permissions": ["ALL"]
    }],
    "AllowFullTableExternalDataAccess": "True"
  }'

作成後にカタログを確認すると、IAM_ALLOWED_PRINCIPALSが設定されていることがわかります。

{
    "Catalog": {
        "CatalogId": "123456789012:s3tablescatalog",
        "Name": "s3tablescatalog",
        "FederatedCatalog": {
            "Identifier": "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/*",
            "ConnectionName": "aws:s3tables",
            "ConnectionType": "aws:s3tables"
        },
        "CreateTableDefaultPermissions": [{
            "Principal": {
                "DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"
            },
            "Permissions": ["ALL"]
        }],
        "CreateDatabaseDefaultPermissions": [{
            "Principal": {
                "DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"
            },
            "Permissions": ["ALL"]
        }],
        "AllowFullTableExternalDataAccess": "True"
    }
}

Athenaでデータ投入・クエリ

Lake Formationの設定を一切していない状態で、Athenaからデータを投入してクエリしてみます。

-- データ投入
INSERT INTO "s3tablescatalog/simplified-perm-test"."demo"."orders"
VALUES (1, 'Widget', 500), (2, 'Gadget', 1200), (3, 'Doohickey', 300);

INSERTは成功しました。続けてSELECT。

-- クエリ
SELECT * FROM "s3tablescatalog/simplified-perm-test"."demo"."orders";
iditemprice
1Widget500
2Gadget1200
3Doohickey300

Lake Formationなしで、IAMだけでS3 TablesからAthenaクエリまで完全に動作しました。

前回の検証ではLake Formationの設定に手間取り、IAMロール作成→権限ポリシー付与→リソース登録→カタログ作成と4つのコマンドが必要でした。今回はGlueカタログ作成の1コマンドだけで済んでいます。

IAM_ALLOWED_PRINCIPALSとは何か

IAM_ALLOWED_PRINCIPALSはGlue Data CatalogとLake Formationの間の認可モデルを切り替えるための仕組みです。

通常、Glue Data Catalogのリソースに対するアクセスはLake Formationのグラントによって制御されます。しかし、CreateDatabaseDefaultPermissionsCreateTableDefaultPermissionsIAM_ALLOWED_PRINCIPALSを指定すると、そのカタログ配下のリソースに対する認可はLake FormationではなくIAMに委譲されます。

つまり、IAMポリシーでs3tables:GetTableDataglue:GetTable等のアクションが許可されていれば、Lake Formationのグラントなしでアクセスできるようになります。

この仕組み自体はGlue Data Catalogの既存機能ですが、S3 Tablesのドキュメントで推奨アプローチとして明確に位置づけられたのが今回のアップデートの本質だと思います。

必要なIAMアクション

IAMベースのアクセス制御で必要な主要アクションをまとめておきます。

Glueカタログ操作

アクション用途
glue:CreateCatalogフェデレーテッドカタログの作成
glue:PassConnectionaws:s3tablesコネクションの委譲
glue:GetCatalogカタログ情報の取得

S3 Tablesデータアクセス

アクション用途
s3tables:GetTableDataテーブルデータの読み取り
s3tables:PutTableDataテーブルデータの書き込み
s3tables:GetTableテーブルメタデータの取得
s3tables:GetTableMetadataLocationIcebergメタデータの取得

データの読み書きに必要なのはs3tables:GetTableDatas3tables:PutTableDataです。通常のS3のs3:GetObject/s3:PutObjectではなく、s3tables:名前空間のアクションを使う点は注意が必要です。

Lake Formationが必要なケース

IAMベースのアクセス制御はシンプルですが、以下のケースではLake Formationが依然として必要です。

  • 列レベルのアクセス制御: 特定のカラムだけを特定のユーザーに見せたい
  • 行レベルのセキュリティ: 行フィルタで特定のレコードだけに制限したい
  • Icebergマテリアライズドビュー: 現時点ではソーステーブルがLake Formationで管理されている必要があります
  • クレデンシャルベンディング: 一時認証情報の払い出しが必要な場合

逆に、「チーム全員がテーブル全体にアクセスできればいい」というシンプルな要件であれば、IAMだけで十分です。

まとめ

S3 TablesのIAMベース認可サポートは、見た目は地味ですが実務への影響が大きいアップデートだと思います。

自分が前回の検証で体験した「テーブルを作ったのにAthenaから見えない→Lake Formationの設定が必要→IAMロール作成→リソース登録→カタログ作成」という一連のハマりポイントが、今回のアップデートで「Glueカタログを1コマンドで作るだけ」に簡素化されました。

S3 Tablesを始める際の敷居が大幅に下がったと感じています。まずはIAMベースで始めて、細かいアクセス制御が必要になった段階でLake Formationに移行するのが良いアプローチだと思います。