4580 words
23 min

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 CredentialAWS Glueなどの外部クラウドサービスへのアクセスに使用
Storage CredentialS3などのクラウドストレージへのアクセスに使用
External LocationStorage CredentialとS3パスを組み合わせたストレージ領域
Foreign CatalogGlueなどの外部MetastoreをUnity Catalog上に公開するカタログ

また、設定時のハマりどころとして、以下のエラーが発生した。

AccessDeniedException: not authorized to perform: glue:GetDatabase on resource: .../database/default

Databricksは対象のデータベースだけでなく、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-role

ARN:

arn:aws:iam::123456789012:role/catalog-federation-test-role

Databricksの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:GetDatabasearn: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-credential

Databricks公式では、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 CredentialAWS Glueへのアクセス
Storage CredentialS3へのアクセス

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は検証対象から外した。

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条件を満たしている
  • 必要な権限を確認できている

ことを確認する材料になる。

Connectionのテスト成功画面
▲ 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 pathsStorage location の違い。

Authorized paths#

実際のテーブルデータが存在するS3領域。

s3://catalog-federation-test-20260822-123456789012-us-east-2-an/iceberg/

Authorized pathsは、Foreign Catalogからアクセスできるクラウドストレージパスを制限するためのもの。

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作成画面
▲ 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の実行結果画面
▲ Databricks SQLからAWS Glue経由でS3上のテーブルデータを正常に取得できた最終結果画面

カタログUI上からも存在することを確認できた。

DatabricksカタログUIの実行結果画面
▲ DatabricksカタログUIでの最終結果画面


今回発生したエラーと原因・対処まとめ#

今回の検証で発生したエラーと対処をまとめる。

エラー原因対応
Credentialが選択できないService Credentialへの権限不足Credentialの権限を確認
File Events Permissions Not Verifieds3:GetBucketNotification等が不足今回はFile Eventsを検証対象外として作成
Foreign CatalogがNo DataGlueメタデータ取得が正常に完了していないIAM権限を確認
glue:GetDatabase AccessDenieddefault Databaseへのアクセス権不足Glue Databaseの許可範囲を見直し(database/*
INVALID_IDENTIFIERCatalog名に-が含まれていた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
Databricks Unity CatalogからAWS Glueのテーブルを参照できるか調べてみた
https://tech.storias-blog.com/blogs/catalog_fedelation/
作者
Storia
公開日
2026-08-23