Passer au contenu principal
Ce moteur assure l’intégration avec l’écosystème Amazon S3. Il est similaire au moteur HDFS, mais offre des fonctionnalités spécifiques à S3.

Exemple

CREATE TABLE s3_engine_table (name String, value UInt32)
    ENGINE=S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/test-data.csv.gz', 'CSV', 'gzip')
    SETTINGS input_format_with_names_use_header = 0;

INSERT INTO s3_engine_table VALUES ('one', 1), ('two', 2), ('three', 3);

SELECT * FROM s3_engine_table LIMIT 2;
┌─name─┬─value─┐
│ one  │     1 │
│ two  │     2 │
└──────┴───────┘

Créer une table

CREATE TABLE s3_engine_table (name String, value UInt32)
    ENGINE = S3(path [, NOSIGN | aws_access_key_id, aws_secret_access_key,] format, [compression], [partition_strategy], [partition_columns_in_data_file], [extra_credentials])
    [PARTITION BY expr]
    [SETTINGS ...]

Paramètres du moteur

  • path — URL du bucket avec le chemin du fichier. Prend en charge les caractères génériques suivants en mode readonly : *, **, ?, {abc,def} et {N..M}, où N et M sont des nombres, et 'abc', 'def' des chaînes. Pour plus d’informations, voir ci-dessous.
  • NOSIGN - Si ce mot-clé est fourni à la place des informations d’identification, aucune requête ne sera signée.
  • format — Le format du fichier.
  • aws_access_key_id, aws_secret_access_key - Informations d’identification à long terme pour l’utilisateur du compte AWS. Vous pouvez les utiliser pour authentifier vos requêtes. Ce paramètre est facultatif. Si les informations d’identification ne sont pas spécifiées, elles sont récupérées depuis le fichier de configuration. Pour plus d’informations, voir Using S3 for Data Storage.
  • compression — Type de compression. Valeurs prises en charge : none, gzip/gz, brotli/br, xz/LZMA, zstd/zst. Ce paramètre est facultatif. Par défaut, la compression est détectée automatiquement à partir de l’extension du fichier.
  • partition_strategy – Options : WILDCARD ou HIVE. WILDCARD nécessite un {_partition_id} dans le chemin, qui est remplacé par la clé de partition. HIVE n’autorise pas les caractères génériques, suppose que le chemin correspond à la racine de la table et génère des répertoires partitionnés au format Hive avec des Snowflake IDs comme noms de fichiers et le format de fichier comme extension. La valeur par défaut est définie par le paramètre file_like_engine_default_partition_strategy (WILDCARD pour les paramètres compatibility antérieurs à 26.6, HIVE sinon).
  • partition_columns_in_data_file - Utilisé uniquement avec la stratégie de partitionnement HIVE. Indique à ClickHouse s’il doit s’attendre à ce que les colonnes de partition soient écrites dans le fichier de données. La valeur par défaut est false.
  • storage_class_name - Options : STANDARD ou INTELLIGENT_TIERING, permet de spécifier AWS S3 Intelligent Tiering.
  • extra_credentials - Facultatif. Utilisé pour transmettre un role_arn pour l’accès basé sur les rôles dans ClickHouse Cloud. Voir Secure S3 pour les étapes de configuration.

Cache de données

Le moteur de table S3 prend en charge la mise en cache des données sur le disque local. Consultez les options de configuration et l’utilisation du cache du système de fichiers dans cette section. La mise en cache s’effectue en fonction du chemin et de l’ETag de l’objet de stockage, afin que ClickHouse ne lise pas une version périmée du cache. Pour activer la mise en cache, utilisez les paramètres filesystem_cache_name = '<name>' et enable_filesystem_cache = 1.
SELECT *
FROM s3('http://minio:10000/clickhouse//test_3.csv', 'minioadmin', 'minioadminpassword', 'CSV')
SETTINGS filesystem_cache_name = 'cache_for_s3', enable_filesystem_cache = 1;
Il existe deux façons de définir le cache dans le fichier de configuration.
  1. Ajoutez la section suivante au fichier de configuration de ClickHouse :
<clickhouse>
    <filesystem_caches>
        <cache_for_s3>
            <path>path to cache directory</path>
            <max_size>10Gi</max_size>
        </cache_for_s3>
    </filesystem_caches>
</clickhouse>
  1. réutiliser la configuration du cache (et donc son stockage) de la section storage_configuration de ClickHouse, décrite ici

PARTITION BY

PARTITION BY — Facultatif. Dans la plupart des cas, vous n’avez pas besoin de clé de partition et, si vous en avez besoin, il n’est généralement pas nécessaire qu’elle soit plus fine qu’un partitionnement mensuel. Le partitionnement n’accélère pas les requêtes (contrairement à l’expression ORDER BY). N’utilisez jamais un partitionnement trop fin. Ne partitionnez pas vos données par identifiant ou nom de client (à la place, faites de l’identifiant ou du nom du client la première colonne de l’expression ORDER BY). Pour un partitionnement mensuel, utilisez l’expression toYYYYMM(date_column), où date_column est une colonne contenant une date de type Date. Les noms de partition ont alors le format "YYYYMM".

Stratégie de partitionnement

WILDCARD : remplace le caractère générique {_partition_id} dans le chemin de fichier par la clé de partition réelle. La lecture n’est pas prise en charge. Cette stratégie est sélectionnée par défaut uniquement avec des paramètres compatibility antérieurs à 26.6 ; sinon, la valeur par défaut est HIVE (voir le paramètre file_like_engine_default_partition_strategy). HIVE implémente le partitionnement de style Hive en lecture et en écriture. La lecture s’appuie sur un motif glob récursif et équivaut à SELECT * FROM s3('table_root/**.parquet'). L’écriture génère des fichiers au format suivant : <prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)>. Remarque : lors de l’utilisation de la stratégie de partitionnement HIVE, le paramètre use_hive_partitioning n’a aucun effet. Exemple de stratégie de partitionnement HIVE :
arthur :) CREATE TABLE t_03363_parquet (year UInt16, country String, counter UInt8)
ENGINE = S3(s3_conn, filename = 't_03363_parquet', format = Parquet, partition_strategy='hive')
PARTITION BY (year, country);

arthur :) INSERT INTO t_03363_parquet VALUES
    (2022, 'USA', 1),
    (2022, 'Canada', 2),
    (2023, 'USA', 3),
    (2023, 'Mexico', 4),
    (2024, 'France', 5),
    (2024, 'Germany', 6),
    (2024, 'Germany', 7),
    (1999, 'Brazil', 8),
    (2100, 'Japan', 9),
    (2024, 'CN', 10),
    (2025, '', 11);

arthur :) select _path, * from t_03363_parquet;

    ┌─_path──────────────────────────────────────────────────────────────────────┬─year─┬─country─┬─counter─┐
 1. │ test/t_03363_parquet/year=2100/country=Japan/7329604473272971264.parquet2100 │ Japan   │       9
 2. │ test/t_03363_parquet/year=2024/country=France/7329604473323302912.parquet2024 │ France  │       5
 3. │ test/t_03363_parquet/year=2022/country=Canada/7329604473314914304.parquet2022 │ Canada  │       2
 4. │ test/t_03363_parquet/year=1999/country=Brazil/7329604473289748480.parquet1999 │ Brazil  │       8
 5. │ test/t_03363_parquet/year=2023/country=Mexico/7329604473293942784.parquet2023 │ Mexico  │       4
 6. │ test/t_03363_parquet/year=2023/country=USA/7329604473319108608.parquet2023 │ USA     │       3
 7. │ test/t_03363_parquet/year=2025/country=/7329604473327497216.parquet2025 │         │      11
 8. │ test/t_03363_parquet/year=2024/country=CN/7329604473310720000.parquet2024 │ CN      │      10
 9. │ test/t_03363_parquet/year=2022/country=USA/7329604473298137088.parquet2022 │ USA     │       1
10. │ test/t_03363_parquet/year=2024/country=Germany/7329604473306525696.parquet2024 │ Germany │       6
11. │ test/t_03363_parquet/year=2024/country=Germany/7329604473306525696.parquet2024 │ Germany │       7
    └────────────────────────────────────────────────────────────────────────────┴──────┴─────────┴─────────┘

Interroger des données partitionnées

Cet exemple utilise la recette Docker Compose, qui intègre ClickHouse et MinIO. Vous devriez pouvoir reproduire les mêmes requêtes avec S3 en remplaçant les valeurs de l’endpoint et de l’authentification. Notez que l’endpoint S3 dans la configuration ENGINE utilise le jeton de paramètre {_partition_id} comme partie de l’objet S3 (nom de fichier), et que les requêtes SELECT portent sur les noms d’objet ainsi générés (par exemple, test_3.csv).
Comme le montre l’exemple, l’interrogation de tables S3 partitionnées n’est pas directement prise en charge pour le moment, mais peut être réalisée en interrogeant les partitions individuelles à l’aide de la fonction de table S3.Le principal cas d’usage de l’écriture de données partitionnées dans S3 est de permettre le transfert de ces données vers un autre système ClickHouse (par exemple, lors d’une migration d’un environnement on-prem vers ClickHouse Cloud). Comme les jeux de données ClickHouse sont souvent très volumineux et que la fiabilité du réseau n’est pas toujours parfaite, il est logique de transférer les jeux de données par sous-ensembles, d’où l’intérêt des écritures partitionnées.

Créer la table

CREATE TABLE p
(
    `column1` UInt32,
    `column2` UInt32,
    `column3` UInt32
)
ENGINE = S3(
           'http://minio:10000/clickhouse//test_{_partition_id}.csv',
           'minioadmin',
           'minioadminpassword',
           'CSV')
PARTITION BY column3

Insérer des données

INSERT INTO p VALUES (1, 2, 3), (3, 2, 1), (78, 43, 45)

Sélectionner dans la partition 3

Cette requête utilise la fonction de table S3
SELECT *
FROM s3('http://minio:10000/clickhouse//test_3.csv', 'minioadmin', 'minioadminpassword', 'CSV')
┌─c1─┬─c2─┬─c3─┐
│  1 │  2 │  3 │
└────┴────┴────┘

Sélectionner dans la partition 1

SELECT *
FROM s3('http://minio:10000/clickhouse//test_1.csv', 'minioadmin', 'minioadminpassword', 'CSV')
┌─c1─┬─c2─┬─c3─┐
│  3 │  2 │  1 │
└────┴────┴────┘

Sélectionner dans la partition 45

SELECT *
FROM s3('http://minio:10000/clickhouse//test_45.csv', 'minioadmin', 'minioadminpassword', 'CSV')
┌─c1─┬─c2─┬─c3─┐
│ 78 │ 43 │ 45 │
└────┴────┴────┘

Limitation

Vous serez peut-être tenté d’essayer Select * from p, mais, comme indiqué ci-dessus, cette requête échouera ; utilisez plutôt la requête précédente.
SELECT * FROM p
Received exception from server (version 23.4.1):
Code: 48. DB::Exception: Received from localhost:9000. DB::Exception: Reading from a partitioned S3 storage is not implemented yet. (NOT_IMPLEMENTED)

Insérer des données

Notez que les lignes ne peuvent être insérées que dans de nouveaux fichiers. Il n’existe ni cycles de fusion ni opérations de fractionnement de fichiers. Une fois un fichier écrit, les insertions ultérieures échouent. Pour éviter cela, vous pouvez utiliser les paramètres s3_truncate_on_insert et s3_create_new_file_on_insert. Voir plus de détails ici.

Colonnes virtuelles

  • _path — Chemin du fichier. Type : LowCardinality(String).
  • _file — Nom du fichier. Type : LowCardinality(String).
  • _size — Taille du fichier en octets. Type : Nullable(UInt64). Si la taille est inconnue, la valeur est NULL.
  • _time — Date et heure de dernière modification du fichier. Type : Nullable(DateTime). Si l’heure est inconnue, la valeur est NULL.
  • _etag — ETag du fichier. Type : LowCardinality(String). Si l’ETag est inconnu, la valeur est NULL.
  • _tags — Tags du fichier. Type : Map(String, String). S’il n’existe aucun tag, la valeur est une map vide `’.
Pour plus d’informations sur les colonnes virtuelles, consultez ici.

Détails d’implémentation

  • Les lectures et les écritures peuvent s’effectuer en parallèle
  • Non pris en charge :
    • Les opérations ALTER et SELECT...SAMPLE.
    • Les index.
    • La réplication zero-copy est possible, mais n’est pas prise en charge.
La réplication zero-copy n’est pas prête pour un usage en productionLa réplication zero-copy est désactivée par défaut dans ClickHouse version 22.8 et ultérieure. Cette fonctionnalité n’est pas recommandée en production.

Caractères génériques dans le chemin

L’argument path peut spécifier plusieurs fichiers à l’aide de caractères génériques de type bash. Pour être traité, un fichier doit exister et correspondre au motif de chemin complet. La liste des fichiers est déterminée lors du SELECT (et non au moment du CREATE).
  • * — Remplace n’importe quelle suite de caractères, à l’exception de /, y compris la chaîne vide.
  • ** — Remplace n’importe quelle suite de caractères, y compris /, y compris la chaîne vide.
  • ? — Remplace un seul caractère quelconque.
  • {some_string,another_string,yet_another_one} — Remplace l’une des chaînes 'some_string', 'another_string', 'yet_another_one'.
  • {N..M} — Remplace n’importe quel nombre dans l’intervalle de N à M, bornes incluses. N et M peuvent comporter des zéros initiaux, par exemple 000..078.
Les constructions avec {} sont similaires à la fonction de table remote.
Si la liste des fichiers contient des intervalles numériques avec des zéros initiaux, utilisez la construction avec des accolades pour chaque chiffre séparément ou utilisez ?.
Exemple avec des caractères génériques 1 Créez une table avec des fichiers nommés file-000.csv, file-001.csv, … , file-999.csv :
CREATE TABLE big_table (name String, value UInt32)
    ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/my_folder/file-{000..999}.csv', 'CSV');
Exemple avec des caractères génériques 2 Supposons que nous ayons plusieurs fichiers au format CSV avec les URI suivantes sur S3 : Il existe plusieurs façons de créer une table à partir de ces six fichiers :
  1. Indiquez une plage de suffixes de fichiers :
CREATE TABLE table_with_range (name String, value UInt32)
    ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/{some,another}_folder/some_file_{1..3}', 'CSV');
  1. Prenez tous les fichiers portant le préfixe some_file_ (il ne doit y avoir aucun fichier supplémentaire portant ce préfixe dans les deux dossiers) :
CREATE TABLE table_with_question_mark (name String, value UInt32)
    ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/{some,another}_folder/some_file_?', 'CSV');
  1. Prenez tous les fichiers dans les deux dossiers (tous les fichiers doivent respecter le format et le schéma décrits dans la requête) :
CREATE TABLE table_with_asterisk (name String, value UInt32)
    ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/{some,another}_folder/*', 'CSV');

Paramètres de stockage

  • s3_truncate_on_insert - permet de tronquer le fichier avant d’y effectuer une insertion. Désactivé par défaut.
  • s3_create_new_file_on_insert - permet de créer un nouveau fichier à chaque insertion si le format comporte un suffixe. Désactivé par défaut.
  • s3_skip_empty_files - permet d’ignorer les fichiers vides lors de la lecture. Activé par défaut.

Paramètres liés à S3

Les paramètres suivants peuvent être définis avant l’exécution de la requête ou placés dans le fichier de configuration.
  • s3_max_single_part_upload_size — Taille maximale de l’objet à téléverser vers S3 en une seule partie. La valeur par défaut est 32Mb.
  • s3_min_upload_part_size — Taille minimale de la partie à téléverser lors d’un téléversement multipartie vers S3 Multipart upload. La valeur par défaut est 16Mb.
  • s3_max_redirects — Nombre maximal de redirections S3 autorisées. La valeur par défaut est 10.
  • s3_single_read_retries — Nombre maximal de tentatives pour une lecture unique. La valeur par défaut est 4.
  • s3_max_put_rps — Taux maximal de requêtes PUT par seconde avant limitation. La valeur par défaut est 0 (illimité).
  • s3_max_put_burst — Nombre maximal de requêtes pouvant être émises simultanément avant d’atteindre la limite de requêtes par seconde. Par défaut (valeur 0), il est égal à s3_max_put_rps.
  • s3_max_get_rps — Taux maximal de requêtes GET par seconde avant limitation. La valeur par défaut est 0 (illimité).
  • s3_max_get_burst — Nombre maximal de requêtes pouvant être émises simultanément avant d’atteindre la limite de requêtes par seconde. Par défaut (valeur 0), il est égal à s3_max_get_rps.
  • s3_upload_part_size_multiply_factor - Multiplie s3_min_upload_part_size par ce facteur chaque fois que s3_multiply_parts_count_threshold parties ont été téléversées à partir d’une seule écriture vers S3. La valeur par défaut est 2.
  • s3_upload_part_size_multiply_parts_count_threshold - Chaque fois que ce nombre de parties a été téléversé vers S3, s3_min_upload_part_size est multiplié par s3_upload_part_size_multiply_factor. La valeur par défaut est 500.
  • s3_max_inflight_parts_for_one_file - Limite le nombre de requêtes PUT pouvant être exécutées simultanément pour un objet. Cette valeur doit être limitée. La valeur 0 signifie illimité. La valeur par défaut est 20. Chaque partie en cours de transfert utilise un tampon de taille s3_min_upload_part_size pour les s3_upload_part_size_multiply_factor premières parties, puis davantage lorsque le fichier est suffisamment volumineux, voir upload_part_size_multiply_factor. Avec les paramètres par défaut, un fichier téléversé ne consomme pas plus de 320Mb pour un fichier de moins de 8G. La consommation est plus élevée pour un fichier plus volumineux.
Considération de sécurité : si un utilisateur malveillant peut spécifier des URL S3 arbitraires, s3_max_redirects doit être défini sur zéro afin d’éviter les attaques SSRF ; sinon, remote_host_filter doit être spécifié dans la configuration du serveur.

Paramètres propres à l’endpoint

Les paramètres suivants peuvent être spécifiés dans le fichier de configuration pour un endpoint donné (qui sera mis en correspondance avec le préfixe exact d’une URL) :
  • endpoint — Spécifie le préfixe d’un endpoint. Obligatoire.
  • access_key_id et secret_access_key — Spécifie les identifiants à utiliser avec l’endpoint donné. Facultatif.
  • use_environment_credentials — Si défini sur true, le client S3 tentera d’obtenir les identifiants à partir des variables d’environnement et des métadonnées Amazon EC2 pour l’endpoint donné. Facultatif, la valeur par défaut est false.
  • region — Spécifie le nom de la région S3. Facultatif.
  • use_insecure_imds_request — Si défini sur true, le client S3 utilisera une requête IMDS non sécurisée lors de l’obtention des identifiants à partir des métadonnées Amazon EC2. Facultatif, la valeur par défaut est false.
  • expiration_window_seconds — Période de grâce permettant de vérifier si des identifiants expirables ont expiré. Facultatif, la valeur par défaut est 120.
  • no_sign_request - Ignore tous les identifiants afin que les requêtes ne soient pas signées. Utile pour accéder à des buckets publics.
  • header — Ajoute l’en-tête HTTP spécifié à une requête vers l’endpoint donné. Facultatif, peut être spécifié plusieurs fois.
  • access_header - Ajoute l’en-tête HTTP spécifié à une requête vers l’endpoint donné lorsqu’aucun autre identifiant n’est disponible depuis une autre source.
  • server_side_encryption_customer_key_base64 — Si spécifié, les en-têtes requis pour accéder à des objets S3 avec un chiffrement SSE-C seront définis. Facultatif.
  • server_side_encryption_kms_key_id - Si spécifié, les en-têtes requis pour accéder à des objets S3 avec le chiffrement SSE-KMS seront définis. Si une chaîne vide est spécifiée, la clé S3 gérée par AWS sera utilisée. Facultatif.
  • server_side_encryption_kms_encryption_context - Si spécifié avec server_side_encryption_kms_key_id, l’en-tête de contexte de chiffrement fourni pour SSE-KMS sera défini. Facultatif.
  • server_side_encryption_kms_bucket_key_enabled - Si spécifié avec server_side_encryption_kms_key_id, l’en-tête permettant d’activer les clés de bucket S3 pour SSE-KMS sera défini. Facultatif, peut être true ou false, et n’a pas de valeur par défaut (correspond au paramètre défini au niveau du bucket).
  • max_single_read_retries — Nombre maximal de tentatives lors d’une lecture unique. La valeur par défaut est 4. Facultatif.
  • max_put_rps, max_put_burst, max_get_rps et max_get_burst - Paramètres de limitation de débit (voir la description ci-dessus) à utiliser pour un endpoint spécifique plutôt que par query. Facultatif.
Exemple :
<s3>
    <endpoint-name>
        <endpoint>https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/</endpoint>
        <!-- <access_key_id>ACCESS_KEY_ID</access_key_id> -->
        <!-- <secret_access_key>SECRET_ACCESS_KEY</secret_access_key> -->
        <!-- <region>us-west-1</region> -->
        <!-- <use_environment_credentials>false</use_environment_credentials> -->
        <!-- <use_insecure_imds_request>false</use_insecure_imds_request> -->
        <!-- <expiration_window_seconds>120</expiration_window_seconds> -->
        <!-- <no_sign_request>false</no_sign_request> -->
        <!-- <header>Authorization: Bearer SOME-TOKEN</header> -->
        <!-- <server_side_encryption_customer_key_base64>BASE64-ENCODED-KEY</server_side_encryption_customer_key_base64> -->
        <!-- <server_side_encryption_kms_key_id>KMS_KEY_ID</server_side_encryption_kms_key_id> -->
        <!-- <server_side_encryption_kms_encryption_context>KMS_ENCRYPTION_CONTEXT</server_side_encryption_kms_encryption_context> -->
        <!-- <server_side_encryption_kms_bucket_key_enabled>true</server_side_encryption_kms_bucket_key_enabled> -->
        <!-- <max_single_read_retries>4</max_single_read_retries> -->
    </endpoint-name>
</s3>

Utilisation des archives

Supposons que nous disposions de plusieurs fichiers d’archive avec les URI suivantes sur S3 : Il est possible d’extraire des données de ces archives à l’aide de ::. Des globs peuvent être utilisés aussi bien dans la partie URL que dans la partie située après :: (qui correspond au nom d’un fichier à l’intérieur de l’archive).
SELECT *
FROM s3(
   'https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-1{0..2}.csv.zip :: *.csv'
);
ClickHouse prend en charge trois formats d’archive : ZIP TAR 7Z Si les archives ZIP et TAR sont accessibles depuis n’importe quel emplacement de stockage pris en charge, les archives 7Z ne peuvent être lues que depuis le système de fichiers local sur lequel ClickHouse est installé.

Accès aux buckets publics

ClickHouse essaie de récupérer des identifiants à partir de nombreux types de sources. Cela peut parfois poser des problèmes lors de l’accès à certains buckets publics et amener le client à renvoyer le code d’erreur 403. Vous pouvez éviter ce problème en utilisant le mot-clé NOSIGN, qui force le client à ignorer tous les identifiants et à ne pas signer les requêtes.
CREATE TABLE big_table (name String, value UInt32)
    ENGINE = S3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv', NOSIGN, 'CSVWithNames');

Optimisation des performances

Pour en savoir plus sur l’optimisation des performances de la fonction s3, consultez notre guide détaillé.

Accès basé sur les rôles

Dans ClickHouse Cloud, vous pouvez utiliser l’accès basé sur les rôles pour vous authentifier auprès de S3 au lieu d’utiliser des clés d’accès. Consultez Secure S3 pour suivre les étapes de configuration. Une fois la configuration effectuée, un roleARN peut être transmis via le paramètre extra_credentials :
CREATE TABLE my_s3_table(name String, value UInt32)
ENGINE = S3('https://my-bucket.s3.amazonaws.com/data/*.csv', extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001'), 'CSV')
Un external_id facultatif peut également être fourni avec role_arn. Il est transmis en tant que paramètre ExternalId dans l’appel AWS STS AssumeRole, ce qui permet à la policy de confiance du rôle d’exiger un secret partagé afin d’atténuer le problème du deputy confus :
CREATE TABLE my_s3_table(name String, value UInt32)
ENGINE = S3('https://my-bucket.s3.amazonaws.com/data/*.csv', extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001', external_id = 'my-external-id'), 'CSV')

Voir aussi

Dernière modification le 29 juin 2026