Apache Iceberg™ 테이블용 저장소

Snowflake 테이블은 일반적으로 Snowflake가 관리하는 저장소를 사용합니다. 반면에, Snowflake의 Apache Iceberg™ 테이블은 사용자가 구성하고 유지 관리하는 외부 저장소를 사용합니다.

이 항목에서는 Iceberg 테이블 저장소에 대한 개념적 정보와 모범 사례를 제공합니다.

저장소에 Snowflake 액세스 권한 부여하기

Snowflake가 Iceberg 테이블의 저장 위치에 액세스할 수 있도록 허용하려면 클라우드 공급자의 ID 및 액세스 관리 서비스를 사용합니다. ID 또는 보안 주체와 시크릿을 교환하지 않고 저장소에 대한 제한된 액세스 권한을 부여합니다. 이는 Snowflake가 저장소 통합을 포함한 다른 통합에 사용하는 액세스 모델과 동일합니다.

외부 볼륨 을 생성하면 Snowflake는 전체 Snowflake 계정에 대한 주체를 프로비저닝합니다. 주체는 클라우드 공급자에 따라 다음과 같습니다.

클라우드 공급자

Snowflake 프로비저닝 주체

Amazon Web Services(AWS)

IAM 사용자

Google Cloud

서비스 계정

Azure

서비스 주체

Snowflake는 저장소 공급자와 직접 인증하며, Snowflake 프로비저닝 주체는 사용자가 지정한 역할을 수행합니다. 역할에는 저장 위치에서 작업을 수행할 수 있는 권한이 있어야 합니다. 예를 들어, Snowflake는 역할에 해당 저장 위치에서 읽기 권한이 있는 경우에만 저장 위치에서 읽을 수 있습니다.

Snowflake에는 Iceberg 테이블에서 다음 작업을 수행할 수 있는 권한이 필요합니다.

Snowflake 관리 테이블

외부 Iceberg 카탈로그를 사용하는 테이블

Amazon S3

  • s3:GetBucketLocation

  • s3:GetObject

  • s3:ListBucket

  • s3:PutObject

  • s3:DeleteObject

  • s3:GetObjectVersion

  • s3:DeleteObjectVersion

  • s3:GetBucketLocation

  • s3:GetObject

  • s3:ListBucket

  • s3:GetObjectVersion

Google Cloud Storage

  • storage.objects.create

  • storage.objects.delete

  • storage.objects.get

  • storage.objects.list

  • storage.buckets.get

  • storage.objects.get

  • storage.objects.list

Azure 저장소

저장소 Blob 데이터 기여자 역할 에 허용되는 모든 작업

저장소 Blob 데이터 독자 역할 에 허용되는 모든 작업

참고

s3:PutObject 권한은 외부 볼륨 위치에 대한 쓰기 액세스 권한을 부여합니다. 쓰기 액세스를 완전히 구성하려면 외부 볼륨의 ALLOW_WRITES 매개 변수를 TRUE (기본값)로 설정해야 합니다.

각 외부 볼륨은 특정 활성 저장소 위치 과 연결되며, 하나의 외부 볼륨은 여러 개의 Iceberg 테이블을 지원할 수 있습니다. 그러나 필요한 외부 볼륨의 수는 테이블 데이터를 어떻게 저장, 구성하고 보호할 것인지에 따라 달라집니다.

동일한 저장 위치(예: 동일한 S3 버킷) 아래의 하위 디렉터리에 모든 Snowflake-Iceberg 테이블에 대한 데이터와 메타데이터를 저장할 경우 단일 외부 볼륨을 사용할 수 있습니다. Snowflake 관리 테이블에 대해 이러한 디렉터리를 구성하려면 데이터 및 메타데이터 디렉터리 섹션을 참조하십시오.

또는 여러 개의 외부 볼륨을 생성하여 다양한 저장 위치를 각기 다르게 보호할 수 있습니다. 예를 들어, 다음과 같은 외부 볼륨을 생성할 수 있습니다.

  • 외부에서 관리되는 Iceberg 테이블을 위한 읽기 전용 외부 볼륨입니다.

  • Snowflake 관리 테이블에 대한 읽기 및 쓰기 액세스 권한이 구성된 외부 볼륨입니다.

Iceberg 테이블에 대한 저장소 액세스 권한을 Snowflake에 부여하는 방법에 대한 전체 지침은 다음 항목을 참조하십시오.

활성 저장소 위치

각 외부 볼륨은 하나의 활성 저장소 위치를 지원합니다. CREATE EXTERNAL VOLUME 문에 저장소 위치를 여러 개 지정하면 Snowflake는 한 위치를 활성 위치로 할당합니다. 활성 위치는 외부 볼륨의 수명 동안 동일하게 유지됩니다.

할당은 CREATE ICEBERG TABLE 문에서 외부 볼륨을 처음 사용할 때 발생합니다. Snowflake는 다음 논리를 사용하여 활성 위치를 선택합니다.

  • STORAGE_LOCATIONS 목록에 하나 이상의 로컬 저장소 위치가 포함된 경우 Snowflake는 목록의 첫 번째 로컬 저장소 위치를 사용합니다. 로컬 저장소 위치는 클라우드 공급업체와 동일한 위치이며 사용자의 Snowflake 계정과 동일합니다.

  • STORAGE_LOCATIONS 목록에 로컬 저장소 위치가 없으면 Snowflake는 목록의 첫 번째 위치를 선택합니다.

참고

  • 클라우드 간/리전 간 Iceberg 테이블은 외부 Iceberg 카탈로그를 사용하는 경우에만 지원됩니다. 자세한 내용은 클라우드 간/리전 간 지원 을 참조하십시오.

  • Snowflake 버전 7.44 이전에 생성된 외부 볼륨은 활성 위치를 선택하는 데 다른 논리를 사용했을 수 있습니다.

저장소 액세스 확인

Snowflake가 저장소 공급자를 성공적으로 인증할 수 있는지 확인하려면 SYSTEM$VERIFY_EXTERNAL_VOLUME 함수를 호출합니다.

SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('my_s3_external_volume');
Copy

Snowflake 관리 테이블의 경우, 다음과 같은 상황에서 Snowflake는 외부 볼륨의 활성 저장소 위치 에 대한 액세스를 자동으로 확인합니다.

  • Snowflake 관리 테이블의 CREATE ICEBERG TABLE 문에서 외부 볼륨을 처음 지정하는 경우.

  • 처음으로 테이블을 변환하여 Snowflake를 Iceberg 카탈로그로 사용하는 경우.

외부 볼륨의 ALLOW_WRITES 속성을 TRUE 로 설정해야 합니다.

Snowflake는 저장소 위치를 확인하기 위해 다음과 같은 저장소 작업을 시도합니다.

  1. 테스트 파일을 작성합니다.

  2. 파일을 읽습니다.

  3. 파일 경로의 내용을 나열합니다.

  4. 파일을 삭제합니다.

작업 중 하나라도 실패하면 CREATE ICEBERG TABLE(또는 ALTER ICEBERG TABLE … CONVERT TO MANAGED) 문이 실패하고 오류 메시지가 표시됩니다.

파일 관리

이 섹션에서는 Iceberg 테이블 유형에 따라 저장소에서 Iceberg 테이블 파일을 관리하는 방식을 설명합니다.

Snowflake 관리 테이블

중요

  • Snowflake에서 관리하는 Iceberg 테이블과 연관된 오브젝트를 삭제하거나 덮어쓸 수 있는 권한을 다른 도구에 허용하지 않습니다.

  • Snowflake 주체가 테이블 저장소에 대한 액세스 권한을 유지하고 있는지 확인합니다. 자세한 내용은 저장소에 Snowflake 액세스 권한 부여하기 섹션을 참조하십시오.

사용자 가 Iceberg 테이블의 저장 위치를 구성하고 관리하더라도 Snowflake는 Snowflake 관리 테이블에 속하는 사용자 저장소의 오브젝트(데이터 및 메타데이터 파일)에서만 동작합니다. Snowflake는 이러한 테이블 오브젝트에 대한 주기적 유지 관리를 실행하여 쿼리 성능을 최적화하고 삭제된 데이터를 정리합니다.

다른 도구가 Snowflake에서 관리하는 테이블 오브젝트를 삭제하거나 덮어쓰는 경우 쿼리가 실패할 수 있습니다. 마찬가지로, Snowflake 주체의 저장소 액세스 권한을 취소하면 테이블에 대한 쿼리와 Snowflake 테이블 유지 관리 작업이 실패합니다.

Snowflake에서 관리하는 테이블 데이터가 삭제되거나 테이블이 삭제되면 테이블 보존 기간이 만료된 후 Snowflake는 오브젝트를 삭제합니다.

데이터 및 메타데이터 디렉터리

Snowflake 관리 테이블의 경우 Snowflake는 Parquet 데이터 파일과 테이블 메타데이터를 외부 클라우드 저장소의 다음 경로에 기록합니다.

  • STORAGE_BASE_URL/BASE_LOCATION/data/

  • STORAGE_BASE_URL/BASE_LOCATION/metadata/

여기서

  • STORAGE_BASE_URL 은 외부 볼륨과 연결된 활성 저장소 위치의 기본 URL입니다.

  • BASE_LOCATION 은 외부 볼륨의 상대 경로에 있는 디렉터리 이름입니다(CREATE ICEBERG TABLE 문에 지정).

BASE_LOCATION에 빈 문자열 지정하기

BASE_LOCATION 에 빈 문자열('')을 지정하면 Snowflake는 STORAGE_BASE_URL 바로 아래에 data/metadata/ 디렉터리를 생성합니다.

예: STORAGE_BASE_URL/data/

여러 테이블에 동일한 위치 사용하기

동일한 저장소 위치를 사용하고 여러 테이블에 대해 동일한 기본 위치를 지정하면 Snowflake는 해당 테이블의 모든 데이터를 동일한 data/ 디렉터리에 씁니다. 마찬가지로, Snowflake는 모든 테이블의 메타데이터를 동일한 metadata/ 디렉터리에 씁니다.

BASE_LOCATION을 사용하여 테이블 저장소 구성하기

저장소에 있는 파일을 동일한 STORAGE_BASE_URL 아래에 있는 여러 Iceberg 테이블에 대해 구성하려면 CREATE ICEBERG TABLE 문에서 테이블 이름을 BASE_LOCATION 으로 사용하는 것이 좋습니다. 이런 방식으로 Snowflake는 테이블과 같은 이름의 디렉터리에 데이터와 메타데이터를 기록합니다.

예:

CREATE OR REPLACE ICEBERG TABLE iceberg_table_1 (
  col_1 int,
  col_2 string
)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'iceberg_external_volume'
  BASE_LOCATION = 'iceberg_table_1';

CREATE OR REPLACE ICEBERG TABLE iceberg_table_2 (
  col_1 int,
  col_2 string
)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'iceberg_external_volume'
  BASE_LOCATION = 'iceberg_table_2';
Copy

이 명령은 외부 클라우드 저장소에서 다음과 같은 디렉터리 구조를 생성합니다.

STORAGE_BASE_URL
|-- iceberg_table_1
|   |-- data/
|   |-- metadata/
|-- iceberg_table_2
|   |-- data/
|   |-- metadata/
Copy

외부 카탈로그를 사용하는 테이블

Snowflake는 외부에서 관리되는 Iceberg 테이블 또는 ALLOW_WRITES 속성이 FALSE 로 설정된 외부 볼륨에 대한 저장소 오브젝트를 쓰거나 삭제하지 않습니다.

Snowflake는 테이블 데이터와 메타데이터에 액세스하기 위해 외부 볼륨에 대해 구성한 액세스 제어 역할을 수행합니다. 저장 위치(버킷 또는 컨테이너)에 액세스할 수 있는 권한을 역할에 부여합니다. 모든 테이블 데이터와 메타데이터 파일이 해당 위치에 있어야 합니다. 예를 들어, 저장소 위치가 S3 버킷인 경우 모든 데이터와 메타데이터 파일은 해당 버킷 어딘가에 존재해야 합니다.

또한, 테이블을 변환 해도 데이터나 메타데이터 파일이 다시 작성되지 않습니다. Snowflake를 카탈로그로 사용하도록 테이블을 변환한 후에만 Snowflake는 Iceberg 테이블에 데이터를 씁니다.

저장소 액세스 로그 활성화하기

외부 볼륨과 관련된 저장소 위치에 대한 문제를 진단하고 액세스를 감사하려면 저장소 로깅을 활성화할 수 있습니다. 저장소 로그는 누락되거나 손상된 파일의 원인을 식별하는 데 도움이 됩니다.

저장소 공급자를 통해 로깅을 활성화합니다. 사용자가 Iceberg 테이블의 저장소를 소유하고 관리하므로 Snowflake에서 Iceberg 저장소 위치에 대한 로깅이나 감사를 활성화할 수 없습니다.

저장소 공급자에 대한 저장소 액세스 로그에 대해 알아보려면 다음 외부 항목을 참조하십시오.

버전 관리 및 오브젝트 보존을 사용하여 파일 보호하기

Iceberg 테이블 데이터가 여러 도구와 서비스에 의해 운영되는 중앙 데이터 리포지토리(또는 데이터 레이크)에 있는 경우, 실수로 삭제되거나 손상될 수 있습니다. Iceberg 테이블 데이터를 보호하고 실수로 삭제되거나 덮어쓴 데이터를 검색하려면 저장소 공급자가 제공하는 저장소 수명 주기 관리 및 버전 관리를 사용합니다.

수명 주기 관리를 사용하면 저장소 오브젝트에 대한 보존 및 추적 규칙을 설정할 수 있습니다. 저장소 공급자의 수명 주기 관리에 대해 알아보려면 다음 외부 항목을 참조하십시오.

오브젝트 복구를 지원하기 위해 외부 클라우드 저장소에 대한 버전 관리를 활성화할 수도 있습니다.

테이블 파일 암호화하기

Snowflake는 일반적인 서버 쪽 암호화(SSE) 스키마를 사용하여 암호화한 저장소의 Iceberg 테이블 파일을 읽을 수 있습니다. 클라우드 서비스 공급자를 사용하여 암호화 키를 관리해야 하며, 고객 관리 키를 사용하는 경우 Snowflake 주체에게 키에 대한 액세스 권한을 부여해야 합니다.

Amazon S3의 경우 Snowflake는 다음 SSE 옵션을 지원합니다.

SSE 옵션

구성

Amazon S3 관리 키를 사용한 SSE(SSE-S3)

ENCRYPTION = ( TYPE = 'AWS_SSE_S3' )CREATE EXTERNAL VOLUME 명령에 지정합니다.

AWS KMS 키를 사용한 SSE(SSE-KMS)

ENCRYPTION = ( TYPE = 'AWS_SSE_KMS' KMS_KEY_ID='my_key' )CREATE EXTERNAL VOLUME 명령에 지정합니다.

또한 SSE-KMS 암호화에 필요한 권한도 부여해야 합니다. 지침은 Amazon S3의 외부 볼륨 구성하기 의 3단계를 참조하십시오.

Google Cloud Storage의 경우, Snowflake는 다음 SSE 옵션을 지원합니다.

SSE 옵션

구성

Google Cloud KMS에 저장된 키를 사용한 SSE

ENCRYPTION = ( TYPE = 'GCS_SSE_KMS' KMS_KEY_ID = 'my_key' )CREATE EXTERNAL VOLUME 명령에 지정합니다.

Google Cloud 키 관리 서비스 키에 대한 GCS 서비스 계정 권한 부여 도 지정해야 합니다.