はじめに
この記事では、Oracle Autonomous AI Database(ADB)、から Snowflake Open Catalog / Polaris を Iceberg REST Catalog としてマウントした上で、ADB 側から DBMS_CATALOG.CREATE_ICEBERG_TABLE を実行して Iceberg テーブルを作成してみます。
構成イメージは次の通りです。
Iceberg テーブルは、Snowflake Open Catalog / Polaris 上の catalog adb_sales_catalog、namespace ADB_NS に登録し、実体となる metadata、manifest、Parquet data files は AWS S3 に保存します。
今回のポイントは、ADB から Snowflake Open Catalog / Polaris を Iceberg REST Catalog としてマウントし、ADB 上から Iceberg table を作成することです。
-
Snowflake Open Catalog は Iceberg catalog として機能し、S3 上の Iceberg metadata、manifest、Parquet data files へ安全にアクセスするための storage configuration を持ちます。
-
ADB では、Iceberg REST Catalog をマウントすると、その catalog 配下の namespace や Iceberg table を ADB 側から扱えるようになります。
今回の構成では、Snowflake Open Catalog / Polaris 上に作成した catalogadb_sales_catalogを ADB にPOLARIS_SALES_CATとしてマウントします。 -
マウントすることで、Open Catalog 上の namespace
ADB_NSを ADB から確認することができるようになります。 -
今回は、
DBMS_CATALOG.CREATE_ICEBERG_TABLEを使って、Open Catalog 上に Iceberg tableSALESを作成していきます。 -
作成した Iceberg table を、ADB から
ADB_NS.SALES@POLARIS_SALES_CATのように参照することができます。 -
ADB からは mounted catalog 名を使って、作成した table を
SELECT COUNT(*) FROM ADB_NS.SALES@POLARIS_SALES_CAT;のように参照できます。
なお、今回の手順では、GUI で設定できる部分はなるべく GUI で進めます。ADB では PL/SQL で実行できる設定もありますが、今回はData Studioの画面から操作できる部分は GUI を使います。ただし、ADB の outbound ACL 設定や DBMS_CATALOG.CREATE_ICEBERG_TABLE の実行など、SQL / PL/SQL が必要な部分は Database Actions の SQL Worksheet から実行します。
今回作るもの
この記事では、次の名前でリソースを作成していきます。
| 種別 | 名前 |
|---|---|
| S3 bucket | adb-iceberg-poc-bucket |
| S3 region | ap-northeast-1 |
| S3 base prefix | adb-sales-iceberg/ |
| Open Catalog catalog | adb_sales_catalog |
| Open Catalog namespace | ADB_NS |
| AWS IAM policy for Open Catalog | polaris-adb-sales-s3-policy |
| AWS IAM role for Open Catalog | polaris-adb-sales-s3-role |
| AWS IAM user for ADB | adb-sales-s3-user |
| Open Catalog catalog role | ADB_SALES_CATALOG_ROLE |
| Open Catalog principal role | ADB_SALES_PRINCIPAL_ROLE |
| Open Catalog service connection | ADB_SALES_CONN |
| ADB user | ICEBERG_POC |
| ADB S3 credential | S3_SALES_CRED |
| ADB Polaris OAuth credential | POLARIS_SALES_OAUTH |
| ADB mounted catalog | POLARIS_SALES_CAT |
| Iceberg table | SALES |
全体の流れ
作業順は次の通りです。
- AWS S3 に Iceberg 用の bucket / prefix を用意する
- Snowflake Open Catalog が S3 にアクセスするための AWS IAM policy / role を作る
- Snowflake Open Catalog で internal catalog を作る
- Open Catalog 作成後に AWS IAM role の trust policy を更新する
- Snowflake Open Catalog で namespace / role / service connection を作る
- ADB が S3 にアクセスするための AWS IAM user / access key を作る
- ADB に必要な role / ACL を設定する
- ADB に S3 credential と Polaris OAuth credential を作る
- ADB から Polaris catalog を mount する
-
DBMS_CATALOG.CREATE_ICEBERG_TABLEで Iceberg tableSalesを作る - ADB / Snowflake Open Catalog / S3 / CloudTrail で確認する
前提
この記事では、次のものは作成済みとします。
- Oracle Autonomous Database
- Snowflake Open Catalog / Polaris account
- AWS account
また、Snowflake Open Catalog account と S3 bucket は同じ AWS region であることを注意してください。Snowflake Open Catalog の S3 catalog では、S3 bucket が Open Catalog account と同じ region にあること、また bucket 名にドットを含めないことが前提として案内されています。
今回は ap-northeast-1リージョンに作成していきます。
1. S3 bucket / prefix を作成する
1-1. S3 bucket を作成する
AWS Console で S3 bucket を作成します。
- Bucket名:
adb-iceberg-poc-bucket
注意点です。
- bucket 名にドット
.を入れない - Snowflake Open Catalog account と同じ region に作る
- 今回は
ap-northeast-1、それ以外の設定はデフォルト
1-2. Iceberg 用 prefix を作成する
S3 bucket の中に、検証用 prefix を作ります。
adb-sales-iceberg/
さらに namespace 用に次の prefix も作っておくと分かりやすいです。
adb-sales-iceberg/ADB_NS/
最終的な Iceberg table location は次になります。
s3://adb-iceberg-poc-bucket/adb-sales-iceberg/ADB_NS/SALES/
SALES/ は先に作ってもよいですが、必須ではありません。後で DBMS_CATALOG.CREATE_ICEBERG_TABLE の location として指定します。
2. Snowflake Open Catalog 用の AWS IAM policy を作成する
ここで作る IAM policy は、Snowflake Open Catalog / Polaris が S3 にアクセスするための policy です。後で作る ADB 用の AWS IAM user とは別です。
AWS Console で IAM → Policies → Create policy を開き、JSON に次を入力します。
Policy name: polaris-adb-sales-s3-policy
Policy JSON:こちらをクリックして表示:
Iceberg table 作成時には metadata file や manifest file が書き込まれるため、read だけではなく write 系の権限も必要です。
3. Snowflake Open Catalog 用の AWS IAM role を作成する
次に、Snowflake Open Catalog が assume する IAM role を作ります。
AWS Console で IAM → Roles → Create role を開きます。
- Trusted entity type:
ここでは次を選びます。
Trusted entity type: AWS account
AWS account: This account
この時点では External ID は入れなくて大丈夫です。
S3 用 IAM role は trusted entity type に AWS account を選び、まず This account で作成し、後から Open Catalog の IAM user ARN / External ID を使って trust policy を更新する流れです。
-
Permission policy: 先ほど作成した policy
polaris-adb-sales-s3-policyを アタッチ -
Role name:
polaris-adb-sales-s3-role
作成後、Role ARN を控えます。
例:arn:aws:iam::<AWS_ACCOUNT_ID>:role/polaris-adb-sales-s3-role
この Role ARN は、次の Snowflake Open Catalog catalog 作成画面で使います。
4. Snowflake Open Catalog で internal catalog を作成する
Snowflake Open Catalog UI を開きます。Catalogs → + Catalog をクリックします。
入力値は次の通りです。
| 項目 | 値 |
|---|---|
| Name | adb_sales_catalog |
| External | OFF |
| Storage provider | S3 |
| PrivateLink | OFF |
| Default base location | s3://adb-iceberg-poc-bucket/adb-sales-iceberg/ |
| Additional locations | 空欄 |
| S3 role ARN | arn:aws:iam::<AWS_ACCOUNT_ID>:role/polaris-adb-sales-s3-role |
| External ID | 空欄 |
今回やりたいのは、ADB から Snowflake Open Catalog 上に新しい Iceberg table を作ることです。そのため、Open Catalog が管理する internal catalog として作成します。Open Catalog UI では namespace を作れますが、table 作成は Spark などの クエリエンジン、今回でいう ADB 側から行います。
5. AWS IAM role の trust policy を更新する
Open Catalog catalog を作成したら、adb_sales_catalog の Storage details を開きます。
そこに次の情報が表示されます。
- IAM user ARN
- External ID
例:
IAM user ARN:
arn:aws:iam::<OPEN_CATALOG_AWS_ACCOUNT_ID>:user/<OPEN_CATALOG_USER>
External ID:
SHxxxxx_SFCRole=1_xxxxxxxxxxxxxxxxxxxxx=
この値を使って、AWS IAM Role polaris-adb-sales-s3-role の trust policy を更新します。
AWS Console で次を開きます。
IAM
→ Roles
→ polaris-adb-sales-s3-role
→ Trust relationships
→ Edit trust policy
Trust policy を次の形にします。
Trust policy の詳細はこちらをクリックして表示
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "<Open Catalog Storage details に表示された IAM user ARN>"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "<Open Catalog Storage details に表示された External ID>"
}
}
}
]
}
例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<OPEN_CATALOG_AWS_ACCOUNT_ID>:user/<OPEN_CATALOG_USER>"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "SHxxxxx_SFCRole=1_xxxxxxxxxxxxxxxxxxxxx="
}
}
}
]
}
6. Open Catalog に namespace を作成する
Snowflake Open Catalog UI で adb_sales_catalog を開きます。
Namespaces → + Namespace をクリックします。
namespace 名: ADB_NS
作成後、次のように見えれば OK です。
adb_sales_catalog
└── ADB_NS
7. Open Catalog の role / service connection を作成する
ADB から Open Catalog に接続するために、Open Catalog 側で RBAC を設定します。
Open Catalog では、catalog role に権限を付与し、その catalog role を principal role に grant し、その principal role を service connection に紐づける、という考え方です。
7-1. Catalog role を作成する
adb_sales_catalog の Roles 画面で catalog role を作成します。
- Catalog role名:
ADB_SALES_CATALOG_ROLE - Privileges:
CATALOG_MANAGE_CONTENT
検証用なので、ここでは強めの権限を付与します。
個別の権限を設定する場合は以下のような権限を付けておきます。
NAMESPACE_LIST
NAMESPACE_FULL_METADATA
TABLE_CREATE
TABLE_FULL_METADATA
TABLE_READ_DATA
TABLE_WRITE_DATA
検証では CATALOG_MANAGE_CONTENT を使うと切り分けが楽です。
7-2. Principal role を作成する
Connections → Roles で principal role を作成します。
- principal role名:
ADB_SALES_PRINCIPAL_ROLE
7-3. Catalog role を principal role に grant する
次の関係になるように設定します。
ADB_SALES_CATALOG_ROLE
→ ADB_SALES_PRINCIPAL_ROLE
ここは名前が似ると混乱しやすいので、role の種類を分けて考えます。
| Role | 役割 |
|---|---|
ADB_SALES_CATALOG_ROLE |
catalog / namespace / table への権限セット |
ADB_SALES_PRINCIPAL_ROLE |
service connection に付与する principal role |
7-4. Service connection を作成する
Connections で Service connection を作成します。
- Service connections名:
ADB_SALES_CONN
Principal role には次を指定します。
ADB_SALES_PRINCIPAL_ROLE
作成後、次の 2 つを保存します。
Client ID
Client Secret
Client Secret は後から再表示できないため、必ず安全な場所に保存します。
この Client ID / Client Secret は、後で ADB の POLARIS_SALES_OAUTH credential 作成に使います。
8. ADB 用の AWS IAM user を作成する
ここで作る AWS IAM user は、ADB が S3 に直接アクセスするためのユーザーです。
先ほど作った polaris-adb-sales-s3-role は Snowflake Open Catalog 用です。
ADB の DBMS_CLOUD.CREATE_CREDENTIAL に IAM role ARN は使いません。
ADB 用には AWS access key ID / secret access key が必要です。
8-1. ADB 用 IAM policy を作成する
AWS IAM → Policies → Create policy で、次の policy を作ります。
Policy name:adb-sales-s3-user-policy
Policy JSON:こちらをクリックして表示:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListBucketForAdbSalesUser",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Resource": [
"arn:aws:s3:::adb-iceberg-poc-bucket"
],
"Condition": {
"StringLike": {
"s3:prefix": [
"adb-sales-iceberg",
"adb-sales-iceberg/*"
]
}
}
},
{
"Sid": "AllowObjectAccessForAdbSalesUser",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:AbortMultipartUpload",
"s3:ListMultipartUploadParts"
],
"Resource": [
"arn:aws:s3:::adb-iceberg-poc-bucket/adb-sales-iceberg",
"arn:aws:s3:::adb-iceberg-poc-bucket/adb-sales-iceberg/*"
]
}
]
}
ADB は Iceberg metadata / manifest / data files を S3 から直接読むため、S3 access key / secret key 形式の object store credential を持つ必要があります。
8-2. ADB 用 IAM user を作成する
AWS IAM → Users → Create user を開きます。
User name:adb-sales-s3-user
Console access は不要です。
Permission には、先ほどの policy adb-sales-s3-user-policy を attach します。
8-3. Access key を作成する
作成した user adb-sales-s3-user を開きます。Security credentials → Create access key をクリックします。
作成後、次を保存します。
Access key ID
Secret access key
これは後で ADB の S3_SALES_CRED 作成に使います。
9. ADB ユーザーに権限を付与する
ADB の Database Actions → SQL Worksheet を開き、ADMIN で実行します。
CREATE USER ICEBERG_POC IDENTIFIED BY "password";
GRANT CREATE SESSION TO ICEBERG_POC;
GRANT CREATE TABLE TO ICEBERG_POC;
GRANT DWROLE TO ICEBERG_POC;
GRANT ADPUSER TO ICEBERG_POC;
DWROLE は Database Actions / Data Studio 系の利用で必要になります。(「カタログが表示されない場合は、この権限がないことがあります。)DBMS_CATALOG の Iceberg catalog mount や Iceberg table 作成では ADPUSER も必要です。DBMS_CATALOG は Iceberg REST Catalog や Snowflake Polaris などの外部 catalog を ADB に mount するためのパッケージとして提供されています。
10. ADB の outbound ACL を設定する
ADB から Snowflake Open Catalog と S3 に HTTPS 接続できるようにします。
これは OCI Console の ADB inbound ACL ではなく、DB 内のスキーマが外部ホストへ HTTPS 接続するための network ACL です。
ADMIN で以下を実行します。
こちらをクリックしてSQLコマンドを表示
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '<your-open-catalog-account>.snowflakecomputing.com',
lower_port => 443,
upper_port => 443,
ace => xs$ace_type(
privilege_list => xs$name_list('http'),
principal_name => 'ICEBERG_POC',
principal_type => xs_acl.ptype_db
)
);
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'adb-iceberg-poc-bucket.s3.ap-northeast-1.amazonaws.com',
lower_port => 443,
upper_port => 443,
ace => xs$ace_type(
privilege_list => xs$name_list('http'),
principal_name => 'ICEBERG_POC',
principal_type => xs_acl.ptype_db
)
);
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'adb-iceberg-poc-bucket.s3.amazonaws.com',
lower_port => 443,
upper_port => 443,
ace => xs$ace_type(
privilege_list => xs$name_list('http'),
principal_name => 'ICEBERG_POC',
principal_type => xs_acl.ptype_db
)
);
END;
/
path-style URI の検証用に次も追加しておきます。
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 's3.ap-northeast-1.amazonaws.com',
lower_port => 443,
upper_port => 443,
ace => xs$ace_type(
privilege_list => xs$name_list('http'),
principal_name => 'ICEBERG_POC',
principal_type => xs_acl.ptype_db
)
);
END;
/
11. ADB に S3 credential を作成する
ここからは ICEBERG_POC ユーザーで実行します。
- ADB の Database Actions を、
ICEBERG_POCユーザーで開く - Data Studio > 設定を開く
- 資格証明 > 資格証明の作成をクリック
- 資格証明名:
S3_SALES_CRED - 資格証明タイプ:
Basic認証(ユーザー名とパスワード) - username:AWS_ACCESS_KEY_ID
- password:AWS_SECRET_ACCESS_KEY
ここに入れるのは、先ほど作成した AWS IAM user adb-sales-s3-user の access key です。
IAM role polaris-adb-sales-s3-role の ARN ではありません。
11-1. S3 credential を確認する
ADB から S3 prefix を list できるか確認します。
SELECT object_name, bytes
FROM DBMS_CLOUD.LIST_OBJECTS(
credential_name => 'S3_SALES_CRED',
location_uri => 'https://adb-iceberg-poc-bucket.s3.ap-northeast-1.amazonaws.com/adb-sales-iceberg/'
);
0 rows で OK です。(エラーが起きないことを確認します。)
または object が存在する場合は object 一覧が返ります。
12. ADB に Snowflake Open Catalog / Polaris を mount する
Data Studio の Catalog 画面から mount します。ICEBERG_POC ユーザーで実行します。
- ADB の Database Actions を開く
- Data Studio
- カタログ / Catalog を開く
- 追加 をクリック
5 . Icebergカタログを選択
6 . 先にIcebergカタログ資格証明を作成しておきます。「Icebergカタログ資格証明」の「資格証明の作成」をクリックします。(ADB が Snowflake Open Catalog / Polaris REST API に接続するための credential を作ります。)
- 資格証明名:
POLARIS_SALES_OAUTH - 資格証明タイプ:
OAuth2 - アクセス・トークン・エンド・ポイント:
https://<your-open-catalog-account>.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokens - クライアントID:ADB_SALES_CONN の Client ID
- クライアント・シークレット:ADB_SALES_CONN の Client Secret
- スコープ:
PRINCIPAL_ROLE:ALL
クライアントID と クライアント・シークレット には、Open Catalog の service connection ADB_SALES_CONN で発行された値を入れます。
7 . Icebergカタログ資格証明が作成出来たら、「カタログの追加」の設定項目を入力します。
-
カタログ名:
POLARIS_SALES_CAT -
Icebergカタログ・タイプ:
Polaris -
Icebergカタログ・エンドポイント:
https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog/v1/adb_sales_catalog -
Icebergカタログ資格証明:
POLARIS_SALES_OAUTH -
バケット資格証明:
S3_SALES_CRED
8 . 「次」をクリック。ネームスペースのリストにOpen Catalog UI上から作成したネームスペースADB_NSが表示されているのを確認します。ネームスペースには何も指定しないまま、「追加」をクリックします。
マウントできました。POLARIS_SALES_CATを選択して「適用」をクリック。

13. mount 結果を確認する
13-1. mounted catalog を確認する
マウントしたカタログが表示されています。
SQLでも確認しておきます。SQL Worksheetを開きます。
SELECT catalog_name, catalog_type, catalog_details
FROM ALL_MOUNTED_CATALOGS
WHERE catalog_name = 'POLARIS_SALES_CAT';
catalog_details に endpoint、credential、configuration が表示されます。
13-2. namespace が見えるか確認する
SELECT *
FROM DBMS_CATALOG.GET_SCHEMAS(catalog_name => 'POLARIS_SALES_CAT');
ここで次が返れば OK です。
ADB_NS
ADB_NS が返らない場合は、まだ CREATE_ICEBERG_TABLE に進まず、ここまでの設定を確認します。
確認ポイントは次です。
- endpoint が正しいか
-
namespacePathがadb_sales_catalogか - Open Catalog に namespace
ADB_NSがあるか -
ADB_SALES_CONNがADB_SALES_PRINCIPAL_ROLEに紐づいているか -
ADB_SALES_CATALOG_ROLEがADB_SALES_PRINCIPAL_ROLEに grant されているか - catalog role に十分な権限があるか
-
POLARIS_SALES_OAUTHの Client ID / Secret がADB_SALES_CONNのものか - token scope が
PRINCIPAL_ROLE:ALLか
14. Iceberg table SALES を作成する
DBMS_CATALOG.CREATE_ICEBERG_TABLEを使用してPL/SQLでIceberg tableの作成を行います。
前項目のDBMS_CATALOG.GET_SCHEMAS で ADB_NS が見えることを確認してから、以下を実行します。
SET SERVEROUTPUT ON;
DECLARE
l_table_definition CLOB;
l_out_metadata CLOB;
BEGIN
l_table_definition := q'~{
"name": "SALES",
"location": "s3://adb-iceberg-poc-bucket/adb-sales-iceberg/ADB_NS/SALES/",
"schema": {
"type": "struct",
"schema-id": 0,
"fields": [
{
"id": 1,
"name": "SALE_ID",
"required": false,
"type": "decimal(18,0)"
},
{
"id": 2,
"name": "CUSTOMER_NAME",
"required": false,
"type": "string"
},
{
"id": 3,
"name": "AMOUNT",
"required": false,
"type": "decimal(10,2)"
},
{
"id": 4,
"name": "SALE_DATE",
"required": false,
"type": "date"
},
{
"id": 5,
"name": "CREATED_AT",
"required": false,
"type": "timestamp"
}
]
},
"properties": {
"format-version": "2",
"write.format.default": "parquet"
}
}~';
DBMS_CATALOG.CREATE_ICEBERG_TABLE(
catalog_name => 'POLARIS_SALES_CAT',
schema_name => 'ADB_NS',
table_name => 'SALES',
table_definition => l_table_definition,
out_metadata => l_out_metadata
);
DBMS_OUTPUT.PUT_LINE(DBMS_LOB.SUBSTR(l_out_metadata, 4000, 1));
END;
/
DBMS_CATALOG.CREATE_ICEBERG_TABLE は、指定した catalog の schema 内に新しい Iceberg table を作成し、結果 metadata を out_metadata に返します。
作成後、念の為、cache を更新します。
EXEC DBMS_CATALOG.FLUSH_CATALOG_CACHE('POLARIS_SALES_CAT');
15. 作成結果を確認する
15-1. ADB から確認する
- Database Actions
- Data Studio
- Catalog
- Select Catalogs
-
POLARIS_SALES_CATを選択 -
ADB_NS.SALESが見えるか確認
SQLでも確認します。
SELECT owner, table_name
FROM all_tables@POLARIS_SALES_CAT
WHERE owner = 'ADB_NS'
AND table_name = 'SALES';
15-2. Snowflake Open Catalog UI で確認する
Snowflake Open Catalog UI で次を開きます。
Catalogs
→ adb_sales_catalog
→ ADB_NS
→ SALES
SALES table が表示されれば、Open Catalog 側にも table が登録されています。
15-3. S3 で確認する
AWS S3 Console で次の prefix を確認します。
s3://adb-iceberg-poc-bucket/adb-sales-iceberg/ADB_NS/SALES/
Iceberg metadata 用のファイルやディレクトリが作成されていれば OK です!
おわりに
この記事では、Oracle Autonomous Database から Snowflake Open Catalog / Polaris を Iceberg REST Catalog としてマウントし、ADB 側から DBMS_CATALOG.CREATE_ICEBERG_TABLE を使って Iceberg table を作成する手順を試しました。
今回の構成では、Snowflake Open Catalog / Polaris が Iceberg catalog として機能し、Iceberg table の metadata や data files は S3 に保存されます。ADB からは mounted catalog 名を使って、作成した Iceberg table を ADB_NS.SALES@POLARIS_SALES_CAT のように参照できます。
ADB の Iceberg 対応により、外部 Iceberg catalog や object storage 上のデータを ADB から扱える選択肢が広がってきています。今後、Iceberg table に対する他の操作や、Unity Catalog など他の catalog の更なる連携に期待です。


















