율코딩

Snowflake 와 AWS S3 연동하기 본문

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 정책만들기

 

  1. AWS 관리 콘솔에 로그인한다.
  2. 홈 대시보드에서 Identity & Access Management (IAM)를 선택
  3. 왼쪽 탐색 창에서 Account settings 을 선택
  4. Security Token Service Regions 목록을 확장하고 계정이 위치한 리전 에 해당하는 AWS 리전을 찾아 상태가 Inactive 이면 Activate 을 선택
  5. 왼쪽 탐색 창에서 Policies 을 선택
  6. 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 역할 생성

 

  1. AWS 관리 콘솔에 로그인 -> 홈 대시보드에서 Identity & Access Management (IAM)를 선택
  2. 왼쪽 탐색 창에서 Roles 을 선택
  3. Create role 버튼을 클릭
  4. Another AWS account 을 신뢰할 수 있는 엔터티 타입으로 선택
  5. Account ID 필드에 본인의 AWS 계정 ID를 임시로 입력합니다. 이후에 신뢰할 수 있는 관계를 수정하고 Snowflake에 대한 액세스 권한을 부여
  6. Require external ID 옵션을 선택합니다. 0000 과 같은 더미 ID를 입력한다. 이후에 신뢰 관계를 수정하고 Snowflake 스테이지에 대한 외부 ID를 지정한다. AWS 리소스(즉, S3)에 대한 액세스 권한을 제3자(즉, Snowflake)에게 부여하려면 외부 ID가 필요하다.
  7. Next 버튼을 클릭
  8. 이 항목의 1단계: S3 버킷에 대한 액세스 허가 구성 에서 생성한 정책을 찾아 해당 정책을 선택
  9. Next 버튼을 클릭
  10. 역할의 이름과 설명을 입력하고 Create role 버튼을 클릭한다.
  11. 역할 요약 페이지에 있는 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 연동하기 작업이 완료된다.

반응형
Comments