ClickHouse Cloud는 ARN 기반 AWS IAM 신뢰 관계를 사용하여 객체 스토리지(일반적으로 S3)에 저장된 Iceberg 데이터에 대한 안전한 역할 기반 접근을 지원합니다. 이 가이드는 S3 데이터에 안전하게 접근하기와 동일한 보안 설정 패턴을 따르며, ClickHouse에 Iceberg 전용 구성을 추가로 설정하는 방법을 설명합니다.
개요
- ClickHouse Cloud 서비스 역할 ID(IAM)를 가져옵니다.
- ClickHouse가 수임할 수 있도록 AWS 계정에 IAM 역할을 생성합니다.
- 역할에 Iceberg 전용 객체 정책과 카탈로그 정책을 연결합니다.
- 역할 기반 자격 증명을 사용해 Iceberg 테이블 함수 또는 IcebergS3 테이블 엔진을 사용합니다.
ClickHouse 서비스 역할 ID(ARN) 가져오기
1. ClickHouse Cloud 계정에 로그인합니다.
2. Iceberg 데이터를 쿼리할 ClickHouse 서비스를 선택합니다.
[object Object]
[object Object]
[object Object]
이 ARN은 Iceberg 데이터에 액세스할 AWS IAM 역할의 신뢰 정책에 필요합니다.

IAM assume role 설정
1. AWS에 로그인한 후 IAM 서비스로 이동합니다.
2. Roles를 선택한 다음 Create role을 선택합니다.
Trusted entity type에서 Custom trust policy를 선택하고 3단계의 값을 입력합니다.
3. 신뢰 정책과 IAM 정책을 추가합니다.
{service-role-id}를 ClickHouse 인스턴스의 서비스 역할 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: role 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 카탈로그 + 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: 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;접속 확인
- 간단한 쿼리를 실행합니다:
SELECT * FROM icebergS3('https://{your-bucket}.s3.{region}.amazonaws.com/{iceberg-path}/', 'NOSIGN')
LIMIT 5;AccessDenied또는InvalidAccessKeyId와 같은 IAM 오류가 있는지 확인하십시오.
문제 해결
- ClickHouse Cloud 서비스 설정에서 role ARN을 확인하십시오.
- 지연 시간과 비용을 줄이려면 버킷/객체가 Iceberg 쿼리가 실행되는 리전과 같은 리전에 있는지 확인하십시오.
- Iceberg 테이블 경로가 올바른 Iceberg 메타데이터 위치(테이블 루트 아래의
metadata/v1/...파일)를 가리키는지 확인하십시오. - catalog 모드에서는 AWS Glue 콘솔에서 Glue 메타데이터와 파티션이 표시되는지 확인하십시오.