Перейти к основному содержимому
Перейти к основному содержимому

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

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

Обзор

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

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

1. Войдите в свой аккаунт ClickHouse Cloud.

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

3. Перейдите на вкладку Settings.

4. Прокрутите страницу до раздела Network security information.

5. Скопируйте значение Service role ID (IAM).

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

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

Настройте Assume Role в IAM

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

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

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

3. Добавьте политики доверия и 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}:*"
    }
  ]
}
Примечание

Для рабочих нагрузок с чтением и записью политика IAM должна включать s3:PutObject, s3:DeleteObject и действия Iceberg, изменяющие метаданные. Приведённый выше пример — это консервативный вариант только для чтения.

Если вам нужна более строгая изоляция, требуйте, чтобы запросы поступали из конечных точек VPC ClickHouse Cloud. Дополнительная информация об этой настройке приведена в разделе Secure S3 advanced action control.

4. Завершите создание роли.

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

b. Добавьте имя (например, iceberg-role-for-clickhouse) и описание.

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

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

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

5. После создания скопируйте новый ARN роли IAM.

Настройка доступа к 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 Catalog for Glue

Примечание

DataLake Catalog for Glue будет доступен в версии 26.2.

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.