Databricks Unity CatalogからAWS Glueのテーブルを参照できるか調べてみた
はじめに
DatabricksのUnity Catalogを使っているときに、AWS Glueに登録されているテーブルを直接参照できる「カタログフェデレーション」という機能があることを知った。
最初は、
「GlueのConnectionを作れば、そのままDatabricksから参照できる」
くらいの認識だった。
ところが、実際に調べてみると、いくつか気になることが出てきた。
- 単にGlueへの接続を作るだけで参照できるのか
- IAM Roleの設定はどうすればよいのか
- Service Credential と Storage Credential は何が違うのか
- エラーが発生したときにどう切り分ければよいのか
そこで今回は、実際に検証用のAWS Glue CatalogとS3を用意し、DatabricksからAWS Glueのメタデータを参照して、最終的にS3上のテーブルデータをSQLで取得できるところまで試してみた。
この記事の対象読者
この記事は、以下のような人を対象にしている。
- Databricks Unity Catalog を使っている人
- AWS Glue にある既存テーブルを Databricks から参照したい人
- Service Credential と Storage Credential の違いを知りたい人
- カタログフェデレーション設定時に発生するエラーと対処法を知りたい人
まず結論
今回調べてみて、最初に考えていた、
「GlueのConnectionを作れば簡単に参照できる」
という理解は、少し違っていた。
実際には、単にConnectionを作るだけではなく、
- AWS IAM Role
- Service Credential
- Storage Credential
- External Location
- Foreign Catalog
といった複数のオブジェクトが関係しており、それぞれに適切な権限やパラメータを設定する必要があった。
特に重要だった役割の違いをまとめると、次のようになる。
| オブジェクト | 主な役割 |
|---|---|
| Service Credential | AWS Glueなどの外部クラウドサービスへのアクセスに使用 |
| Storage Credential | S3などのクラウドストレージへのアクセスに使用 |
| External Location | Storage CredentialとS3パスを組み合わせたストレージ領域 |
| Foreign Catalog | Glueなどの外部MetastoreをUnity Catalog上に公開するカタログ |
また、設定時のハマりどころとして、以下のエラーが発生した。
AccessDeniedException: not authorized to perform: glue:GetDatabase on resource: .../database/defaultDatabricksは対象のデータベースだけでなく、default データベースの存在確認も行うため、IAM Policyで database/* を許可する必要があった。
そもそも何を検証したかったのか?
今回確認したかったのは、
AWS Glueに登録されているテーブルを、Databricks Unity Catalogから参照できるのか?
という点。
AWS Glue側には、次のようなデータを用意した。
AWS Glue Data Catalog
└─ catalog_federation_test
└─ sample_tableそして、テーブルの実データはS3に配置した。
s3://catalog-federation-test-20260822-123456789012-us-east-2-an/iceberg/sample_table最終的には、このGlueのテーブルをDatabricksから参照する。
今回構築した全体の検証構成は以下の通り。
Databricks
│
│ Unity Catalog
│
├─ Service Credential
│ │
│ ▼
│ AWS IAM Role
│ │
│ ├─ AWS Glue
│ │ └─ catalog_federation_test
│ │ └─ sample_table
│ │
│ └─ Amazon S3
│ └─ iceberg/sample_table
│
├─ Connection
│
├─ External Location
│
└─ Foreign Catalog
│
▼
sample_table最終的にはDatabricks SQLから以下のデータを取得できた。
id name
1 Alice
2 Bob
3 Carol前提となるAWSリソースの確認と準備
まずはAWS側で、今回使用するリソースが存在しているか確認する。
1. AWSアカウントを確認する
最初にAWS CloudShellから現在使用しているAWSアカウントを確認した。
aws sts get-caller-identity結果は以下。
{
"UserId": "123456789012",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:root"
}ここで、今回使用するAWSアカウントIDが 123456789012 であることを確認した。
2. AWS GlueにDatabaseとTableが存在することを確認する
AWS CloudShellからGlueのDatabaseを確認した。
aws glue get-databases \
--region us-east-2 \
--query 'DatabaseList[].Name' \
--output table結果:
-----------------------------
| GetDatabases |
+---------------------------+
| catalog_federation_test |
+---------------------------+続いてTableを確認する。
aws glue get-tables \
--region us-east-2 \
--database-name catalog_federation_test \
--query 'TableList[].Name' \
--output table結果:
------------------
| GetTables |
+----------------+
| sample_table |
+----------------+さらにCatalog IDも確認した。
aws glue get-databases \
--region us-east-2 \
--query 'DatabaseList[].CatalogId' \
--output table結果:
------------------
| GetDatabases |
+----------------+
| 123456789012 |
+----------------+Tableについても確認。
aws glue get-tables \
--region us-east-2 \
--database-name catalog_federation_test \
--query 'TableList[].{Name:Name,CatalogId:CatalogId}' \
--output table結果:
----------------------------------
| GetTables |
+---------------+----------------+
| CatalogId | Name |
+---------------+----------------+
| 123456789012 | sample_table |
+---------------+----------------+これにより、今回参照するGlue Catalogは、
Account / Catalog ID
123456789012
Database
catalog_federation_test
Table
sample_tableであることを確認した。
3. S3に検証用領域を作る
今回は本番データと混ざらないように、検証用S3バケットを用意した。
バケット:
catalog-federation-test-20260822-123456789012-us-east-2-anバケット内には、主に以下の領域を用意した。
athena-results/
catalog-metadata/
iceberg/テーブルデータは、
iceberg/sample_table/に配置している。
最終的に使用するS3パスは、
s3://catalog-federation-test-20260822-123456789012-us-east-2-an/iceberg/sample_tableまた、Foreign Catalogのメタデータ保存用として、
s3://catalog-federation-test-20260822-123456789012-us-east-2-an/catalog-metadata/を用意した。
DatabricksのForeign Catalogでは、Icebergテーブルを読む場合、Storage locationとしてメタデータ保存先を指定する必要がある。
AWS IAM RoleとPolicyの設定
DatabricksからAWS GlueおよびS3へアクセスするためのIAM Roleを作成する。
1. AWS IAM Roleを作成する
Role名:
catalog-federation-test-roleARN:
arn:aws:iam::123456789012:role/catalog-federation-test-roleDatabricksのAWS Glue Federationでは、DatabricksからAWS GlueへアクセスできるIAM Roleを作成し、そのRoleをUnity CatalogのService Credentialから利用する。
2. IAM RoleのTrust Policyを設定する
DatabricksからRoleをAssumeできるようにTrust Policyを設定した。
検証時には、Databricksから提示されたTrust Policyを使用。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL",
"arn:aws:iam::123456789012:role/catalog-federation-test-role"
]
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "your-external-id-uuid"
}
}
}
]
}ここで注意したのは、AWSアカウントIDが2種類登場すること。
123456789012は今回利用したAWSアカウント。
一方、
414351767826はTrust Policyで指定されたDatabricks側のPrincipal。
そのため、GlueのResource ARNには今回のAWSアカウントである
123456789012を使用する。
3. IAM Policyを設定する
最初はGlueの対象Databaseだけを許可していた。
しかし、DatabricksからForeign Catalogを利用すると、default Databaseの存在確認も行われた。
そのため、glue:GetDatabase が arn:aws:glue:us-east-2:123456789012:database/default に対して拒否された。
実際のエラーは、
not authorized to perform: glue:GetDatabase
on resource:
arn:aws:glue:us-east-2:123456789012:database/defaultだった。
AWS GlueのData Catalogは、
Catalog
└─ Database
└─ Tableという階層になっており、AWS公式ドキュメントでもこれらのリソースに対応したARNをIAM Policyで指定できる。
そこで、今回の検証ではGlueメタデータについてはCatalog全体を読み取り対象とし、S3については検証用バケットだけに限定した。
最終的に使用したIAM Policyは以下。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GlueReadOnly",
"Effect": "Allow",
"Action": [
"glue:GetDatabase",
"glue:GetDatabases",
"glue:GetPartition",
"glue:GetPartitions",
"glue:GetTable",
"glue:GetTables",
"glue:GetUserDefinedFunction",
"glue:GetUserDefinedFunctions",
"glue:BatchGetPartition"
],
"Resource": [
"arn:aws:glue:us-east-2:123456789012:catalog",
"arn:aws:glue:us-east-2:123456789012:database/*",
"arn:aws:glue:us-east-2:123456789012:table/*/*"
]
},
{
"Sid": "S3ListBucket",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::catalog-federation-test-20260822-123456789012-us-east-2-an"
},
{
"Sid": "S3ReadObjects",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::catalog-federation-test-20260822-123456789012-us-east-2-an/*"
},
{
"Sid": "S3MetadataWrite",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::catalog-federation-test-20260822-123456789012-us-east-2-an/catalog-metadata/*"
},
{
"Sid": "S3MetadataMultipart",
"Effect": "Allow",
"Action": [
"s3:ListBucketMultipartUploads",
"s3:ListMultipartUploadParts",
"s3:AbortMultipartUpload"
],
"Resource": "arn:aws:s3:::catalog-federation-test-20260822-123456789012-us-east-2-an"
}
]
}Glueについては database/* および table/*/* としているため、今回の検証では default Databaseを含むGlue Catalogのメタデータを読み取れる。
一方、S3については検証用バケットだけに限定している。
なお、このIAM Policyをそのまま本番環境へ適用することを推奨しているわけではない。本番では、必要なGlue DatabaseやTableに対象を絞るなど、最小権限を検討する必要がある。
Databricks Unity Catalog側の構築
次に、Databricks側で設定を行っていく。
1. Service Credentialを作成する
まず、Databricks側でService Credentialを作成した。
Service Credentialには、先ほど作成したAWS IAM Roleを関連付ける。
名前:
catalog-federation-test-service-credentialDatabricks公式では、Service Credentialは外部クラウドサービスへのアクセスに使用するUnity Catalogのオブジェクトで、AWSサービスへアクセスする場合はIAM Roleを登録する。
ここで重要なのは、
AWS S3のデータアクセス用のStorage Credentialと、AWS Glueのような外部サービスへのアクセスに使うService Credentialは別物
ということ。
2. Storage Credentialを作成する
S3のアクセスにはService CredentialではなくStorage Credentialを使用する。
今回作成したStorage Credential:
catalog-federation-test-credential用途を整理すると、次のようになる。
| Credential | 用途 |
|---|---|
| Service Credential | AWS Glueへのアクセス |
| Storage Credential | S3へのアクセス |
Databricksでは、Storage Credentialがクラウドストレージへの認証情報を表し、External LocationがそのStorage CredentialとS3パスを組み合わせたオブジェクトになる。
今回の検証では、Storage Credentialの設定が読み取り専用になっていたため、Foreign CatalogのStorage locationとして使用するS3領域について、後から書き込み権限も必要になった。
3. External Locationを作成する
次にS3のパスをUnity Catalogで管理するため、External Locationを作成した。
External Locationは、
S3パス
+
Storage Credentialを組み合わせたUnity Catalogオブジェクト。
今回の検証では、以下の領域を対象にした。
s3://catalog-federation-test-20260822-123456789012-us-east-2-an/iceberg/また、Foreign Catalogのメタデータ保存用として、
s3://catalog-federation-test-20260822-123456789012-us-east-2-an/catalog-metadata/もExternal Locationとして用意した。
4. File Eventsでエラーが発生した
External Locationの作成時、File Eventsのチェックでエラーが発生した。
表示された内容は、
File Events Permissions Not Verifiedで、s3:GetBucketNotification の権限が不足しているという内容だった。
今回の検証ではFile Events自体が必須ではなかったため、まずExternal Locationの作成を優先した。
Databricksの画面でも、
File events are optional but recommended
という説明が表示された。
File Eventsを利用すると、ファイル変更の検知によってストレージの一覧取得を減らせるため、取り込み性能やS3のListコストに影響する可能性がある。ただし、今回の目的はGlue Federationの基本動作確認だったため、File Eventsは検証対象から外した。

▲ External Location作成時に表示される File Events の検証警告画面
5. AWS Glue Connectionを作成する
次にDatabricksでConnectionを作成した。
- Connection Type:
AWS Glue - AWS Region:
us-east-2 - AWS Account ID:
123456789012 - Credential:
catalog-federation-test-service-credential
Databricks公式のGlue Federation手順でも、Connection作成時にAWS Region、AWS Account ID、Service Credentialを指定する流れになっている。
6. Connectionのテスト
Connection作成前後で接続テストを実施した。
最終的には、
Success - Assume Role
Success - Self Assume Role
Success - External ID Condition
All Permissions Confirmedとなった。
これは、
- DatabricksからIAM RoleをAssumeできる
- IAM RoleのSelf Assumeができる
- External ID条件を満たしている
- 必要な権限を確認できている
ことを確認する材料になる。

▲ Databricks Connectionのテスト結果画面
7. Foreign Catalogを作成する
Connectionが作成できたので、Foreign Catalogを作成する。
- Catalog name:
catalog-federation-test-connection_catalog - Connection:
catalog-federation-test-connection
Authorized pathsには、External Locationで許可したS3パスを指定する。
ここで少し分かりづらかったのが、Authorized paths と Storage location の違い。
Authorized paths
実際のテーブルデータが存在するS3領域。
s3://catalog-federation-test-20260822-123456789012-us-east-2-an/iceberg/Authorized pathsは、Foreign Catalogからアクセスできるクラウドストレージパスを制限するためのもの。

▲ Foreign Catalog作成時の Authorized paths の指定画面
Storage location
Foreign Catalogで使用するメタデータ保存先。
s3://catalog-federation-test-20260822-123456789012-us-east-2-an/catalog-metadata/Icebergテーブルを読む場合、Storage locationの指定が必要になる。

▲ Foreign Catalog作成時の Storage location の指定画面
8. Foreign Catalogが作成された
作成後、catalog-federation-test-connection_catalog というCatalogが作成された。
最初はCatalog自体は作成できたものの、配下には No Data と表示された。
この時点では、
Catalogが作成できた = テーブルを正常に参照できる
とは限らない。Foreign Catalogでは、ユーザーやワークフローがアクセスすると外部Metastoreからメタデータが同期される。
実際に動かして遭遇したエラーと切り分け
Catalogを作成した後、SQLでテーブルを参照しようとした。
1. AWS Glueの権限不足でエラーになった
SQLでテーブルを参照しようとすると、以下のエラーが発生した。
EXTERNAL_METASTORE_CLIENT_ERROR.OPERATION_FAILED
Unable to verify existence of default database
AccessDeniedException:
not authorized to perform:
glue:GetDatabase
on resource:
arn:aws:glue:us-east-2:123456789012:database/default最初に作成したIAM Policyでは、database/catalog_federation_test だけを許可していた。
しかしDatabricks側では、database/default の存在確認も行われていた。
そのため、catalog_federation_test に対する権限があっても、default に対する glue:GetDatabase が拒否されていた。
エラーログの確認
↓
arn:aws:glue:us-east-2:123456789012:database/default が AccessDenied
↓
IAM Policyに default データベースの許可がない
↓
database/* を許可するように修正このエラーから、
IAM RoleのAssume自体は成功しているが、Glueメタデータ取得時のリソース権限が不足している
と切り分けた。
2. IAM Policyを修正する
そこでGlueのメタデータ読み取り範囲を、database/* および table/*/* まで広げた。
この結果、DatabricksからGlueのメタデータを取得できるようになり、No Data だった表示が解消された。
今回の修正は単に権限を全開放したわけではなく、エラーメッセージに表示された具体的なResource(database/default)をもとに原因を特定して修正した。
3. SQLでテーブルを参照する
最後にDatabricks SQLからテーブルを参照した。
Catalog名には - が含まれているため、バッククォートで囲む。
SELECT *
FROM `catalog-federation-test-connection_catalog`.catalog_federation_test.sample_table;実行結果:
id name
1 Alice
2 Bob
3 Carolこれで、
Databricks
↓
Unity Catalog
↓
Foreign Catalog
↓
AWS Glue
↓
catalog_federation_test
↓
sample_table
↓
S3という経路でデータを取得できることを確認できた。

▲ Databricks SQLからAWS Glue経由でS3上のテーブルデータを正常に取得できた最終結果画面
カタログUI上からも存在することを確認できた。

▲ DatabricksカタログUIでの最終結果画面
今回発生したエラーと原因・対処まとめ
今回の検証で発生したエラーと対処をまとめる。
| エラー | 原因 | 対応 |
|---|---|---|
| Credentialが選択できない | Service Credentialへの権限不足 | Credentialの権限を確認 |
| File Events Permissions Not Verified | s3:GetBucketNotification等が不足 | 今回はFile Eventsを検証対象外として作成 |
| Foreign CatalogがNo Data | Glueメタデータ取得が正常に完了していない | IAM権限を確認 |
glue:GetDatabase AccessDenied | default Databaseへのアクセス権不足 | Glue Databaseの許可範囲を見直し(database/*) |
| INVALID_IDENTIFIER | Catalog名に-が含まれていた | Catalog名をバッククォートで囲む |
特に注意したいのは、
Connectionのテストが成功しても、最終的なSQL実行まで成功するとは限らない
という点。ConnectionのテストではAssume RoleやExternal IDなどを確認できるが、実際のForeign Catalog利用時にはGlueのメタデータ取得やS3アクセスなど、さらに別の権限が必要になる。
実際に調べて分かったこと
調べる前
最初は、
Databricks → AWS Glueと接続設定(Connection)を作るだけで簡単に参照できる
くらいの認識だった。
調べた後
実際に試してみると、単に接続を作るだけではなく、
- AWS IAM Role
- Service Credential
- Storage Credential
- Connection
- External Location
- Foreign Catalog
といった複数のオブジェクトが密接に関係していると分かった。
特に重要だったのが、Service CredentialとStorage Credentialを分けて考えること。
AWS Glue
↑
Service Credential
S3
↑
Storage Credential
↑
External Locationという関係で考えると理解しやすい。
Databricks公式でも、Service CredentialはAWS Glueなどの外部クラウドサービス向け、Storage Credentialはクラウドストレージ向けとして説明されている。
注意点
今回の検証は、以下の環境で実施している。
- Databricks Unity Catalog
- AWS Glue / Amazon S3
- AWS Region:
us-east-2
また、検証のためにIAM Policyで database/* を許可しているが、そのまま本番環境へ適用することを推奨するものではない。
本番環境では、利用するDatabaseやTableに権限を限定できないかを確認し、最小権限を検討する必要がある。
今回調べて分からなかったこと
今回の記事では基本機能の疎通確認に絞って検証している。
そのため、次のような内容は今回の調査範囲外。
- File Events を有効にした場合の自動同期・パフォーマンスへの影響
- 大規模テーブルでのフェデレーションクエリのレイテンシ
- 複数AWSアカウントにまたがるアクセス権限構成
- 他のデータフォーマット(Delta Lake, Parquet等)での挙動の違い
AWSの知識が圧倒的に不足しているので、権限回りは機会があれば勉強し直したいなぁ
先に資格を取るのが先かな
パフォーマンスとかは気になるけどたぶんフリートライアルだと限界ありそうなので
誰かがまとめてくれることを願う。。。
他のデータフォーマット(Delta Lake, Parquet等)での挙動の違いは、、、
正直Glueだけでもすっっっごい時間かかったので、気力あればまとめますん、、、
まとめ
今回は、Databricks Unity CatalogからAWS Glueのテーブルを参照できるカタログフェデレーションについて調べた。
最終的な全体構成は以下のようになった。
┌──────────────────────────────┐
│ Databricks │
│ │
│ Unity Catalog │
│ │ │
│ ├─ Service Credential │
│ │ │
│ ├─ Storage Credential │
│ │ │
│ ├─ Connection │
│ │ │
│ ├─ External Location │
│ │ │
│ └─ Foreign Catalog │
│ │ │
└──────────────┼───────────────┘
│
│ IAM Role / AssumeRole
▼
┌──────────────────────────────┐
│ AWS │
│ │
│ IAM Role │
│ catalog-federation-test-role│
│ │ │
│ ├──────────────┐ │
│ ▼ ▼ │
│ AWS Glue S3 │
│ │ │ │
│ ▼ ▼ │
│ catalog_federation_test │
│ │ │
│ └─ sample_table ──────┘
└──────────────────────────────┘最初は「GlueのConnectionを作れば参照できるのでは?」と思っていたが、実際にはS3のExternal LocationやIAM権限、Foreign Catalogの設定など、複数の設定が必要だった。
また、途中で発生した glue:GetDatabase のAccessDeniedから、Databricksが対象の catalog_federation_test だけではなく default Databaseの存在確認も行っていることが分かった。
最終的には、
SELECT *
FROM `catalog-federation-test-connection_catalog`.catalog_federation_test.sample_table;で、期待通りのデータを取得できた。
実際の手順を踏んで構築してみることで、IAM、Credential、Connection、External Location、Foreign Catalogというそれぞれの役割と裏側の挙動を確認できた。
参考資料
- Databricks: AWS Glue Hive Metastore Federation
- Databricks: Service Credentials
- Databricks: Unity Catalogによるクラウドストレージへの接続
- AWS: AWS Glue Resource ARN
- AWS: AWS Glue GetDatabase API