Google Cloud Storage용 통합 구성

Google Cloud Storage용 통합 구성

이 주제는 Google Cloud Storage 버킷에 저장된 데이터 파일에 대한 보안 액세스를 구성하는 방법을 설명해요.

출처: Documentation

본문

Snowflake 스토리지 통합 구성

이 섹션은 스토리지 통합을 사용해 Snowflake가 외부(즉, Cloud Storage) 스테이지에 참조된 Google Cloud Storage 버킷에서 데이터를 읽고 쓸 수 있게 하는 방법을 설명해요. 통합은 시크릿 키나 액세스 토큰 같은 명시적 클라우드 제공업체 자격 증명을 전달할 필요가 없게 하는 이름이 있는 일급(first-class) Snowflake 객체예요. 대신 통합 객체는 Cloud Storage 서비스 계정을 참조해요. 조직의 관리자가 Cloud Storage 계정에서 서비스 계정에 권한을 부여해요.

관리자는 또한 통합을 사용하는 외부 스테이지가 접근하는 특정 Cloud Storage 버킷 집합(및 선택적 경로)으로 사용자를 제한할 수 있어요.

참고

  • 이 섹션의 지침을 완료하려면 Cloud Storage 프로젝트에 대한 프로젝트 편집자(project editor) 액세스가 필요해요. 프로젝트 편집자가 아니라면 Cloud Storage 관리자에게 이 작업을 수행하도록 요청해요.
  • Snowflake가 스토리지가 호스팅된 Google Cloud Storage 리전을 지원하는지 확인해요. 자세한 내용은 지원되는 클라우드 리전을 참고해요.

다음 다이어그램은 Cloud Storage 스테이지의 통합 흐름을 보여줘요.

  • 외부(즉, Cloud Storage) 스테이지가 정의에서 스토리지 통합 객체를 참조해요.
  • Snowflake는 스토리지 통합을 계정을 위해 만들어진 Cloud Storage 서비스 계정과 자동으로 연결해요. Snowflake는 Snowflake 계정의 모든 GCS 스토리지 통합이 참조하는 단일 서비스 계정을 만들어요.
  • Cloud Storage 프로젝트의 프로젝트 편집자가 스테이지 정의에 참조된 버킷에 접근할 수 있도록 서비스 계정에 권한을 부여해요. 많은 외부 스테이지 객체가 서로 다른 버킷과 경로를 참조하고 같은 통합을 인증에 사용할 수 있다는 점에 주의해요.

사용자가 스테이지에서 데이터를 로드하거나 언로드할 때 Snowflake는 액세스를 허용하거나 거부하기 전에 버킷에서 서비스 계정에 부여된 권한을 검증해요.

1단계: Snowflake에서 Cloud Storage 통합 만들기

CREATE STORAGE INTEGRATION 명령으로 통합을 만들어요. 통합은 외부 클라우드 스토리지의 인증 책임을 Snowflake 생성 엔터티(즉, Cloud Storage 서비스 계정)에 위임하는 Snowflake 객체예요. Cloud Storage 버킷에 접근하기 위해 Snowflake는 데이터 파일을 저장하는 버킷에 접근 권한을 부여할 수 있는 서비스 계정을 만들어요.

단일 스토리지 통합은 여러 외부(즉, GCS) 스테이지를 지원할 수 있어요. 스테이지 정의의 URL은 STORAGE_ALLOWED_LOCATIONS 매개 변수에 지정된 GCS 버킷(및 선택적 경로)과 일치해야 해요.

참고 — 계정 관리자(ACCOUNTADMIN 역할을 가진 사용자) 또는 전역 CREATE INTEGRATION 권한이 있는 역할만 이 SQL 명령을 실행할 수 있어요.

CREATE STORAGE INTEGRATION <integration_name>
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'GCS'
  ENABLED = TRUE
  STORAGE_ALLOWED_LOCATIONS = ('gcs://<bucket>/<path>/', 'gcs://<bucket>/<path>/')
  [ STORAGE_BLOCKED_LOCATIONS = ('gcs://<bucket>/<path>/', 'gcs://<bucket>/<path>/') ]

여기서:

  • *integration_name*은 새 통합의 이름.
  • *bucket*은 데이터 파일을 저장하는 Cloud Storage 버킷의 이름(예: mybucket). 필수 STORAGE_ALLOWED_LOCATIONS 매개 변수와 선택 STORAGE_BLOCKED_LOCATIONS 매개 변수는 각각 이 통합을 참조하는 스테이지를 만들거나 수정할 때 이러한 버킷에 대한 액세스를 제한하거나 차단해요.
  • *path*는 버킷의 객체에 대한 세분화된 제어를 제공하는 데 사용할 수 있는 선택적 경로.

다음 예제는 통합을 사용하는 외부 스테이지를 명시적으로 두 버킷과 경로 중 하나만 참조하도록 제한하는 통합을 만들어요. 이후 단계에서 이 버킷과 경로 중 하나를 참조하는 외부 스테이지를 만들 거예요.

이 통합을 사용하는 추가 외부 스테이지는 허용된 버킷과 경로를 참조할 수 있어요.

CREATE STORAGE INTEGRATION gcs_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'GCS'
  ENABLED = TRUE
  STORAGE_ALLOWED_LOCATIONS = ('gcs://mybucket1/path1/', 'gcs://mybucket2/path2/')
  STORAGE_BLOCKED_LOCATIONS = ('gcs://mybucket1/path1/sensitivedata/', 'gcs://mybucket2/path2/sensitivedata/');

2단계: Snowflake 계정의 Cloud Storage 서비스 계정 검색

DESCRIBE INTEGRATION 명령을 실행해 Snowflake 계정을 위해 자동으로 만들어진 Cloud Storage 서비스 계정의 ID를 검색해요.

DESC STORAGE INTEGRATION <integration_name>;

여기서:

예를 들어:

DESC STORAGE INTEGRATION gcs_int;
+-----------------------------+---------------+-----------------------------------------------------------------------------+------------------+
| property                    | property_type | property_value                                                              | property_default |
+-----------------------------+---------------+-----------------------------------------------------------------------------+------------------+
| ENABLED                     | Boolean       | true                                                                        | false            |
| STORAGE_ALLOWED_LOCATIONS   | List          | gcs://mybucket1/path1/,gcs://mybucket2/path2/                               | []               |
| STORAGE_BLOCKED_LOCATIONS   | List          | gcs://mybucket1/path1/sensitivedata/,gcs://mybucket2/path2/sensitivedata/   | []               |
| STORAGE_GCP_SERVICE_ACCOUNT | String        | [email protected]                  |                  |
+-----------------------------+---------------+-----------------------------------------------------------------------------+------------------+

출력의 STORAGE_GCP_SERVICE_ACCOUNT 속성은 Snowflake 계정을 위해 만들어진 Cloud Storage 서비스 계정(즉, [email protected])을 보여줘요. 전체 Snowflake 계정에 대해 단일 Cloud Storage 서비스 계정을 프로비저닝해요. 모든 Cloud Storage 통합이 그 서비스 계정을 사용해요.

3단계: 버킷 객체에 접근하도록 서비스 계정에 권한 부여

다음 단계별 지침은 Google Cloud 콘솔에서 Snowflake에 대한 IAM 액세스 권한을 구성해 Cloud Storage 버킷을 사용해 데이터를 로드하고 언로드하는 방법을 설명해요.

사용자 지정 IAM 역할 만들기

버킷에 접근하고 객체를 가져오는 데 필요한 권한이 있는 사용자 지정 역할을 만들어요.

  1. 프로젝트 편집자로 Google Cloud 콘솔에 로그인해요.
  2. 홈 대시보드에서 IAM & Admin » Roles를 선택해요.
  3. Create Role을 선택해요.
  4. 사용자 지정 역할에 대한 Title과 선택적 Description을 입력해요.
  5. Add Permissions를 선택해요.
  6. 권한 목록을 필터링하고 목록에서 다음을 추가해요.
작업 필요한 권한
데이터 로드만 storage.buckets.get, storage.objects.get, storage.objects.list
제거(purge) 옵션으로 데이터 로드, 스테이지에서 REMOVE 명령 실행 storage.buckets.get, storage.objects.delete, storage.objects.get, storage.objects.list
데이터 로드 및 언로드 storage.buckets.get(데이터 전송 비용 계산용), storage.objects.create, storage.objects.delete, storage.objects.get, storage.objects.list
데이터 언로드만 storage.buckets.get, storage.objects.create, storage.objects.delete, storage.objects.list
COPY FILES를 사용해 파일을 외부 스테이지로 복사 다음 추가 권한이 필요: storage.multipartUploads.abort, storage.multipartUploads.create, storage.multipartUploads.list, storage.multipartUploads.listParts
  1. Add를 선택해요.
  2. Create를 선택해요.

Cloud Storage 서비스 계정에 사용자 지정 역할 할당

  1. 프로젝트 편집자로 Google Cloud 콘솔에 로그인해요.
  2. 홈 대시보드에서 Cloud Storage » Buckets를 선택해요.
  3. 버킷 목록을 필터링하고 스토리지 통합을 만들 때 지정한 버킷을 선택해요.
  4. Permissions » View by principals를 선택한 다음 Grant access를 선택해요.
  5. Add principals 아래에서 DESC STORAGE INTEGRATION 명령 출력에서 검색한 서비스 계정 이름을 붙여넣어요.
  6. Assign roles 아래에서 이전에 만든 사용자 지정 IAM 역할을 선택한 다음 Save를 선택해요.

중요 — Google Cloud 조직이 2024년 5월 3일 이후에 만들어졌다면, Google Cloud는 프로젝트 조직 정책에 도메인 제한 제약을 시행해요. 기본 제약은 도메인을 유일한 허용 값으로 나열해요. Snowflake 서비스 계정이 스토리지에 접근할 수 있게 하려면 도메인 제한을 업데이트해야 해요.

Cloud KMS 암호화 키에 대한 Cloud Storage 서비스 계정 권한 부여

참고 — 이 단계는 GCS 버킷이 Google Cloud Key Management Service(Cloud KMS)에 저장된 키로 암호화된 경우에만 필요해요.

  1. 프로젝트 편집자로 Google Cloud 콘솔에 로그인해요.
  2. 홈 대시보드에서 Security » Key Management를 검색해 선택해요.
  3. GCS 버킷에 할당된 키 링을 선택해요.
  4. 오른쪽 위에서 SHOW INFO PANEL을 클릭해요. 키 링의 정보 패널이 슬라이드 아웃돼요.
  5. ADD PRINCIPAL 버튼을 클릭해요.
  6. New principals 필드에서 (이 주제의) 2단계: Snowflake 계정의 Cloud Storage 서비스 계정 검색의 DESCRIBE INTEGRATION 출력에서 서비스 계정 이름을 검색해요.
  7. Select a role 드롭다운에서 Cloud KMS CrytoKey Encryptor/Decryptor 역할을 선택해요.
  8. Save 버튼을 클릭해요. 정보 패널의 Cloud KMS CrytoKey Encryptor/Decryptor 역할 드롭다운에 서비스 계정 이름이 추가돼요.

참고 — SYSTEM$VALIDATE_STORAGE_INTEGRATION 함수를 사용해 스토리지 통합의 구성을 검증할 수 있어요.

4단계: 외부 스테이지 만들기

만든 통합을 참조하는 외부 스테이지를 만들어요.

참고

  • 데이터베이스와 스키마에 USAGE 권한이 부여되거나 상속된 역할과 스키마에 CREATE STAGE 권한이 있는 역할을 사용해야 해요. 스테이지 소유자(즉, 스테이지에 OWNERSHIP 권한이 있는 역할)도 스토리지 통합에 USAGE 권한이 있어야 해요. CREATE STAGE의 액세스 제어 요구 사항을 참고해요.
  • 통합을 사용하는 스테이지에서 데이터를 로드하거나 언로드하려면 역할이 스테이지에 USAGE 권한이 있어야 해요. 스토리지 통합에 USAGE 권한도 가질 필요는 없어요.
  • Snowflake는 Amazon S3와 Google Cloud Storage에 업로드할 때 멀티파트 업로드를 사용해요. 이 과정은 외부 스테이지의 스토리지 위치에 완료되지 않은 업로드를 남길 수 있어요. 완료되지 않은 업로드가 쌓이지 않도록 수명 주기 규칙을 설정할 것을 권장해요. 지침은 Amazon S3 또는 Google Cloud Storage 문서를 참고해요.

SQL로 외부 스테이지 만들기

스토리지 통합을 사용하는 스테이지를 만들기 위해 필요할 권한이 현재 역할에 부여되거나 상속되었는지 확인해요. 예를 들어:

GRANT USAGE ON DATABASE mydb TO ROLE myrole;
GRANT USAGE ON SCHEMA mydb.stages TO ROLE myrole;
GRANT CREATE STAGE ON SCHEMA mydb.stages TO ROLE myrole;
GRANT USAGE ON INTEGRATION gcs_int TO ROLE myrole;

CREATE STAGE 명령을 사용해 외부 스테이지를 만들 수 있어요.

예제 1:

이 예제에서 mydb.stages를 사용자 세션의 현재 데이터베이스와 스키마로 설정한 다음 my_gcs_stage라는 스테이지를 만들어요. 이 예제에서 스테이지는 통합이 지원하는 Cloud Storage 버킷과 경로 mybucket1/path1을 참조해요. 스테이지는 또한 my_csv_format이라는 이름이 있는 파일 형식 객체를 참조해요.

USE SCHEMA mydb.stages;

CREATE STAGE my_gcs_stage
  URL = 'gcs://mybucket1/path1'
  STORAGE_INTEGRATION = gcs_int
  FILE_FORMAT = my_csv_format;

예제 2:

이 예제에서 고객 관리 키(CMK)를 사용해 Google Cloud Storage에 연결해요.

USE SCHEMA mydb.stages;

CREATE STAGE my_ext_stage2
  URL='gcs://load/encrypted_files/'
  STORAGE_INTEGRATION = gcs_int
  ENCRYPTION=(TYPE = 'GCS_SSE_KMS' KMS_KEY_ID = '{a1b2c3}');
  FILE_FORMAT = my_csv_format;

참고

  • URL 값에 슬래시(/)를 추가해 지정된 폴더 경로로 필터링해요. 슬래시를 생략하면 지정된 경로의 접두사로 시작하는 모든 파일과 폴더가 포함돼요. 스테이지의 비정형 데이터 파일에 접근하고 검색하려면 슬래시가 필요하다는 점에 주의해요.
  • STORAGE_INTEGRATION 매개 변수는 FILE_FORMAT 같은 다른 스테이지 매개 변수와 별도로 처리돼요. 이러한 다른 매개 변수에 대한 지원은 GCS 버킷에 접근하는 데 사용되는 통합과 관계없이 동일해요.

Python으로 외부 스테이지 만들기

Snowflake Python API의 StageCollection.create 메서드를 사용해 외부 스테이지를 만들어요.

앞의 SQL 예제와 유사하게, 다음 Python 예제는 mydb 데이터베이스와 stages 스키마에 my_gcs_stage라는 외부 스테이지를 만들어요.

from snowflake.core.stage import Stage

my_stage = Stage(
  name="my_gcs_stage",
    storage_integration="gcs_int",
    url="gcs://mybucket1/path1"
)
root.databases["mydb"].schemas["stages"].stages.create(my_stage)

참고 — Python API는 현재 CREATE STAGE SQL 명령의 FILE_FORMAT 매개 변수를 지원하지 않아요.

Snowsight로 외부 스테이지 만들기

Snowsight로 이름이 있는 외부 스테이지를 만들려면 다음을 수행해요.

  1. Snowsight에 로그인해요.
  2. 탐색 메뉴에서 Catalog » Explorer를 선택해요.
  3. 스테이지를 만들 데이터베이스와 스키마를 선택해요.
  4. Create » Stage를 선택해요.
  5. Google Cloud Platform을 선택해요.
  6. Stage Name을 입력해요.
  7. Google Cloud Storage 버킷의 URL을 입력해요.
  8. Enable Directory Table이 기본적으로 선택되어 있다는 점에 주의해요. 이렇게 하면 스테이지의 파일을 볼 수 있지만 웨어하우스가 필요하므로 비용이 발생해요. 지금은 이 옵션을 선택 해제하고 나중에 디렉터리 테이블을 활성화할 수 있어요.
  9. Authentication을 활성화해요.
  10. 메뉴에서 스토리지 통합을 선택해요.
  11. 선택적으로 SQL Preview를 펼쳐 생성된 SQL 문을 확인해요. AUTO_REFRESH 같은 스테이지의 추가 옵션을 지정하려면 이 SQL 미리 보기를 워크시트에서 열 수 있어요.
  12. Create를 선택해요.

기존 스테이지를 스토리지 통합을 사용하도록 편집

SQL 또는 웹 인터페이스를 사용해 기존 외부 스테이지 구성을 스토리지 통합을 사용하도록 편집할 수 있어요.

참고

  • 스테이지의 인증 또는 암호화 설정을 비활성화할 수 없어요.
  • 스테이지를 인증에 스토리지 통합을 사용하도록 업데이트할 수 있어요. 그러나 스테이지가 이미 스토리지 통합을 사용한다면 인증 유형을 자격 증명으로 변경할 수 없어요. 인증 유형을 변경하려면 스테이지를 삭제하고 다시 만들 수 있어요.

SQL로 스테이지 편집

ALTER STAGE를 사용해 스테이지를 수정해요. 예를 들어:

ALTER STAGE my_gcs_stage
  SET STORAGE_INTEGRATION = gcs_int;

Snowsight로 스테이지 편집

  1. Snowsight에 로그인해요.
  2. 탐색 메뉴에서 Catalog » Explorer를 선택해요.
  3. 편집할 스테이지를 선택해요.
  4. ⋯(ellipsis) » Edit을 선택해요.
  5. 스테이지에 원하는 변경을 수행해요.
  6. Save를 선택해요.

더 알아보기