Configure an Azure container for loading data

Configure an Azure container for loading data (데이터 로드용 Azure 컨테이너 구성)

Microsoft Azure 컨테이너에 저장된 데이터 파일에 대한 안전한 접근을 구성해요. Snowflake는 다음 옵션을 지원해요.

출처: Snowflake Documentation

본문

옵션 1:

저장 통합 객체를 구성해 외부 클라우드 저장소에 대한 인증 책임을 Azure 서비스 주체로 위임해요. 서비스 주체는 Snowflake 같은 서비스가 Azure 리소스에 접근하는 데 사용하도록 만들어진 신원이에요.

이 옵션은 Azure 저장소의 여러 리소스에 대한 여러 사용자의 접근을 관리하기 더 쉽게 해줘요. 저장 통합은 시크릿을 저장하므로 외부 스테이지를 만들 때마다 SAS 토큰을 제공할 필요가 없어요.

Note

  • 정부 리전의 Azure blob 저장소에 저장 통합을 사용해 접근하는 것은 같은 정부 리전의 Azure에 호스팅된 Snowflake 계정으로 제한돼요. 정부 리전 밖에 호스팅된 계정에서 직접 자격 증명을 사용해 blob 저장소에 접근하는 것은 지원돼요.
  • Snowflake가 저장소가 호스팅된 Azure 리전을 지원하는지 확인해요. 자세한 내용은 지원 클라우드 리전을 참고해요.

옵션 2:

공유 액세스 서명(SAS) 토큰을 생성해 Snowflake에 저장소 계정의 객체에 대한 제한된 접근을 부여해요. 그런 다음 SAS 토큰을 사용해 컨테이너를 참조하는 외부(Azure) 스테이지에 접근할 수 있어요.

Note

  • OneLake URL 형식은 CREATE STAGE를 참고해요.
  • 이 주제의 지침을 완료하려면 Azure 관리자 접근이 필요해요. Azure 관리자가 아니라면 Azure 관리자에게 이 작업을 수행하도록 요청해요.
  • Azure 외부 스테이지의 쿼리 성능을 개선하려면 Microsoft 네트워크 라우팅을 사용하도록 네트워크 라우팅을 구성해요. 지침은 Azure 문서를 참고해요.

옵션 1: Snowflake 저장 통합 구성

이 섹션은 저장 통합을 사용해 Snowflake가 외부(Azure) 스테이지에서 참조되는 Azure 컨테이너에서 데이터를 읽고 쓰게 하는 방법을 설명해요. 통합은 시크릿 키나 접근 토큰 같은 명시적 클라우드 공급자 자격 증명을 전달할 필요가 없게 하는 명명된 일급(first-class) Snowflake 객체예요. 통합 객체는 앱 등록(app registration) 이라고 하는 Azure 신원 및 접근 관리(IAM) 사용자 ID를 저장해요. 조직의 관리자가 Azure 계정에서 이 앱에 필요한 권한을 부여해요.

통합은 또한 사용자가 통합을 사용하는 외부 스테이지를 만들 때 지정할 수 있는 위치를 제한하는 컨테이너(및 선택적 경로)를 지정해야 해요.

Note

이 섹션의 지침을 완료하려면 저장소 계정을 관리할 Azure 권한이 필요해요. Azure 관리자가 아니라면 Azure 관리자에게 이 작업을 수행하도록 요청해요.

Step 1: Snowflake에서 클라우드 저장 통합 생성

CREATE STORAGE INTEGRATION 명령으로 저장 통합을 만들어요. 저장 통합은 Azure 클라우드 저장소용으로 생성된 서비스 주체와 함께 선택적 허용·차단 저장 위치(즉, 컨테이너) 집합을 저장하는 Snowflake 객체예요. 조직의 클라우드 공급자 관리자가 저장 위치에 대한 권한을 생성된 서비스 주체에 부여해요. 이 옵션은 사용자가 스테이지를 만들거나 데이터를 로드할 때 자격 증명을 제공하지 않게 해줘요.

단일 저장 통합은 여러 외부(즉, Azure) 스테이지를 지원할 수 있어요. 스테이지 정의의 URL은 STORAGE_ALLOWED_LOCATIONS 파라미터에 지정된 Azure 컨테이너(및 선택적 경로)와 일치해야 해요.

Note

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

CREATE STORAGE INTEGRATION <integration_name>
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'AZURE'
  ENABLED = TRUE
  AZURE_TENANT_ID = '<tenant_id>'
  STORAGE_ALLOWED_LOCATIONS = ('azure://<account>.blob.core.windows.net/<container>/<path>/', 'azure://<account>.blob.core.windows.net/<container>/<path>/')
  [ STORAGE_BLOCKED_LOCATIONS = ('azure://<account>.blob.core.windows.net/<container>/<path>/', 'azure://<account>.blob.core.windows.net/<container>/<path>/') ]

여기서:

  • *integration_name*은 새 통합의 이름이에요.
  • *tenant_id*는 허용·차단 저장소 계정이 속한 Office 365 테넌트의 ID예요. 저장 통합은 하나의 테넌트에만 인증할 수 있으므로 허용·차단 저장 위치는 모두 이 테넌트에 속한 저장소 계정을 가리켜야 해요.

테넌트 ID를 찾으려면 Azure 포털에 로그인하고 Azure Active Directory » Properties를 클릭해요. 테넌트 ID는 Tenant ID 필드에 표시돼요.

  • *container*는 데이터 파일을 저장하는 Azure 컨테이너의 이름(예: mycontainer)이에요. STORAGE_ALLOWED_LOCATIONS와 STORAGE_BLOCKED_LOCATIONS 파라미터는 이 통합을 참조하는 스테이지가 생성되거나 수정될 때 각각 이러한 컨테이너에 대한 접근을 허용하거나 차단해요.
  • *path*는 컨테이너의 논리적 디렉터리에 대한 세밀한 제어를 제공하는 데 사용할 수 있는 선택적 경로예요.

다음 예는 이 통합을 사용하는 외부 스테이지를 두 컨테이너·경로 중 하나만 참조하도록 명시적으로 제한하는 통합을 만들어요. 이후 단계에서 이러한 컨테이너·경로 중 하나를 참조하는 외부 스테이지를 만들 거예요. 이 통합을 사용하는 여러 외부 스테이지가 허용된 컨테이너·경로를 참조할 수 있어요:

CREATE STORAGE INTEGRATION azure_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'AZURE'
  ENABLED = TRUE
  AZURE_TENANT_ID = 'a123b4c5-1234-123a-a12b-1a23b45678c9'
  STORAGE_ALLOWED_LOCATIONS = ('azure://myaccount.blob.core.windows.net/mycontainer1/mypath1/', 'azure://myaccount.blob.core.windows.net/mycontainer2/mypath2/')
  STORAGE_BLOCKED_LOCATIONS = ('azure://myaccount.blob.core.windows.net/mycontainer1/mypath1/sensitivedata/', 'azure://myaccount.blob.core.windows.net/mycontainer2/mypath2/sensitivedata/');

Step 2: Snowflake에 저장 위치 접근 부여

  1. DESCRIBE INTEGRATION 명령을 실행해 동의 URL을 검색해요:
DESC STORAGE INTEGRATION <integration_name>;

여기서:

다음 컬럼의 값을 기록해요.

AZURE_CONSENT_URL:

Microsoft 권한 요청 페이지에 대한 URL.

AZURE_MULTI_TENANT_APP_NAME:

계정용으로 만들어진 Snowflake 클라이언트 애플리케이션의 이름. 이 섹션의 이후 단계에서 이 애플리케이션에 허용된 저장 위치에서 접근 토큰을 얻는 데 필요한 권한을 부여해야 해요.

  1. 웹 브라우저에서 AZURE_CONSENT_URL 컬럼의 URL로 이동해요. 페이지에 Microsoft 권한 요청 페이지가 표시돼요.
  2. Accept 버튼을 클릭해요. 이 작업은 Snowflake 계정용으로 만들어진 Azure 서비스 주체가 테넌트 내 지정된 리소스에 대한 접근 토큰을 부여받게 해요. 접근 토큰 획득은 컨테이너에 서비스 주체에게 적절한 권한을 부여한 경우에만 성공해요(다음 단계 참고). Microsoft 권한 요청 페이지는 Snowflake 기업 사이트(snowflake.com)로 리디렉션해요.
  3. Microsoft Azure 포털에 로그인해요.
  4. Azure Services » Storage Accounts로 이동해요. Snowflake 서비스 주체에 접근을 부여하는 저장소 계정의 이름을 클릭해요.
  5. Access Control (IAM) » Add role assignment을 클릭해요.
  6. Snowflake 서비스 주체에 부여할 원하는 역할을 선택해요.
    • Storage Blob Data Reader는 읽기 접근만 부여해요. 저장소 계정에 스테이징된 파일에서 데이터를 로드할 수 있게 해요.
    • Storage Blob Data Contributor는 읽기·쓰기 접근을 부여해요. 저장소 계정에 스테이징된 파일에서 데이터를 로드하거나 그 파일로 데이터를 언로드할 수 있게 해요. 또한 REMOVE 명령을 실행해 저장소 계정에 스테이징된 파일을 제거할 수도 있게 해요.
  7. Snowflake 서비스 주체를 검색해요. 이것은 DESC STORAGE INTEGRATION 출력(Step 1에서)의 AZURE_MULTI_TENANT_APP_NAME 속성의 신원이에요. AZURE_MULTI_TENANT_APP_NAME 속성에서 밑줄 앞의 문자열을 검색해요.

Important

  • Azure가 이 섹션의 Microsoft 요청 페이지를 통해 요청된 Snowflake 서비스 주체를 만드는 데 한 시간 이상 걸릴 수 있어요. 서비스 주체를 즉시 사용할 수 없으면 한두 시간 기다렸다가 다시 검색할 것을 권장해요.
  • 서비스 주체를 삭제하면 저장 통합이 작동을 멈춰요.
  1. Review + assign 버튼을 클릭해요.

Note

  • Microsoft Azure 문서에 따르면 역할 할당은 전파에 최대 5분이 걸릴 수 있어요.
  • Snowflake는 임시 자격 증명을 60분 만료 시간을 초과할 수 없는 기간 동안 캐시해요. Snowflake에서 접근을 회수하면 캐시가 만료될 때까지 사용자가 클라우드 저장 위치의 파일을 나열하고 데이터를 로드할 수 있을 수 있어요.

Note

SYSTEM$VALIDATE_STORAGE_INTEGRATION 함수를 사용해 저장 통합 구성을 검증할 수 있어요.

Step 3: 외부 스테이지 생성

Step 1: Snowflake에서 클라우드 저장 통합 생성에서 만든 저장 통합을 참조하는 외부(Azure) 스테이지를 만들어요.

Note

  • 저장 통합을 사용하는 스테이지를 만들려면 스키마에 대한 CREATE STAGE 권한과 통합에 대한 USAGE 권한이 있는 역할이 필요해요. 예:
GRANT CREATE STAGE ON SCHEMA public TO ROLE myrole;

GRANT USAGE ON INTEGRATION azure_int TO ROLE myrole;
  • CREATE STAGE 문에서 저장 통합을 참조하려면 역할이 저장 통합 객체에 대한 USAGE 권한이 있어야 해요.
  • URL 값에 슬래시(/)를 추가해 지정된 폴더 경로로 필터링해요. 슬래시를 생략하면 지정된 경로의 프리픽스로 시작하는 모든 파일과 폴더가 포함돼요.
  • 슬래시는 스테이지의 비정형 데이터 파일에 접근하고 검색하는 데 필요하다는 점을 주목해요.

CREATE STAGE 명령으로 스테이지를 만들어요.

예를 들어 mydb.public을 사용자 세션의 현재 데이터베이스·스키마로 설정한 다음 my_azure_stage라는 스테이지를 만들어요. 이 예에서 스테이지는 통합이 지원하는 Azure 컨테이너·경로 mycontainer1/path1을 참조해요. 스테이지는 my_csv_format이라는 명명된 파일 형식 객체도 참조해요:

USE SCHEMA mydb.public;

CREATE STAGE my_azure_stage
  STORAGE_INTEGRATION = azure_int
  URL = 'azure://myaccount.blob.core.windows.net/container1/path1'
  FILE_FORMAT = my_csv_format;

Note

  • 스테이지 소유자(즉, 스테이지에 대한 OWNERSHIP 권한이 있는 역할)는 저장 통합에 대한 USAGE 권한이 있어야 해요.
  • 통합을 사용하는 스테이지에서 데이터를 로드하거나 언로드하려면 역할이 스테이지에 대한 USAGE 권한이 있어야 해요. 저장 통합에 대한 USAGE 권한도 가질 필요는 없어요.
  • Data Lake Storage Gen2를 포함한 모든 지원 유형의 Azure blob 저장소 계정에 대해 blob.core.windows.net 엔드포인트를 사용해요.
  • STORAGE_INTEGRATION 파라미터는 FILE_FORMAT 같은 다른 스테이지 파라미터와 별도로 처리돼요. 다른 파라미터에 대한 지원은 Azure 컨테이너 접근에 사용되는 통합과 관계없이 동일해요.

옵션 2: SAS 토큰 생성

Step 1: SAS 토큰 생성

다음 단계별 지침은 Snowflake에 저장소 계정의 객체에 대한 제한된 접근을 부여하는 SAS 토큰을 생성하는 방법을 설명해요.

  1. Azure 포털에 로그인해요.
  2. 홈 대시보드에서 Storage Accounts » *<storage_account>*를 선택해요. Security + networking 아래에서 Shared access signature를 선택해요.
  3. 다음 Allowed services를 선택해요.
    • Blob
  4. 다음 Allowed resource types를 선택해요.
    • Container(저장소 계정의 객체를 나열하는 데 필요)
    • Object(저장소 계정에서 객체를 읽고/쓰는 데 필요)
  5. Azure 리소스에서 데이터 파일을 로드하려면 다음 허용 권한을 선택해요.
    • Read
    • List Write, Add, Create 권한은 컨테이너에 파일을 언로드할 계획이라면 필요해요. 또한 PURGE = TRUE 옵션을 사용하려면 Permanent Delete 권한이 필요해요.
  6. SAS 토큰의 시작·만료 날짜/시간을 지정해요. 일반 보안 계획의 일부로 주기적으로 다른 SAS 토큰을 생성할 수 있어요.
  7. Allowed IP addresses 필드는 비워 두고, Allowed protocols 아래에서 HTTPS only 또는 HTTPS and HTTP를 지정해요.
  8. Generate SAS and connection string 버튼을 클릭해요. SAS token 필드의 전체 값을 ?로 시작하고 포함해 기록해요. 이것이 SAS 토큰이에요. 외부 스테이지를 만들 때 이 토큰을 지정해요.

Step 2: 외부 스테이지 생성

Step 1: SAS 토큰 생성에서 생성한 SAS 토큰을 참조하는 외부(Azure) 스테이지를 만들어요.

다음 예는 SQL로 Azure 자격 증명과 마스터 암호화 키를 포함하는 my_azure_stage라는 외부 스테이지를 만들어요. 스테이지 URL은 Azure myaccount 계정을 참조해요. 데이터 파일은 mycontainer 컨테이너와 /load/files 경로에 저장돼요. 스테이지는 my_csv_format이라는 명명된 파일 형식 객체를 참조해요. 예는 MASTER_KEY 값을 잘라냈다는 점을 주목해요:

CREATE OR REPLACE STAGE my_azure_stage
  URL='azure://myaccount.blob.core.windows.net/mycontainer/load/files'
  CREDENTIALS=(AZURE_SAS_TOKEN='?sv=2016-05-31&ss=b&srt=sco&sp=rwdl&se=2018-06-27T10:05:50Z&st=2017-06-27T02:05:50Z&spr=https,http&sig=bgqQwoXwxzuD2GJfagRg7VOS8hzNr3QLT7rhS8OFRLQ%3D')
  ENCRYPTION=(TYPE='AZURE_CSE' MASTER_KEY = 'kPx...')
  FILE_FORMAT = my_csv_format;

이 예에 사용된 AZURE_SAS_TOKEN과 MASTER_KEY 값은 설명 목적일 뿐이라는 점을 주목해요.

Note

스테이지에 명명된 파일 형식 객체(또는 개별 파일 형식 옵션)를 지정하면 스테이지에서 데이터를 로드하는 데 사용되는 COPY 명령에 나중에 같은 파일 형식 옵션을 지정할 필요가 없어요. 파일 형식 객체 및 옵션에 대한 자세한 내용은 CREATE FILE FORMAT을 참고해요.

데이터 파일 암호화

저장소 계정에서 정지 상태 데이터에 대한 Azure Storage 서비스 암호화(SSE)를 직접 활성화하면 Snowflake가 올바르게 처리해요. 자세한 내용은 Azure의 SSE 문서를 참고해요.

또한 Snowflake는 Azure 컨테이너에 스테이징된 파일을 복호화하는 클라이언트 측 암호화를 지원해요.

Note

블록 blob과 추가 blob은 클라이언트 측 암호화를 지원하지만 페이지 blob은 지원하지 않아요.

다음: Azure 스테이지 생성

더 알아보기 (Learn more)