Amazon S3용 Snowpipe 자동화하기¶
이 항목에서는 S3 버킷에 대한 Amazon SQS(Simple Queue Service) 알림을 사용하여 Snowpipe 데이터 로드를 자동으로 트리거하는 지침을 제공합니다.
비용, 이벤트 노이즈, 지연 시간을 줄이기 위해 Snowpipe에 대해 지원되는 이벤트만 보내는 것이 좋습니다.
이 항목의 내용:
클라우드 플랫폼 지원¶
S3 이벤트 메시지를 사용하여 자동화된 Snowpipe 데이터 로드를 트리거하는 기능은 지원되는 모든 클라우드 플랫폼 에서 호스팅되는 Snowflake 계정에서 지원됩니다.
네트워크 트래픽¶
Virtual Private Snowflake(VPS) 및 AWS PrivateLink 고객 참고 사항:
Amazon SQS 알림을 사용한 Snowpipe 자동화는 원활하게 작동합니다. 그러나 VPC(VPS 포함) 내의 AWS 클라우드 저장소가 자체 메시징 서비스(Amazon SQS, Amazon Simple Notification Service)와 통신할 수 있지만, 이 트래픽은 VPC 외부의 Amazon 보안 네트워크에 있는 서버 사이에서 이동하므로 이 트래픽은 VPC에 의해 보호되지 않습니다.
클라우드 저장소에 대한 보안 액세스 구성하기¶
참고
데이터 파일을 저장하는 S3 버킷에 대한 보안 액세스를 이미 구성한 경우에는 이 섹션을 건너뛸 수 있습니다.
이 섹션에서는 Snowflake가 외부(즉, S3) 스테이지에서 참조하는 Amazon S3 버킷에서 데이터를 읽고 쓸 수 있도록 저장소 통합을 사용하는 방법을 설명합니다. 통합은 시크릿 키 또는 액세스 토큰과 같은 명시적 클라우드 공급자 자격 증명을 전달할 필요가 없는 명명된 일급 Snowflake 오브젝트입니다. 통합 오브젝트는 AWS ID 및 액세스 관리(IAM) 사용자 ID를 저장합니다. 조직의 관리자가 AWS 계정에서 통합 IAM 사용자 권한을 부여합니다.
통합은 통합을 사용하는 외부 스테이지를 생성할 때 사용자가 지정할 수 있는 위치를 제한하는 버킷(및 선택적 경로)을 나열할 수도 있습니다.
참고
이 섹션의 지침을 완료하려면 AWS에서 IAM 정책 및 역할을 생성 및 관리할 수 있는 권한이 필요합니다. AWS 관리자가 아닌 경우 AWS 관리자에게 이러한 작업을 수행하도록 요청하십시오.
현재, 저장소 통합을 사용하여 정부 리전 의 S3 저장소에 액세스하는 것은 동일한 정부 리전의 AWS에 호스팅된 Snowflake 계정으로 제한됩니다. 직접 자격 증명을 사용하여 정부 리전 외부에 호스팅된 계정에서 S3 저장소에 액세스하는 기능이 지원됩니다.
다음 다이어그램은 S3 스테이지의 통합 흐름을 보여줍니다.
외부(즉, S3) 스테이지는 정의에서 저장소 통합 오브젝트를 참조합니다.
Snowflake는 계정에 대해 생성된 S3 IAM 사용자와 저장소 통합을 자동으로 연결합니다. Snowflake는 Snowflake 계정의 모든 S3 저장소 통합에서 참조하는 단일 IAM 사용자를 생성합니다.
조직의 AWS 관리자가 IAM 사용자에게 스테이지 정의에서 참조하는 버킷에 액세스할 수 있는 권한을 부여합니다. 많은 외부 스테이지 오브젝트가 다른 버킷과 경로를 참조하고 인증에서 동일한 저장소 통합을 사용할 수 있습니다.
사용자가 스테이지에서 데이터를 로드하거나 언로드할 때 Snowflake는 액세스를 허용 또는 거부하기 전 버킷의 IAM 사용자에 부여된 권한을 확인합니다.
참고
클라우드 저장소에 액세스할 때 IAM 자격 증명을 제공할 필요가 없으므로 이 옵션을 사용하는 것이 매우 좋습니다. 추가적인 저장소 액세스 옵션은 Amazon S3에 대한 보안 액세스 구성하기 을 참조하십시오.
이 섹션의 내용:
1단계: S3 버킷에 대한 액세스 허가 구성¶
AWS 액세스 제어 요구 사항¶
Snowflake가 폴더(및 하위 폴더)의 파일에 액세스하기 위해 필요한 S3 버킷 및 폴더 권한은 다음과 같습니다.
s3:GetBucketLocation
s3:GetObject
s3:GetObjectVersion
s3:ListBucket
Snowflake는 S3 버킷에 대한 Snowflake 액세스에 대한 IAM 정책을 생성하는 것을 모범 사례로 권장합니다. 그러면 정책을 역할에 연결하고 AWS에서 역할에 대해 생성한 보안 자격 증명을 사용하여 버킷의 파일에 액세스할 수 있습니다.
IAM 정책 만들기¶
다음 단계별 지침에서는 S3 버킷에 액세스할 수 있도록 AWS 관리 콘솔에서 Snowflake에 대한 액세스 허가를 구성하는 방법을 설명합니다.
AWS 관리 콘솔에 로그인합니다.
홈 대시보드에서 Identity & Access Management (IAM)를 선택합니다.
왼쪽 탐색 창에서 Account settings 을 선택합니다.
Security Token Service Regions 목록을 확장하고 계정이 위치한 리전 에 해당하는 AWS 리전을 찾아 상태가 Inactive 이면 Activate 을 선택합니다.
왼쪽 탐색 창에서 Policies 을 선택합니다.
Create Policy 을 클릭합니다.
JSON 탭을 클릭합니다.
Snowflake가 S3 버킷 및 폴더에 액세스하도록 허용하는 정책 문서를 추가합니다.
다음 정책(JSON 형식)은 Snowflake에 단일 버킷 및 폴더 경로를 사용하여 데이터를 로드하거나 언로드하기 위해 필요한 권한을 제공합니다.
텍스트를 복사하여 정책 편집기에 붙여넣습니다.
참고
bucket
및prefix
를 실제 버킷 이름과 폴더 경로 접두사로 바꿔야 합니다.정부 리전 의 버킷에 대한 ARN(Amazon Resource Name)에는
arn:aws-us-gov:s3:::
접두사가 있습니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::<bucket>/<prefix>/*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::<bucket>", "Condition": { "StringLike": { "s3:prefix": [ "<prefix>/*" ] } } } ] }
참고
"s3:prefix":
조건을["*"]
또는["<경로>/*"]
로 설정하면 지정된 버킷의 모든 접두사 또는 버킷의 경로에 각각 액세스 권한이 부여됩니다.AWS 정책은 다양한 보안 사용 사례를 지원합니다.
Review policy 를 클릭합니다.
정책 이름(예:
snowflake_access
)과 선택 사항으로 설명을 입력합니다. Create policy 를 클릭합니다.
2단계: AWS에서 IAM 역할 만들기¶
AWS Management Console에서 Snowflake에 대한 액세스 권한을 구성하려면 다음을 수행하십시오.
AWS Management Console에 로그인합니다.
홈 대시보드에서 Identity & Access Management (IAM)를 선택합니다.
왼쪽 탐색 창에서 Roles 를 선택합니다.
Create role 를 선택합니다.
Another AWS account 을 신뢰할 수 있는 엔터티 타입으로 선택합니다.
Account ID 필드에 본인의 AWS 계정 ID를 임시로 입력합니다. 이후에 신뢰 관계를 수정하고 Snowflake에 대한 액세스 권한을 부여합니다.
Require external ID 옵션을 선택합니다. AWS 리소스(예: S3 버킷)에 대한 액세스 권한을 Snowflake와 같은 서드 파티에 부여하는 데 외부 ID가 사용됩니다.
0000
과 같은 자리 표시자 ID를 입력합니다. 이후 단계에서는 IAM 역할에 대한 신뢰 관계를 수정하고 저장소 통합을 위한 외부 ID를 지정합니다.Next 를 선택합니다.
이 항목의 1단계: S3 버킷에 대한 액세스 허가 구성 에서 생성한 정책을 선택합니다.
Next 를 선택합니다.
역할의 이름과 설명을 입력한 다음 Create role 을 선택합니다.
이제 버킷에 대한 IAM 정책을 생성하고 IAM 역할을 생성하며 정책을 역할에 연결했습니다.
역할 요약 페이지에서 Role ARN 값을 찾아서 기록합니다. 다음 단계에서는 이 역할을 참조하는 Snowflake 통합을 생성합니다.
참고
Snowflake는 어떤 기간 동안(60분의 만료 시간을 초과할 수는 없음) 임시 자격 증명을 캐시합니다. Snowflake에서 액세스를 취소하면 캐시가 만료될 때까지 사용자가 파일을 나열하고 클라우드 저장소 위치에서 데이터에 액세스할 수 있습니다.
3단계: Snowflake에서 클라우드 저장소 통합 만들기¶
CREATE STORAGE INTEGRATION 명령을 사용하여 저장소 통합을 생성합니다. 저장소 통합은 S3 클라우드 저장소에 대해 생성된 ID 및 액세스 관리(IAM) 사용자를 허용하거나 차단된 저장소 위치(즉, 버킷)의 선택적 세트과 함께 저장하는 Snowflake 오브젝트입니다. 저장소 위치에 대한 권한은 조직의 클라우드 공급자 관리자가 생성된 사용자에게 부여합니다. 이 옵션을 사용하면 사용자가 스테이지를 생성하거나 데이터를 로드할 때 자격 증명을 제공하지 않아도 됩니다.
단일 저장소 통합은 여러 외부(즉, S3) 스테이지를 지원할 수 있습니다. 스테이지 정의의 URL은 STORAGE_ALLOWED_LOCATIONS 매개 변수에 대해 지정된 S3 버킷(및 선택적 경로)와 일치해야 합니다.
참고
계정 관리자(ACCOUNTADMIN 역할의 사용자) 또는 전역 CREATE INTEGRATION 권한이 있는 역할만 이 SQL 명령을 실행할 수 있습니다.
CREATE STORAGE INTEGRATION <integration_name>
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = 'S3'
ENABLED = TRUE
STORAGE_AWS_ROLE_ARN = '<iam_role>'
STORAGE_ALLOWED_LOCATIONS = ('s3://<bucket>/<path>/', 's3://<bucket>/<path>/')
[ STORAGE_BLOCKED_LOCATIONS = ('s3://<bucket>/<path>/', 's3://<bucket>/<path>/') ]
여기서
integration_name
은 새 통합의 이름입니다.iam_role
은 이 항목의 2단계: AWS에서 IAM 역할 만들기 에서 생성한 역할의 Amazon 리소스 이름(ARN)입니다.bucket
은 데이터 파일을 저장하는 S3 버킷의 이름입니다(예:mybucket
). 필수 STORAGE_ALLOWED_LOCATIONS 매개 변수와 선택적 STORAGE_BLOCKED_LOCATIONS 매개 변수는 이 통합을 참조하는 스테이지가 생성되거나 수정될 때 이러한 버킷에 대한 액세스를 각각 제한하거나 차단합니다.path
는 버킷의 오브젝트를 세부적으로 제어하기 위해 사용할 수 있는 선택적 경로입니다.
다음 예시에서는 계정의 모든 버킷에 대한 액세스를 허용하지만 정의된 sensitivedata
폴더에 대한 액세스를 차단하는 통합을 생성합니다.
이 통합도 사용하는 추가 외부 스테이지는 허용되는 버킷과 경로를 참조할 수 있습니다.
CREATE STORAGE INTEGRATION s3_int TYPE = EXTERNAL_STAGE STORAGE_PROVIDER = 'S3' ENABLED = TRUE STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::001234567890:role/myrole' STORAGE_ALLOWED_LOCATIONS = ('*') STORAGE_BLOCKED_LOCATIONS = ('s3://mybucket1/mypath1/sensitivedata/', 's3://mybucket2/mypath2/sensitivedata/');
참고
선택적으로, STORAGE_AWS_EXTERNAL_ID 매개 변수를 사용하여 자체 외부 ID를 지정합니다. 이 옵션을 선택하여 여러 외부 볼륨 및/또는 저장소 통합에서 동일한 외부 ID를 사용할 수 있습니다.
4단계: Snowflake 계정에 대한 AWS IAM 사용자 검색¶
Snowflake 계정에 대해 자동으로 생성된 IAM 사용자의 ARN을 검색하려면 DESCRIBE INTEGRATION 을 사용하십시오.
DESC INTEGRATION <integration_name>;
여기서
integration_name
은 이 항목의 3단계: Snowflake에서 클라우드 저장소 통합 만들기 에서 생성한 통합의 이름입니다.
예:
DESC INTEGRATION s3_int; +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+ | property | property_type | property_value | property_default | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------| | ENABLED | Boolean | true | false | | STORAGE_ALLOWED_LOCATIONS | List | s3://mybucket1/mypath1/,s3://mybucket2/mypath2/ | [] | | STORAGE_BLOCKED_LOCATIONS | List | s3://mybucket1/mypath1/sensitivedata/,s3://mybucket2/mypath2/sensitivedata/ | [] | | STORAGE_AWS_IAM_USER_ARN | String | arn:aws:iam::123456789001:user/abc1-b-self1234 | | | STORAGE_AWS_ROLE_ARN | String | arn:aws:iam::001234567890:role/myrole | | | STORAGE_AWS_EXTERNAL_ID | String | MYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq= | | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
다음 속성의 값을 기록합니다.
속성
설명
STORAGE_AWS_IAM_USER_ARN
Snowflake 계정용으로 생성된 AWS IAM 사용자입니다(예:
arn:aws:iam::123456789001:user/abc1-b-self1234
). Snowflake는 전체 Snowflake 계정에 대해 단일 IAM 사용자를 프로비저닝합니다. 계정의 모든 S3 저장소 통합은 해당 IAM 사용자를 사용합니다.STORAGE_AWS_EXTERNAL_ID
Snowflake가 AWS와의 신뢰 관계를 설정하는 데 사용하는 외부 ID입니다. 저장소 통합을 생성할 때 외부 ID(
STORAGE_AWS_EXTERNAL_ID
)를 지정하지 않은 경우 Snowflake는 사용할 수 있는 ID를 생성합니다.다음 섹션에서 이러한 값을 입력합니다.
5단계: 버킷 오브젝트에 액세스할 수 있도록 IAM 사용자 권한 부여¶
다음 단계별 지침에서는 S3 버킷을 사용하여 데이터를 로드 및 언로드할 수 있도록 AWS 관리 콘솔에서 Snowflake에 대한 IAM 액세스 허가를 구성하는 방법을 설명합니다.
AWS Management Console에 로그인합니다.
Identity & Access Management (IAM)를 선택합니다.
왼쪽 탐색 창에서 Roles 를 선택합니다.
이 항목의 2단계: AWS에서 IAM 역할 만들기 에서 생성한 역할을 선택합니다.
Trust relationships 탭을 선택합니다.
Edit trust relationship 를 선택합니다.
이 항목의 4단계: Snowflake 계정에 대한 AWS IAM 사용자 검색 에서 기록한 DESC STORAGE INTEGRATION 출력 값으로 정책 문서를 수정합니다.
IAM 역할에 대한 정책 문서
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "<snowflake_user_arn>" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "<snowflake_external_id>" } } } ] }
여기서
snowflake_user_arn
은 사용자가 기록한 STORAGE_AWS_IAM_USER_ARN 값입니다.snowflake_external_id
는 사용자가 기록한 STORAGE_AWS_EXTERNAL_ID 값입니다.이 예에서
snowflake_external_id
값은MYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq=
입니다.참고
보안상의 이유로, 외부 ID를 지정하지 않고 새 저장소 통합을 생성하면(또는 CREATE OR REPLACE STORAGE INTEGRATION 구문을 사용하여 기존 저장소 통합을 다시 생성하면) 새 통합의 외부 ID가 다르므로 신뢰 정책을 업데이트하지 않으면 신뢰 관계를 확인할 수 없습니다.
Update Trust Policy 버튼을 선택합니다. 변경 사항이 저장됩니다.
참고
Snowflake는 어떤 기간 동안(60분의 만료 시간을 초과할 수는 없음) 임시 자격 증명을 캐시합니다. Snowflake에서 액세스를 취소하면 캐시가 만료될 때까지 사용자가 파일을 나열하고 클라우드 저장소 위치에서 데이터를 로딩할 수 있습니다.
올바른 옵션 결정하기¶
계속하기 전에 데이터 파일이 있는 S3 버킷의 대상 경로(또는 AWS 용어로 “접두사”)에 대한 S3 이벤트 알림이 있는지 확인합니다. AWS 규칙에서는 동일한 경로에서 충돌하는 알림 생성을 금지합니다.
Amazon SQS를 사용한 Snowpipe 자동화에서 지원되는 옵션은 다음과 같습니다.
옵션 1. 새로운 S3 이벤트 알림: S3 버킷의 대상 경로에 대한 이벤트 알림을 생성합니다. 파일을 로드할 준비가 되면 이벤트 알림이 SQS 큐를 통해 Snowpipe에 알립니다.
중요
S3 버킷에 대해 충돌하는 이벤트 알림이 있는 경우에는 옵션 2를 대신 사용합니다.
옵션 2. 기존 이벤트 알림: Snowpipe 자동화용 Snowflake SQS 큐를 포함하여 여러 엔드포인트(또는 “구독자”, 예: SQS 큐 또는 AWS Lambda 워크로드)와 지정된 경로에 대한 알림을 공유하도록 Amazon Simple Notification Service(SNS) 를 브로드캐스터로 구성합니다. 파일을 로드할 준비가 되면 SNS에서 게시한 S3 이벤트 알림이 SQS 큐를 통해 Snowpipe에 알립니다.
참고
스테이지, 파이프 및 로드 기록 복제 를 사용할 계획이라면 이 옵션을 권장합니다. 복제 또는 장애 조치 그룹을 생성한 후 옵션 1에서 옵션 2로 마이그레이션할 수도 있습니다. 자세한 내용은 Amazon SNS(Simple Notification Service)로 마이그레이션하기 섹션을 참조하십시오.
옵션 3. Snowpipe 자동화를 위한 Amazon EventBridge 설정: 옵션 2와 마찬가지로, S3 버킷에 대해 Amazon EventBridge 를 활성화하고 SNS 항목으로 알림을 보내는 규칙을 생성할 수도 있습니다.
옵션 1: Snowpipe를 자동화하기 위한 새 S3 이벤트 알림 만들기¶
이 섹션에서는 S3 버킷에 대한 Amazon SQS(Simple Queue Service) 알림을 사용하여 Snowpipe 데이터 로드를 자동으로 트리거하는 가장 일반적인 옵션에 대해 설명합니다. 이 단계에서는 데이터 파일이 저장된 S3 버킷의 대상 경로(또는 AWS 용어로 “접두사”)에 대한 이벤트 알림을 생성하는 방법을 설명합니다.
중요
S3 버킷에 대해 충돌하는 이벤트 알림이 있는 경우 이 항목의 옵션 2: SQS 알림을 사용하여 Snowpipe 자동화를 위한 Amazon SNS 구성하기 를 대신 사용합니다. AWS 규칙에서는 동일한 대상 경로에서 충돌하는 알림 생성을 금지합니다.
다음 다이어그램은 Snowpipe 자동 수집 프로세스 흐름을 보여줍니다.
데이터 파일은 스테이지에 로드됩니다.
S3 이벤트 알림은 파일을 로드할 준비가 되었음을 SQS 큐를 통해 Snowpipe에 알립니다. Snowpipe는 파일을 큐에 복사합니다.
Snowflake가 제공하는 가상 웨어하우스는 지정된 파이프에 정의된 매개 변수를 기반으로 큐에서 대기 중인 파일의 데이터를 대상 테이블로 로드합니다.
참고
이 항목의 지침에서는 데이터가 로드될 Snowflake 데이터베이스에 대상 테이블이 이미 있는 것으로 가정합니다.
1단계: 스테이지 만들기(필요한 경우)¶
CREATE STAGE 명령을 사용하여 S3 버킷을 참조하는 외부 스테이지를 생성합니다. Snowpipe는 스테이지에서 데이터 파일을 가져와 대상 테이블에 로드하기 전에 일시적으로 큐에 추가합니다. 아니면 기존 외부 스테이지를 사용할 수 있습니다.
참고
클라우드 저장소 위치에 대한 보안 액세스를 구성하려면 이 항목의 클라우드 저장소에 대한 보안 액세스 구성하기 를 참조하십시오.
CREATE STAGE 문에서 저장소 통합을 참조하려면 역할에 저장소 통합 오브젝트에 대한 USAGE 권한이 있어야 합니다.
다음 예에서는 사용자 세션에 대한 활성 스키마에 이름이 mystage
인 스테이지를 생성합니다. 클라우드 저장소 URL에는 files
경로가 포함됩니다. 스테이지는 my_storage_int
저장소 통합을 참조합니다.
USE SCHEMA snowpipe_db.public; CREATE STAGE mystage URL = 's3://mybucket/load/files' STORAGE_INTEGRATION = my_storage_int;
2단계: 자동 수집이 활성화된 파이프 만들기¶
CREATE PIPE 명령을 사용하여 파이프를 생성합니다. 파이프는 수집 큐에서 대상 테이블로 데이터를 로드하기 위해 Snowpipe에서 사용하는 COPY INTO <테이블> 문을 정의합니다.
다음 예에서는 사용자 세션에 대한 활성 스키마에 이름이 mypipe
인 파이프를 생성합니다. 파이프는 mystage
스테이지에서 스테이징된 파일에서 mytable
테이블로 데이터를 로드합니다.
create pipe snowpipe_db.public.mypipe auto_ingest=true as copy into snowpipe_db.public.mytable from @snowpipe_db.public.mystage file_format = (type = 'JSON');
AUTO_INGEST=true
매개 변수는 새 데이터를 로드할 준비가 되면 S3 버킷에서 SQS 큐로 전송한 이벤트 알림을 읽도록 지정합니다.
중요
파이프 정의의 스테이지 참조와 기존 파이프를 비교합니다. 동일한 S3 버킷의 디렉터리 경로가 중첩되지 않는지 확인합니다. 그렇지 않으면 여러 파이프가 동일한 데이터 파일 세트를 1개 이상의 대상 테이블에 여러 번 로드할 수 있습니다. 예를 들어, s3://mybucket/path1
및 s3://mybucket/path1/path2
와 같이 여러 스테이지가 세분화 수준이 다른 동일한 S3 버킷을 참조할 때 이러한 상황이 발생할 수 있습니다. 이 사용 사례에서 파일이 s3://mybucket/path1/path2
에서 스테이징된 경우 두 스테이지의 파이프가 파일 복사본을 로드합니다.
이는 수동 Snowpipe 설정(자동 수집 비활성화 포함)과 다르며, 이 경우에는 사용자가 로드할 파일을 큐에 추가하려면 명명된 파일 세트를 REST API에 제출해야 합니다. 자동 수집이 활성화되면 각 파이프는 S3 이벤트 알림에서 생성된 파일 목록을 수신합니다. 데이터 중복을 방지하기 위한 추가적인 관리가 필요합니다.
3단계: 보안 구성¶
Snowpipe를 사용하여 연속 데이터 로드를 실행할 각 사용자에 대해 데이터 로드에 대한 오브젝트(즉, 대상 데이터베이스, 스키마 및 테이블, 스테이지 오브젝트 및 파이프)에 대한 충분한 액세스 제어 권한을 부여합니다.
참고
“최소 권한”의 일반 원칙을 따르려면 파이프를 사용하여 파일을 수집하기 위해 사용할 별도의 사용자와 역할을 생성하는 것이 좋습니다. 이 역할을 기본 역할로 사용하여 사용자를 생성해야 합니다.
Snowpipe를 사용하기 위해서는 다음 권한을 보유한 역할이 필요합니다.
오브젝트 |
권한 |
참고 |
---|---|---|
명명된 파이프 |
OWNERSHIP |
|
명명된 스테이지 |
USAGE , READ |
|
명명된 파일 형식 |
USAGE |
선택 사항으로, 1단계: 스테이지 만들기(필요한 경우) 에서 생성한 스테이지가 명명된 파일 형식을 참조하는 경우에만 필요합니다. |
대상 데이터베이스 |
USAGE |
|
대상 스키마 |
USAGE |
|
대상 테이블 |
INSERT , SELECT |
GRANT <권한> 명령을 사용하여 역할에 권한을 부여합니다.
참고
보안 관리자(즉, SECURITYADMIN 역할 사용자) 이상 또는 계정에 대한 CREATE ROLE 권한과 전역 MANAGE GRANTS 권한이 모두 있는 역할만 역할을 생성하고 권한을 부여할 수 있습니다.
예를 들어, 이름이 snowpipe_role
인 파이프와 mypipe
데이터베이스 오브젝트 세트에 액세스할 수 있는 이름이 snowpipe_db.public
인 역할을 생성한 후 사용자에게 역할을 부여합니다.
-- Create a role to contain the Snowpipe privileges use role securityadmin; create or replace role snowpipe_role; -- Grant the required privileges on the database objects grant usage on database snowpipe_db to role snowpipe_role; grant usage on schema snowpipe_db.public to role snowpipe_role; grant insert, select on snowpipe_db.public.mytable to role snowpipe_role; grant usage on stage snowpipe_db.public.mystage to role snowpipe_role; -- Pause the pipe for OWNERSHIP transfer alter pipe mypipe SET PIPE_EXECUTION_PAUSED = true; -- Grant the OWNERSHIP privilege on the pipe object grant ownership on pipe snowpipe_db.public.mypipe to role snowpipe_role; -- Grant the role to a user grant role snowpipe_role to user jsmith; -- Set the role as the default role for the user alter user jsmith set default_role = snowpipe_role; -- Resume the pipe alter pipe mypipe SET PIPE_EXECUTION_PAUSED = false;
4단계: 이벤트 알림 구성¶
새 데이터를 로드할 수 있을 때 Snowpipe에 알리도록 S3 버킷에 대한 이벤트 알림을 구성합니다. 자동 수집 기능은 SQS 큐를 사용하여 S3에서 Snowpipe로 이벤트 알림을 전달합니다.
편리하게 사용할 수 있도록, Snowflake가 Snowpipe SQS 큐를 생성 및 관리합니다. SHOW PIPES 명령의 출력은 SQS 큐의 Amazon 리소스 이름(ARN)을 표시합니다.
SHOW PIPES 명령을 실행합니다.
SHOW PIPES;
notification_channel
열의 스테이지에 대한 ARN 큐의 SQS에 유의하십시오. 원하는 위치에 ARN을 복사합니다.참고
AWS 지침에 따라 Snowflake는 S3 버킷당 SQS 큐를 1개만 지정합니다. 이 SQS 큐는 동일한 AWS 계정의 여러 버킷 사이에서 공유할 수 있습니다. SQS 큐는 S3 버킷의 외부 스테이지를 대상 테이블에 연결하는 모든 파이프에 대한 알림을 조정합니다. 데이터 파일이 버킷에 업로드되면 스테이지 디렉터리 경로와 일치하는 모든 파이프가 해당 대상 테이블에 파일을 한 번 로드합니다.
Amazon S3 콘솔에 로그인합니다.
Amazon S3 설명서 에서 제공되는 지침을 사용하여 S3 버킷에 대한 이벤트 알림을 구성합니다. 다음과 같이 필드를 입력합니다.
Name: 이벤트 알림의 이름(예:
Auto-ingest Snowflake
)입니다.Events: ObjectCreate (All) 옵션을 선택합니다.
Send to: 드롭다운 목록에서 SQS Queue 를 선택합니다.
SQS: 드롭다운 목록에서 Add SQS queue ARN 를 선택합니다.
SQS queue ARN: SHOW PIPES 출력에서 SQS 큐의 이름을 붙여넣습니다.
참고
이 지침은 전체 S3 버킷에 대한 활동을 모니터링하는 단일 이벤트 알림을 생성합니다. 이 방법이 가장 단순한 방법입니다. 이 알림은 S3 버킷 디렉터리에서 보다 세분화된 수준으로 구성된 모든 파이프를 처리합니다. Snowpipe는 파이프 정의에 지정된 대로 데이터 파일만 로드합니다. 그러나 파이프 정의 외부의 활동에 대한 알림이 많으면 Snowpipe가 알림을 필터링하고 조치를 취하는 속도에 부정적인 영향을 줄 수 있습니다.
아니면 위의 단계에서 하나 이상의 경로 및/또는 파일 확장자(또는 AWS 용어로 접두사 및 접미사)를 구성하여 이벤트 활동을 필터링합니다. 지침은 관련 AWS 설명서 항목 에서 오브젝트 키 이름 필터링 정보를 참조하십시오. 알림에서 모니터링할 각 추가 경로 또는 파일 확장자에서 이 단계를 반복합니다.
AWS에서는 이러한 알림 큐 구성 의 수가 S3 버킷당 최대 100개로 제한됨에 유의하십시오.
또한, AWS에서는 동일한 S3 버킷에 대한 중첩 큐 구성(이벤트 알림 전체)을 허용하지 않습니다. 예를 들어, 기존 알림이 s3://mybucket/load/path1
에 대해 구성된 경우 s3://mybucket/load
와 같이 상위 수준에서 다른 알림을 생성할 수 없으며 그 반대의 경우도 마찬가지입니다.
이제 자동 수집 기능이 포함된 Snowpipe가 구성되었습니다!
새 데이터 파일이 S3 버킷에 추가되면 이벤트 알림은 Snowpipe에 파이프에 정의된 대상 테이블에 로드하도록 알립니다.
5단계: 기록 파일 로드¶
SQS 알림을 구성하기 전 외부 스테이지에 있던 데이터 파일의 백로그를 로드하려면 내역 데이터 로드하기 을 참조하십시오.
6단계: 스테이징된 파일 삭제¶
데이터를 로드하고 더 이상 파일이 필요하지 않으면 스테이징된 파일을 삭제합니다. 자세한 지침은 Snowpipe가 데이터를 로드한 후 스테이징된 파일 삭제하기 섹션을 참조하십시오.
옵션 2: SQS 알림을 사용하여 Snowpipe 자동화를 위한 Amazon SNS 구성하기¶
이 섹션에서는 S3 버킷에 대한 Amazon SQS(Simple Queue Service) 알림을 사용하여 Snowpipe 데이터 로드를 자동으로 트리거하는 방법을 설명합니다. 이 단계에서는 Snowpipe를 자동화하기 위한 Snowflake SQS 큐를 포함하여 S3 버킷에 대한 이벤트 알림을 여러 구독자(예: SQS 큐 또는 AWS Lambda 워크로드)에 게시하도록 브로드캐스터로 Amazon Simple Notification Service(SNS) 를 구성하는 방법을 설명합니다.
참고
이 지침에서는 데이터 파일이 있는 S3 버킷의 대상 경로에 대한 이벤트 알림이 있는 것으로 가정합니다. 이벤트 알림이 없는 경우에는 다음을 수행합니다.
이 항목의 옵션 1: Snowpipe를 자동화하기 위한 새 S3 이벤트 알림 만들기 를 대신 수행합니다.
S3 버킷에 대한 이벤트 알림을 생성한 후 이 항목의 지침을 수행합니다. 자세한 내용은 Amazon S3 설명서 를 참조하십시오.
다음 다이어그램은 Amazon SNS를 사용한 Snowpipe 자동 수집의 프로세스 흐름을 보여줍니다.
데이터 파일은 스테이지에 로드됩니다.
SNS에서 게시한 S3 이벤트 알림은 파일을 로드할 준비가 되었음을 SQS 큐를 통해 Snowpipe에 알립니다. Snowpipe는 파일을 큐에 복사합니다.
Snowflake가 제공하는 가상 웨어하우스는 지정된 파이프에 정의된 매개 변수를 기반으로 큐에서 대기 중인 파일의 데이터를 대상 테이블로 로드합니다.
참고
이 지침에서는 데이터가 로드될 Snowflake 데이터베이스에 대상 테이블이 이미 있는 것으로 가정합니다.
Snowpipe 자동 수집은 AWS KMS 암호화 SNS 항목을 지원합니다. 자세한 내용은 미사용 암호화 를 참조하십시오.
전제 조건: Amazon SNS 항목 및 구독 만들기¶
AWS 계정에 SNS 항목을 생성하여 S3 버킷의 Snowflake 스테이지 위치에 대한 모든 메시지를 처리합니다.
S3 이벤트 알림(예: 다른 SQS 큐 또는 AWS Lambda 워크로드)에 대한 대상 오브젝트를 이 항목에 구독합니다. SNS 항목의 모든 구독자에게 버킷에 대한 이벤트 알림을 게시합니다.
자세한 지침은 SNS 설명서 를 참조하십시오.
1단계: Snowflake SQS 큐를 SNS 항목에 구독¶
AWS 관리 콘솔에 로그인합니다.
홈 대시보드에서 Simple Notification Service (SNS)를 선택합니다.
왼쪽 탐색 창에서 Topics 을 선택합니다.
S3 버킷에 대한 항목을 찾습니다. ARN 항목을 기록합니다.
Snowflake 클라이언트를 사용하여 SNS 항목 ARN을 사용하여 SYSTEM$GET_AWS_SNS_IAM_POLICY 시스템 함수를 쿼리합니다.
select system$get_aws_sns_iam_policy('<sns_topic_arn>');
이 함수는 Snowflake SNS 항목을 구독할 수 있는 권한을 SQS 큐에 부여하는 IAM 정책을 반환합니다.
예:
select system$get_aws_sns_iam_policy('arn:aws:sns:us-west-2:001234567890:s3_mybucket'); +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | SYSTEM$GET_AWS_SNS_IAM_POLICY('ARN:AWS:SNS:US-WEST-2:001234567890:S3_MYBUCKET') | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | {"Version":"2012-10-17","Statement":[{"Sid":"1","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234"},"Action":["sns:Subscribe"],"Resource":["arn:aws:sns:us-west-2:001234567890:s3_mybucket"]}]} | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
AWS 관리 콘솔로 돌아갑니다. 왼쪽 탐색 창에서 Topics 을 선택합니다.
S3 버킷에 대한 항목을 선택하고 Edit 버튼을 클릭합니다. Edit 페이지가 열립니다.
Access policy - Optional 을 클릭하여 페이지의 이 영역을 확장합니다.
SYSTEM$GET_AWS_SNS_IAM_POLICY 함수에서 IAM 정책 추가를 병합하면 JSON 문서가 생성됩니다.
예:
원본 IAM 정책(축약형):
{ "Version":"2008-10-17", "Id":"__default_policy_ID", "Statement":[ { "Sid":"__default_statement_ID", "Effect":"Allow", "Principal":{ "AWS":"*" } .. } ] }
병합된 IAM 정책:
{ "Version":"2008-10-17", "Id":"__default_policy_ID", "Statement":[ { "Sid":"__default_statement_ID", "Effect":"Allow", "Principal":{ "AWS":"*" } .. }, { "Sid":"1", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234" }, "Action":[ "sns:Subscribe" ], "Resource":[ "arn:aws:sns:us-west-2:001234567890:s3_mybucket" ] } ] }
S3가 버킷에 대한 이벤트 알림을 SNS 항목에 게시할 수 있도록 추가 정책 권한 부여를 추가합니다.
예를 들어(이 지침 전체에서 사용되는 SNS 항목 ARN 및 S3 버킷 사용),
{ "Sid":"s3-event-notifier", "Effect":"Allow", "Principal":{ "Service":"s3.amazonaws.com" }, "Action":"SNS:Publish", "Resource":"arn:aws:sns:us-west-2:001234567890:s3_mybucket", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:s3:*:*:s3_mybucket" } } }
병합된 IAM 정책:
{ "Version":"2008-10-17", "Id":"__default_policy_ID", "Statement":[ { "Sid":"__default_statement_ID", "Effect":"Allow", "Principal":{ "AWS":"*" } .. }, { "Sid":"1", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234" }, "Action":[ "sns:Subscribe" ], "Resource":[ "arn:aws:sns:us-west-2:001234567890:s3_mybucket" ] }, { "Sid":"s3-event-notifier", "Effect":"Allow", "Principal":{ "Service":"s3.amazonaws.com" }, "Action":"SNS:Publish", "Resource":"arn:aws:sns:us-west-2:001234567890:s3_mybucket", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:s3:*:*:s3_mybucket" } } } ] }
Save changes 버튼을 클릭합니다.
2단계: 스테이지 만들기(필요한 경우)¶
CREATE STAGE 명령을 사용하여 S3 버킷을 참조하는 외부 스테이지를 생성합니다. Snowpipe는 스테이지에서 데이터 파일을 가져와 대상 테이블에 로드하기 전에 일시적으로 큐에 추가합니다.
아니면 기존 외부 스테이지를 사용할 수 있습니다.
참고
클라우드 저장소 위치에 대한 보안 액세스를 구성하려면 이 항목의 클라우드 저장소에 대한 보안 액세스 구성하기 를 참조하십시오.
다음 예에서는 사용자 세션에 대한 활성 스키마에 이름이 mystage
인 스테이지를 생성합니다. 클라우드 저장소 URL에는 files
경로가 포함됩니다. 스테이지는 my_storage_int
저장소 통합을 참조합니다.
CREATE STAGE mystage URL = 's3://mybucket/load/files' STORAGE_INTEGRATION = my_storage_int;
3단계: 자동 수집이 활성화된 파이프 만들기¶
CREATE PIPE 명령을 사용하여 파이프를 생성합니다. 파이프는 수집 큐에서 대상 테이블로 데이터를 로드하기 위해 Snowpipe에서 사용하는 COPY INTO <테이블> 문을 정의합니다. COPY 문에서 전제 조건: Amazon SNS 항목 및 구독 만들기 에서 SNS 항목 ARN을 식별합니다.
다음 예에서는 사용자 세션에 대한 활성 스키마에 이름이 mypipe
인 파이프를 생성합니다. 파이프는 mystage
스테이지에서 스테이징된 파일에서 mytable
테이블로 데이터를 로드합니다.
create pipe snowpipe_db.public.mypipe auto_ingest=true aws_sns_topic='<sns_topic_arn>' as copy into snowpipe_db.public.mytable from @snowpipe_db.public.mystage file_format = (type = 'JSON');
여기서
AUTO_INGEST = true
새 데이터를 로드할 준비가 되면 S3 버킷에서 SQS 큐로 전송한 이벤트 알림을 읽도록 지정합니다.
AWS_SNS_TOPIC = '<sns_항목_arn>'
S3 버킷의 SNS 항목에 대한 ARN을 지정하며, 예를 들어 현재 예에서의
arn:aws:sns:us-west-2:001234567890:s3_mybucket
입니다. CREATE PIPE 문은 Snowflake SQS 큐가 지정된 SNS 항목을 구독하도록 합니다. 파이프는 SNS 항목을 통한 이벤트 알림에 의해 트리거된 수집 큐에만 파일을 복사합니다.
현재는, 파이프에서 매개 변수 중 하나를 제거하려면 CREATE OR REPLACE PIPE 구문을 사용하여 파이프를 다시 생성해야 합니다.
중요
COPY INTO <테이블> 문의 저장 위치 참조가 계정의 기존 파이프 참조와 중첩되지 않는지 확인합니다. 그렇지 않으면 여러 파이프가 동일한 데이터 파일 세트를 대상 테이블로 로드할 수 있습니다. 예를 들어, 여러 파이프 정의가 <저장소_위치>/path1/
및 <저장소_위치>/path1/path2/
과 같이 세분화 수준이 다른 동일한 저장소 위치를 참조할 때 이러한 상황이 발생할 수 있습니다. 이 예에서, 파일이 <저장소_위치>/path1/path2/
에서 스테이징된 경우 두 파이프 모두 파일의 복사본을 로드합니다.
SHOW PIPES 를 실행하거나 Account Usage의 PIPES 뷰 또는 Information Schema의 PIPES 뷰를 쿼리하여 계정의 모든 파이프 정의에서 COPY INTO <테이블> 문을 확인합니다.
4단계: 보안 구성¶
Snowpipe를 사용하여 연속 데이터 로드를 실행할 각 사용자에 대해 데이터 로드에 대한 오브젝트(즉, 대상 데이터베이스, 스키마 및 테이블, 스테이지 오브젝트 및 파이프)에 대한 충분한 액세스 제어 권한을 부여합니다.
참고
“최소 권한”의 일반 원칙을 따르려면 파이프를 사용하여 파일을 수집하기 위해 사용할 별도의 사용자와 역할을 생성하는 것이 좋습니다. 이 역할을 기본 역할로 사용하여 사용자를 생성해야 합니다.
Snowpipe를 사용하기 위해서는 다음 권한을 보유한 역할이 필요합니다.
오브젝트 |
권한 |
참고 |
---|---|---|
명명된 파이프 |
OWNERSHIP |
|
명명된 저장소 통합 |
USAGE |
2단계: 스테이지 만들기(필요한 경우) 에서 생성한 스테이지가 저장소 통합을 참조하는 경우에 필요합니다. |
명명된 스테이지 |
USAGE , READ |
|
명명된 파일 형식 |
USAGE |
선택 사항으로, 2단계: 스테이지 만들기(필요한 경우) 에서 생성한 스테이지가 명명된 파일 형식을 참조하는 경우에만 필요합니다. |
대상 데이터베이스 |
USAGE |
|
대상 스키마 |
USAGE |
|
대상 테이블 |
INSERT , SELECT |
GRANT <권한> 명령을 사용하여 역할에 권한을 부여합니다.
참고
보안 관리자(즉, SECURITYADMIN 역할의 사용자) 이상의 사용자만 역할을 생성할 수 있습니다.
예를 들어, 이름이 snowpipe_role
인 파이프와 mypipe
데이터베이스 오브젝트 세트에 액세스할 수 있는 이름이 snowpipe_db.public
인 역할을 생성한 후 사용자에게 역할을 부여합니다.
-- Create a role to contain the Snowpipe privileges use role securityadmin; create or replace role snowpipe_role; -- Grant the required privileges on the database objects grant usage on database snowpipe_db to role snowpipe_role; grant usage on schema snowpipe_db.public to role snowpipe_role; grant insert, select on snowpipe_db.public.mytable to role snowpipe_role; grant usage, read on stage snowpipe_db.public.mystage to role snowpipe_role; -- Pause the pipe for OWNERSHIP transfer alter pipe mypipe SET PIPE_EXECUTION_PAUSED = true; -- Grant the OWNERSHIP privilege on the pipe object grant ownership on pipe snowpipe_db.public.mypipe to role snowpipe_role; -- Grant the role to a user grant role snowpipe_role to user jsmith; -- Set the role as the default role for the user alter user jsmith set default_role = snowpipe_role; -- Resume the pipe alter pipe mypipe SET PIPE_EXECUTION_PAUSED = false;
이제 자동 수집 기능이 포함된 Snowpipe가 구성되었습니다!
새 데이터 파일이 S3 버킷에 추가되면 이벤트 알림은 Snowpipe에 파이프에 정의된 대상 테이블에 로드하도록 알립니다.
5단계: 기록 파일 로드¶
SQS 알림을 구성하기 전 외부 스테이지에 있던 데이터 파일의 백로그를 로드하려면 내역 데이터 로드하기 을 참조하십시오.
6단계: 스테이징된 파일 삭제¶
데이터를 로드하고 더 이상 파일이 필요하지 않으면 스테이징된 파일을 삭제합니다. 자세한 지침은 Snowpipe가 데이터를 로드한 후 스테이징된 파일 삭제하기 섹션을 참조하십시오.
옵션 3: Snowpipe를 자동화하도록 Amazon EventBridge 설정¶
옵션 2와 마찬가지로, Snowpipe를 자동화하도록 Amazon EventBridge를 설정할 수도 있습니다.
1단계: Amazon SNS 항목 만들기¶
이 항목의 전제 조건: Amazon SNS 항목 및 구독 만들기 를 따릅니다.
2단계: S3 버킷을 구독하고 SNS 항목으로 알림을 보내는 EventBridge 규칙 만들기¶
S3 버킷에 대해 Amazon EventBridge를 활성화합니다.
EventBridge 규칙을 만들어 1단계에서 만든 SNS 항목으로 알림을 보냅니다.
3단계: SQS 알림을 사용하여 Snowpipe 자동화를 위한 Amazon SNS 구성하기¶
이 항목의 옵션 2: SQS 알림을 사용하여 Snowpipe 자동화를 위한 Amazon SNS 구성하기 섹션을 따릅니다.
SYSTEM$PIPE_STATUS 출력¶
SYSTEM$PIPE_STATUS 함수는 파이프의 현재 상태에 대한 JSON 표현을 검색합니다.
AUTO_INGEST가 TRUE로 설정된 파이프의 경우 이 함수는 다음 이름/값 페어를 포함하는 JSON 오브젝트를 반환합니다(현재 파이프 상태에 해당하는 경우).
{“executionState”:”<값>”,”oldestFileTimestamp”:<값>,”pendingFileCount”:<값>,”notificationChannelName”:”<값>”,”numOutstandingMessagesOnChannel”:<값>,”lastReceivedMessageTimestamp”:”<값>”,”lastForwardedMessageTimestamp”:”<값>”,”error”:<값>,”fault”:<값>}
출력 값에 대한 설명은 SQL 함수에 대한 참조 항목을 참조하십시오.