데이터를 로드하기 위해 Azure 컨테이너 구성하기

이 항목에서는 Microsoft Azure 컨테이너에 저장된 데이터 파일에 대한 보안 액세스를 구성하는 방법에 대해 설명합니다.

지원되는 옵션은 다음과 같습니다.

옵션 1

외부 클라우드 저장소에 대한 인증 책임을 Azure 서비스 주체에게 위임하도록 저장소 통합 오브젝트를 구성합니다. 서비스 주체는 Snowflake와 같은 서비스와 함께 사용하여 Azure 리소스에 액세스하기 위해 생성된 ID입니다.

참고

  • 스테이지를 생성하거나 데이터를 로드할 때 SAS 토큰을 제공할 필요가 없으므로 이 옵션을 사용하는 것이 매우 좋습니다.

  • 저장소 통합을 사용하여 정부 리전 의 Azure blob 저장소에 액세스하는 것은 동일한 정부 리전의 Azure에 호스팅된 Snowflake 계정으로 제한됩니다. 직접 자격 증명을 사용하여 정부 리전 외부에 호스팅된 계정에서 blob 저장소에 액세스하는 기능이 지원됩니다.

옵션 2

공유 액세스 서명(SAS) 토큰을 생성하여 Snowflake에게 저장소 계정의 오브젝트에 대한 제한된 액세스 권한을 부여합니다. 그리고 SAS 토큰을 사용하여 컨테이너를 참조하는 외부(Azure) 스테이지에 액세스할 수 있습니다.

참고

이 항목의 지침을 완료하려면 Azure에 대한 관리 액세스 권한이 필요합니다. Azure 관리자가 아닌 경우 Azure 관리자에게 이러한 작업을 수행하도록 요청하십시오.

이 항목의 내용:

옵션 1: Snowflake 저장소 통합 구성하기

이 섹션에서는 Snowflake가 외부(Azure) 스테이지에서 참조하는 Azure 컨테이너에서 데이터를 읽고 쓸 수 있도록 저장소 통합을 사용하는 방법을 설명합니다. 통합은 시크릿 키 또는 액세스 토큰과 같은 명시적 클라우드 공급자 자격 증명을 전달할 필요가 없는 명명된 일급 Snowflake 오브젝트입니다. 통합 오브젝트는 앱 등록 이라고 하는 Azure ID 및 액세스 관리(IAM) 사용자 ID를 저장합니다. 조직의 관리자는 Azure 계정에서 이 앱에 필요한 권한을 부여합니다.

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

참고

이 섹션의 지침을 완료하려면 Azure에서 저장소 계정을 관리할 수 있는 권한이 필요합니다. Azure 관리자가 아닌 경우 Azure 관리자에게 이러한 작업을 수행하도록 요청하십시오.

이 섹션의 내용:

1단계: Snowflake에서 클라우드 저장소 통합 만들기

CREATE STORAGE INTEGRATION 명령을 사용하여 저장소 통합을 생성합니다. 저장소 통합은 허용되거나 차단된 저장소 위치(즉, 컨테이너)의 선택적 세트과 함께 Azure 클라우드 저장소에 대해 생성된 서비스 주체를 저장하는 Snowflake 오브젝트입니다. 조직의 클라우드 공급자 관리자는 생성된 서비스 주체에게 저장소 위치에 대한 권한을 부여합니다. 이 옵션을 사용하면 사용자가 스테이지를 생성하거나 데이터를 로드할 때 자격 증명을 제공하지 않아도 됩니다.

단일 저장소 통합은 여러 외부(즉, Azure) 스테이지를 지원할 수 있습니다. 스테이지 정의의 URL은 STORAGE_ALLOWED_LOCATIONS 매개 변수에 대해 지정된 Azure 컨테이너(및 선택적 경로)와 일치해야 합니다.

참고

계정 관리자(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>/') ]
Copy

여기서:

  • integration_name 은 새 통합의 이름입니다.

  • tenant_id 는 허용 및 차단된 저장소 계정이 속한 Office 365 테넌트의 ID입니다. 저장소 통합은 하나의 tenant에만 인증할 수 있으므로, 허용 및 차단된 저장소 위치는 모두 이 tenant에 속하는 저장소 계정을 참조해야 합니다.

    Tenant ID를 찾으려면 Azure 포털에 로그인하여 Azure Active Directory » Properties 를 클릭하십시오. tenant 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/');
Copy

2단계: 저장소 위치에 Snowflake 액세스 권한 부여

  1. DESCRIBE INTEGRATION 명령을 실행하여 동의 URL을 검색합니다.

    DESC STORAGE INTEGRATION <integration_name>;
    
    Copy

    여기서:

다음 열의 값을 참고하십시오.

AZURE_CONSENT_URL

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

AZURE_MULTI_TENANT_APP_NAME

계정에 대해 생성된 Snowflake 클라이언트 애플리케이션의 이름입니다. 이 섹션의 이후 단계에서는 허용되는 저장소 위치에 대한 액세스 토큰을 획득하기 위해 필요한 권한을 이 애플리케이션에 부여해야 합니다.

  1. 웹 브라우저에서 AZURE_CONSENT_URL 열의 URL로 이동합니다. 페이지에 Microsoft 권한 요청 페이지가 표시됩니다.

  2. Accept 버튼을 클릭합니다. 이 작업을 통해 Snowflake 계정에 대해 생성된 Azure 서비스 주체에게 tenant 내부의 지정된 리소스에 대한 액세스 토큰이 부여됩니다. 액세스 토큰은 서비스 주체에 컨테이너에 대한 적절한 권한을 부여한 경우에만 획득이 가능합니다(다음 단계 참조).

    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 출력(1단계)에서 AZURE_MULTI_TENANT_APP_NAME 속성의 ID입니다. AZURE_MULTI_TENANT_APP_NAME 속성에서 밑줄 앞의 문자열을 검색합니다.

    중요

    • Azure에서 이 섹션의 Microsoft 요청 페이지를 통해 요청한 Snowflake 서비스 주체를 생성하기 위해서는 1시간이 이상 걸릴 수 있습니다. 서비스 주체를 즉시 사용할 수 없는 경우 1~2시간 기다린 후 다시 검색하는 것이 좋습니다.

    • 서비스 주체를 삭제하면 저장소 통합이 작동을 중지합니다.

    Add role assignment in Azure Storage Console
  8. Review + assign 버튼을 클릭합니다.

    참고

    • Microsoft Azure 설명서에 따르면 역할 할당을 전파하기 위해서는 최대 5분이 걸릴 수 있습니다.

    • Snowflake는 어떤 기간 동안(60분의 만료 시간을 초과할 수는 없음) 임시 자격 증명을 캐시합니다. Snowflake에서 액세스를 취소하면 캐시가 만료될 때까지 사용자가 파일을 나열하고 클라우드 저장소 위치에서 데이터를 로딩할 수 있습니다.

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

이 항목의 1단계: Snowflake에서 클라우드 저장소 만들기 에서 생성한 저장소 통합을 참조하는 외부(Azure) 스테이지를 생성합니다.

참고

  • 저장소 통합을 사용하는 스테이지를 생성하려면 스키마에 대한 CREATE STAGE 권한과 통합에 대한 USAGE 권한이 있는 역할이 필요합니다. 예:

    GRANT CREATE STAGE ON SCHEMA public TO ROLE myrole;
    
    GRANT USAGE ON INTEGRATION azure_int TO ROLE myrole;
    
    Copy
  • 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;
Copy

참고

  • 스테이지 소유자(즉, 스테이지에서 OWNERSHIP 권한 역할)는 저장소 통합에 대한 USAGE 권한이 있어야 합니다.

  • 통합을 사용하는 스테이지에서 데이터를 로드하거나 언로드하려면 역할에 해당 스테이지에 대한 USAGE 권한이 있어야 합니다. 저장소 통합에 대한 USAGE 권한도 가질 필요는 없습니다.

  • Data Lake Storage Gen2를 포함하여, 지원되는 모든 타입의 Azure blob 저장소 계정에 대해 blob.core.windows.net 엔드포인트를 사용합니다.

  • STORAGE_INTEGRATION 매개 변수는 FILE_FORMAT과 같은 다른 스테이지 매개 변수와 별도로 처리됩니다. 이러한 다른 매개 변수는 Azure 컨테이너에 액세스하기 위해 사용하는 통합에 관계없이 동일하게 지원됩니다.

옵션 2: SAS 토큰 생성

1단계: SAS 토큰 생성

다음 단계별 지침은 SAS 토큰을 생성하여 Snowflake에게 저장소 계정의 오브젝트에 제한된 액세스 권한을 부여하는 방법을 설명합니다.

  1. Azure 포털에 로그인합니다.

  2. 홈 대시보드에서 Storage Accounts » <저장소_계정> 을 선택합니다. Security + networking 에서 Shared access signature 를 선택합니다.

    Storage Account Details in Azure Storage Console
  3. 다음과 같은 허용되는 서비스 를 선택합니다.

    • Blob

  4. 다음과 같은 허용되는 리소스 타입 을 선택합니다.

    • Container (저장소 계정에 오브젝트를 나열하기 위해 필요)

    • Object (저장소 계정에서/으로 오브젝트 읽기/쓰기에 필요)

  5. Azure 리소스에서 데이터 파일을 로드하려면 다음과 같은 허용되는 권한을 선택합니다.

    • 읽기

    • 목록

    Write, AddCreate 권한은 파일을 컨테이너로 언로드하는 경우에도 필요합니다. 또한 PURGE = TRUE 옵션을 사용하기 위해서는 Permanent Delete 권한이 필요합니다.

  6. SAS 토큰의 시작 및 만료 날짜/시간을 지정합니다. 일반 보안 수단의 일환으로 사용하기 위해 주기적으로 다른 SAS 토큰을 생성할 수 있습니다.

  7. 허용되는 IP 주소 필드를 비워두고 Allowed protocols 아래에 HTTPS only 또는 HTTPS and HTTP 를 지정합니다.

    Shared Access Signature Details in Azure Storage Console
  8. Generate SAS and connection string 버튼을 클릭합니다. ? 로 시작하고 이를 포함하는 전체 값을 SAS token 필드에 기록합니다. 이 토큰이 SAS 토큰입니다. 외부 스테이지를 생성할 때 이 토큰을 지정합니다.

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

이 항목의 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;
Copy

이 예에서 사용하는 AZURE_SAS_TOKEN 및 MASTER_KEY 값은 설명 목적으로만 제공됩니다.

참고

스테이지에 대해 명명된 파일 형식 오브젝트(또는 개별 파일 형식 옵션)를 지정하면 나중에 스테이지에서 데이터를 로드하는 데 사용되는 COPY 명령에 동일한 파일 형식 옵션을 지정할 필요가 없습니다. 파일 형식 오브젝트 및 옵션에 대한 자세한 내용은 CREATE FILE FORMAT 을 참조하십시오.

데이터 파일 암호화

저장소 계정에서 직접 미사용 데이터에 대해 Azure 저장소 서비스 암호화(SSE)를 활성화하면 Snowflake에서 올바르게 처리됩니다. 자세한 내용은 SSE에 대한 Azure 설명서 를 참조하십시오.

또한, Snowflake는 Azure 컨테이너에서 스테이징된 파일의 암호를 해독하기 위해 클라이언트 쪽 암호화를 지원합니다.

  • 클라이언트 측 암호화:

    • AZURE_CSE: MASTER_KEY 값이 필요합니다. 자세한 내용은 Microsoft Azure 설명서에서 클라이언트 측 암호화 정보 를 참조하십시오.

      참고

      Block blobappend blob 는 클라이언트 측 암호화를 지원하지만 page blob 는 지원하지 않습니다.

다음 항목: Azure 스테이지 만들기