ClickHouse Cloud は、ARN ベースの AWS IAM 信頼関係を利用して、オブジェクトストレージ (通常は S3) に保存された Iceberg データへの安全なロールベースアクセスをサポートしています。このガイドでは、S3 データへの安全なアクセスと同じ安全なセットアップのパターンに沿って、ClickHouse に Iceberg 固有の設定を追加します。
概要
- ClickHouse Cloud サービスロール ID (IAM) を取得します。
- ClickHouse が引き受けられる IAM ロールを AWS アカウントに作成します。
- Iceberg 固有のオブジェクトポリシーとカタログポリシーをロールにアタッチします。
- ロールベースの認証情報を使用して、Iceberg テーブル関数または IcebergS3 テーブルエンジンを使用します。
ClickHouseサービスのロール ID (ARN) を取得する
1. ClickHouse Cloud アカウントにログインします。
2. Iceberg データをクエリする ClickHouseサービスを選択します。
[object Object]
[object Object]
[object Object]
この ARN は、Iceberg データにアクセスする AWS IAM ロールの信頼ポリシーで必要になります。

IAM AssumeRole を設定する
1. AWS にログインし、IAM サービスに移動します。
2. `Roles` を選択し、次に `Create role` を選択します。
Trusted entity type で Custom trust policy を選択し、ステップ 3 に基づいて値を入力します。
3. 信頼ポリシーと IAM ポリシーを追加します。
{service-role-id} を、ClickHouse インスタンスの サービスロール ID (IAM) に置き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ClickHouseServiceRoleTrustPolicy",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": "{service-role-id}"
}
},
{
"Sid": "ReadOnlyIcebergS3IAMPolicy",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:GetObjectVersion",
"s3:ListBucketVersions"
],
"Resource": [
"arn:aws:s3:::{your-bucket}",
"arn:aws:s3:::{your-bucket}/*"
]
},
{
"Sid": "OptionalGlueDataCatalogIAMPolicy",
"Effect": "Allow",
"Action": [
"glue:GetDatabase",
"glue:GetDatabases",
"glue:GetTable",
"glue:GetTables",
"glue:GetPartition",
"glue:GetPartitions"
],
"Resource": "arn:aws:glue:{region}:{account-id}:*"
}
]
}4. ロールの作成を完了します。
a. Next をクリックし、権限割り当て画面でもう一度 Next をクリックします。
b. 名前 (例: iceberg-role-for-clickhouse) と説明を追加します。
c. タグを追加します (任意)。
d. ポリシーを確認します。
e. Create role を選択します。
[object Object]
ClickHouse Cloud で Iceberg へのアクセスを設定する
オプション A: ロール ARN を使用する Iceberg テーブル関数
NOSIGN オプションとロールベースの認証情報を指定して、icebergS3 テーブル関数を使用します。ClickHouse Cloud はロールを引き受けるために STS を呼び出します。
SELECT count(*)
FROM icebergS3(
'https://{your-bucket}.s3.{region}.amazonaws.com/{iceberg-path}/',
'NOSIGN',
extra_credentials(role_arn='arn:aws:iam::{account-id}:role/iceberg-role-for-clickhouse', role_session_name='iceberg-session')
);オプション B: 永続型 Iceberg テーブルエンジン
CREATE TABLE iceberg_secure (
id UInt64,
event_date Date,
data String
)
ENGINE = IcebergS3(
'https://{your-bucket}.s3.{region}.amazonaws.com/{iceberg-path}/',
'NOSIGN',
extra_credentials(role_arn='arn:aws:iam::{account-id}:role/iceberg-role-for-clickhouse')
);オプション C: Glue カタログ + IcebergS3
CREATE TABLE my_db.my_table
ENGINE = IcebergS3(
's3://{your-bucekt}/warehouse/{db}/{table}/',
'NOSIGN',
extra_credentials(role_arn='arn:aws:iam::{account-id}:role/iceberg-role-for-clickhouse')
)
SETTINGS
catalog_type = 'glue',
warehouse = '{your-warehouse}',
storage_endpoint = 's3://{your-bucket}',
region = '{region}'
aws_role_arn = 'arn:aws:iam::{account-id}:role/iceberg-role-for-clickhouse';注: Glue カタログを使用する場合は、IAM ロールに S3 と Glue の両方の読み取り/一覧表示権限があることを確認してください。
オプション D: Glue 向け DataLake Catalog
CREATE DATABASE glue_test2
ENGINE = DataLakeCatalog
SETTINGS
catalog_type = 'glue',
region = {region},
aws_role_arn = 'arn:aws:iam::{account-id}:role/iceberg-role-for-clickhouse',
aws_role_session_name = {session-name},
SETTINGS
allow_database_glue_catalog = 1;アクセスを確認する
- 簡単なクエリを実行します:
SELECT * FROM icebergS3('https://{your-bucket}.s3.{region}.amazonaws.com/{iceberg-path}/', 'NOSIGN')
LIMIT 5;AccessDeniedやInvalidAccessKeyIdなどの IAM エラーがないか確認します。
トラブルシューティング
- ClickHouse Cloud サービスの設定でロール ARN を確認します。
- レイテンシとコストを抑えるため、バケット/オブジェクトが Iceberg クエリと同じリージョンにあることを確認します。
- Iceberg テーブルのパスが有効な Iceberg メタデータの場所 (テーブルのルート配下にある
metadata/v1/...ファイル) を指していることを確認します。 - カタログ モードでは、AWS Glue コンソールで Glue メタデータとパーティションの可視性を確認します。