S3 TablesのAthena連携がLake Formation不要に — IAMポリシーだけで完結するようになりました
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"
}
}'
ポイントはCreateDatabaseDefaultPermissionsとCreateTableDefaultPermissionsにIAM_ALLOWED_PRINCIPALSを指定している部分です。これにより、Lake Formationのグラント管理を経由せず、IAMポリシーだけでアクセス制御が完結します。
手順の比較
| ステップ | Before | After |
|---|---|---|
| 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";
| id | item | price |
|---|---|---|
| 1 | Widget | 500 |
| 2 | Gadget | 1200 |
| 3 | Doohickey | 300 |
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のグラントによって制御されます。しかし、CreateDatabaseDefaultPermissionsやCreateTableDefaultPermissionsにIAM_ALLOWED_PRINCIPALSを指定すると、そのカタログ配下のリソースに対する認可はLake FormationではなくIAMに委譲されます。
つまり、IAMポリシーでs3tables:GetTableDataやglue:GetTable等のアクションが許可されていれば、Lake Formationのグラントなしでアクセスできるようになります。
この仕組み自体はGlue Data Catalogの既存機能ですが、S3 Tablesのドキュメントで推奨アプローチとして明確に位置づけられたのが今回のアップデートの本質だと思います。
必要なIAMアクション
IAMベースのアクセス制御で必要な主要アクションをまとめておきます。
Glueカタログ操作
| アクション | 用途 |
|---|---|
glue:CreateCatalog | フェデレーテッドカタログの作成 |
glue:PassConnection | aws:s3tablesコネクションの委譲 |
glue:GetCatalog | カタログ情報の取得 |
S3 Tablesデータアクセス
| アクション | 用途 |
|---|---|
s3tables:GetTableData | テーブルデータの読み取り |
s3tables:PutTableData | テーブルデータの書き込み |
s3tables:GetTable | テーブルメタデータの取得 |
s3tables:GetTableMetadataLocation | Icebergメタデータの取得 |
データの読み書きに必要なのはs3tables:GetTableDataとs3tables: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に移行するのが良いアプローチだと思います。