Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

安全访问 Iceberg 数据

ClickHouse Cloud 通过基于 ARN 的 AWS IAM 信任关系,支持对存储在对象存储 (通常为 S3) 中的 Iceberg 数据进行安全的基于角色的访问控制。本指南沿用与安全访问 S3 数据相同的安全配置模式,并在 ClickHouse 中补充了 Iceberg 特有的配置。

概述

  • 获取 ClickHouse Cloud 服务角色 ID (IAM) 。
  • 在您的 AWS 账户中创建一个可由 ClickHouse 承担的 IAM 角色。
  • 将 Iceberg 专用的对象和 catalog 策略附加到该角色。
  • 使用基于角色的凭证,通过 Iceberg 表函数或 IcebergS3 表引擎进行访问。

获取 ClickHouse 服务角色 ID (ARN)

1. 登录您的 ClickHouse Cloud 账户。

2. 选择要查询 Iceberg 数据的 ClickHouse 服务。

[object Object]

[object Object]

[object Object]

此 ARN 是为将访问您的 Iceberg 数据的 AWS IAM 角色配置信任策略所必需的。

获取 ClickHouse 服务 IAM 角色 ARN

设置 IAM Assume Role

1. 登录 AWS 并进入 IAM 服务。

2. 选择 Roles,然后点击 Create role。

Trusted entity type 设为 Custom trust policy,并根据步骤 3 填写相应的值。

3. 添加信任策略和 IAM 策略。

{service-role-id} 替换为你的 ClickHouse 实例中的 Service Role 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 catalog + 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 catalog 时,请确保您的 IAM role 同时具备 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;

验证访问

  1. 运行一个简单查询:
SELECT * FROM icebergS3('https://{your-bucket}.s3.{region}.amazonaws.com/{iceberg-path}/', 'NOSIGN')
LIMIT 5;
  1. 检查是否有 AccessDeniedInvalidAccessKeyId 之类的 IAM 错误。

故障排查

  • 验证 ClickHouse Cloud 服务设置中的角色 ARN。
  • 确保存储桶/对象与 Iceberg 查询位于同一区域,以降低延迟和成本。
  • 确认 Iceberg 表路径指向有效的 Iceberg 元数据位置 (即表根目录下的 metadata/v1/... 文件) 。
  • 对于 catalog 模式,请在 AWS Glue 控制台中检查 Glue 元数据和分区可见性。
Navigation