snowflake
Snowflake 와 AWS S3 연동하기
레아킴
2023. 3. 28. 20:23
반응형
1. Amazon S3에 액세스하기 위한 Snowflake 저장소 통합 구성하기
snowflake는 외부 스테이지는 통합 저장소를 참조하여 s3 iam 권한이 있는 계정을 통해서만 s3에 접근하여 데이터를 주고 받을 수 있다.
먼저, s3와 액세스하기 위한 권한은 다음과 같다.
- s3:GetBucketLocation
- s3:GetObject
- s3:GetObjectVersion
- s3:ListBucket
I AM 정책만들기
- AWS 관리 콘솔에 로그인한다.
- 홈 대시보드에서 Identity & Access Management (IAM)를 선택
- 왼쪽 탐색 창에서 Account settings 을 선택
- Security Token Service Regions 목록을 확장하고 계정이 위치한 리전 에 해당하는 AWS 리전을 찾아 상태가 Inactive 이면 Activate 을 선택
- 왼쪽 탐색 창에서 Policies 을 선택
- Create Policy 을 클릭
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectVersion",
"s3:DeleteObject",
"s3:DeleteObjectVersion"
],
"Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::<bucket>",
"Condition": {
"StringLike": {
"s3:prefix": [
"<prefix>/*"
]
}
}
}
]
}
IAM 역할 생성
- AWS 관리 콘솔에 로그인 -> 홈 대시보드에서 Identity & Access Management (IAM)를 선택
- 왼쪽 탐색 창에서 Roles 을 선택
- Create role 버튼을 클릭
- Another AWS account 을 신뢰할 수 있는 엔터티 타입으로 선택
- Account ID 필드에 본인의 AWS 계정 ID를 임시로 입력합니다. 이후에 신뢰할 수 있는 관계를 수정하고 Snowflake에 대한 액세스 권한을 부여
- Require external ID 옵션을 선택합니다. 0000 과 같은 더미 ID를 입력한다. 이후에 신뢰 관계를 수정하고 Snowflake 스테이지에 대한 외부 ID를 지정한다. AWS 리소스(즉, S3)에 대한 액세스 권한을 제3자(즉, Snowflake)에게 부여하려면 외부 ID가 필요하다.
- Next 버튼을 클릭
- 이 항목의 1단계: S3 버킷에 대한 액세스 허가 구성 에서 생성한 정책을 찾아 해당 정책을 선택
- Next 버튼을 클릭
- 역할의 이름과 설명을 입력하고 Create role 버튼을 클릭한다.
- 역할 요약 페이지에 있는 Role ARN 값을 기록하고 다음 단계에서는 이 역할을 참조하는 Snowflake 통합을 생성한다.
Storage integraion 생성
다음 코드로 storage integration 을 생성한다.
storage_aws_role_arn 에는 위에 생성한 iam role 의 AWS 리소스 이름을 입력하면 된다.
CREATE OR REPLACE STORAGE INTEGRATION <name>
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = 'S3'
STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::001234567890:role/myrole'
STORAGE_ALLOWED_LOACATIONS = ('s3://bucket/path/')
ENABLED = TRUE
comment = 'STORAGE INTEGRATION FOR UNLOADING DATA TO S3';
snowflake 계정에 대한 AWS IAM 사용자 검색
DESC INTEGRATION s3_ftp_int;
ex)
+---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
| 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= | |
+---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
위에서 만든 integration을 검색한 후에
STORAGE_AWS_IAM_USER_ARN, STORAGE_AWS_EXTERNAL_ID
이 값을 가지고 다음 단계에서 입력해야한다.
IAM 역할에 대한 정책 수정
아까 위에서 만든 IAM role로 다시 돌아가서
1. 신뢰관계(Trust relationship) 클릭
2. Edit trust relationship 클릭
3. 다음 코드처럼 수정
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "<snowflake_user_arn>" --STORAGE_AWS_IAM_USER_ARN
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "<snowflake_external_id>" --STORAGE_AWS_EXTERNAL_ID
}
}
}
]
}
2. Stage 생성
USE SCHEMA mydb.public;
create or replace stage my_s3_unload_stage url= URL
storage_information = s3_ftp_int
데이터 언로딩하기
COPY INTO @my_s3_unload_stage from (sql command) FILE_FORMAT = (FORMAT_NAME = 'my_csv_unload_format' COMPRESSION = NONE);
이렇게 데이터를 언드로할 수 있는데 미리 file_format을 생성시켜 놓아도 되고, 언로드할때 만들어도 된다.
csv파일로 보낼경우 default가 gzip이기 때문에 csv로 올리고 싶다면 COMPRESSION = NONE을 꼭 해야한다.
이로써, snowflake와 s3 연동하기 작업이 완료된다.
반응형