Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Безопасный доступ к данным Iceberg

ClickHouse Cloud поддерживает безопасный ролевой доступ к данным Iceberg, хранящимся в Объектном хранилище (обычно S3), с использованием доверительной связи AWS IAM на основе ARN. В этом руководстве используется тот же подход к безопасной настройке, что и в Безопасный доступ к данным S3, а также добавляется специфичная для Iceberg конфигурация в ClickHouse.

Обзор

  • Получите идентификатор сервисной роли ClickHouse Cloud (IAM).
  • Создайте в своей учётной записи AWS роль IAM, которую ClickHouse сможет взять на себя.
  • Прикрепите к роли политики доступа к объектам и каталогу для Iceberg.
  • Используйте табличные функции Iceberg или движок таблицы IcebergS3 с ролевыми учётными данными.

Получите идентификатор сервисной роли ClickHouse (ARN)

1. Войдите в свою учетную запись ClickHouse Cloud.

2. Выберите сервис ClickHouse, в котором хотите выполнять запросы к данным Iceberg.

[object Object]

[object Object]

[object Object]

Этот ARN требуется для политики доверия роли IAM в AWS, которая будет использоваться для доступа к вашим данным Iceberg.

Получение ARN сервисной роли IAM ClickHouse

Настройка роли IAM с AssumeRole

1. Войдите в AWS и перейдите в сервис IAM.

2. Выберите Roles, затем Create role.

В поле Trusted entity type выберите Custom trust policy и введите значения из шага 3.

3. Добавьте policy доверия и политику IAM.

Замените {service-role-id} на Service Role ID (IAM) из вашего экземпляра 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. Завершите создание роли.

a. Нажмите Next, затем ещё раз Next на экране назначения разрешений.

b. Укажите имя (например, iceberg-role-for-clickhouse) и описание.

c. Добавьте теги (необязательно).

d. Проверьте политики.

e. Выберите Create role.

[object Object]

Настроить доступ к Iceberg в ClickHouse Cloud

Вариант A: табличная функция Iceberg с ARN роли

Используйте табличную функцию icebergS3 с параметром NOSIGN и ролевыми учётными данными. 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: каталог DataLake для 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;

Проверьте доступ

  1. Выполните простой запрос:
SELECT * FROM icebergS3('https://{your-bucket}.s3.{region}.amazonaws.com/{iceberg-path}/', 'NOSIGN')
LIMIT 5;
  1. Проверьте, нет ли ошибок IAM, таких как AccessDenied или InvalidAccessKeyId.

Устранение неполадок

  • Проверьте ARN роли в настройках сервиса ClickHouse Cloud.
  • Убедитесь, что ваш бакет/объекты находятся в том же регионе, что и запросы к Iceberg, чтобы снизить задержку и стоимость.
  • Убедитесь, что путь к таблице Iceberg указывает на корректное расположение метаданных Iceberg (файлы metadata/v1/... в корневом каталоге таблицы).
  • Для режима каталога проверьте метаданные Glue и видимость партиций в консоли AWS Glue.
Navigation