ClickHouse Cloud prend en charge le contrôle d’accès sécurisé basé sur les rôles pour les données Iceberg stockées dans un stockage objet (généralement S3) grâce à une relation d’approbation AWS IAM basée sur un ARN. Ce guide suit la même approche de configuration sécurisée que Accessing S3 data securely, et ajoute une configuration spécifique à Iceberg dans ClickHouse.
Vue d’ensemble
- Obtenez l’ID du rôle de service ClickHouse Cloud (IAM).
- Créez un rôle IAM dans votre compte AWS que ClickHouse peut assumer.
- Associez au rôle des politiques d’objet et de catalogue spécifiques à Iceberg.
- Utilisez les fonctions de table Iceberg ou le moteur de table IcebergS3 avec des identifiants liés à un rôle.
Obtenir l’ID du rôle de service ClickHouse (ARN)
1. Connectez-vous à votre compte ClickHouse Cloud.
2. Sélectionnez le service ClickHouse sur lequel vous souhaitez interroger les données Iceberg.
[object Object]
[object Object]
[object Object]
Cet ARN est requis dans la stratégie d’approbation du rôle AWS IAM qui accédera à vos données Iceberg.

Configurer l’action d’assumer un rôle IAM
1. Connectez-vous à AWS et accédez au service IAM.
2. Sélectionnez Roles, puis Create role.
Sélectionnez Trusted entity type comme Custom trust policy, puis saisissez les valeurs en vous basant sur l’étape 3.
3. Ajoutez les politiques d’approbation et IAM.
Remplacez {service-role-id} par le Service Role ID (IAM) de votre instance ClickHouse.
{
"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. Finalisez la création du rôle.
a. Cliquez sur Next, puis encore sur Next dans l’écran d’attribution des permissions.
b. Ajoutez un nom (par ex. iceberg-role-for-clickhouse) et une description.
c. Ajoutez des tags (facultatif).
d. Vérifiez les politiques.
e. Sélectionnez Create role.
[object Object]
Configurer l’accès à Iceberg dans ClickHouse Cloud
Option A : fonction de table Iceberg avec ARN de rôle
Utilisez la fonction de table icebergS3 avec l’option NOSIGN et des identifiants associés à un rôle. ClickHouse Cloud appellera STS pour assumer le rôle.
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')
);Option B : Moteur de table Iceberg persistant
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')
);Option C : catalogue 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';Remarque : lorsque vous utilisez le catalogue Glue, assurez-vous que votre rôle IAM dispose des autorisations de lecture et de listage pour S3 et Glue.
Option D : catalogue DataLake pour Glue
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;Vérifier l’accès
- Exécutez une requête simple :
SELECT * FROM icebergS3('https://{your-bucket}.s3.{region}.amazonaws.com/{iceberg-path}/', 'NOSIGN')
LIMIT 5;- Vérifiez la présence d’erreurs IAM telles que
AccessDeniedouInvalidAccessKeyId.
Dépannage
- Vérifiez l’ARN du rôle dans les paramètres du service ClickHouse Cloud.
- Assurez-vous que votre bucket et vos objets se trouvent dans la même région que celle utilisée pour les requêtes Iceberg, afin de réduire la latence et les coûts.
- Vérifiez que le chemin de la table Iceberg pointe vers un emplacement de métadonnées Iceberg valide (fichiers
metadata/v1/...sous la racine de la table). - En mode catalogue, vérifiez les métadonnées Glue et la visibilité des partitions dans la console AWS Glue.