옵션 1: Amazon S3에 접근하도록 Snowflake 스토리지 통합 구성

옵션 1: Amazon S3에 접근하도록 Snowflake 스토리지 통합 구성

이 주제는 스토리지 통합을 사용해 Snowflake가 외부(즉, S3) 스테이지에 참조된 Amazon S3 버킷에서 데이터를 읽고 쓸 수 있게 하는 방법을 설명해요. 통합은 시크릿 키나 액세스 토큰 같은 명시적 클라우드 제공업체 자격 증명을 전달할 필요가 없게 하는 이름이 있는 일급(first-class) Snowflake 객체예요. 통합 객체는 AWS IAM(Identity and Access Management) 사용자 ID를 저장해요. 조직의 관리자가 AWS 계정에서 통합 IAM 사용자 권한을 부여해요.

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

참고

  • 이 섹션의 지침을 완료하려면 IAM 정책과 역할을 만들고 관리할 AWS 권한이 필요해요. AWS 관리자가 아니라면 관리자에게 이 작업을 수행하도록 요청해요.
  • 스토리지 통합을 사용한 정부 리전의 S3 스토리지 액세스는 같은 정부 리전의 AWS에 호스팅된 Snowflake 계정으로 제한돼요.
  • Snowflake가 스토리지가 호스팅된 AWS 리전을 지원하는지 확인해요. 자세한 내용은 지원되는 클라우드 리전을 참고해요.

다음 다이어그램은 S3 스테이지의 통합 흐름을 보여줘요.

  • 외부(즉, S3) 스테이지가 정의에서 스토리지 통합 객체를 참조해요.
  • Snowflake는 스토리지 통합을 계정을 위해 만들어진 S3 IAM 사용자와 자동으로 연결해요. Snowflake는 Snowflake 계정의 모든 S3 스토리지 통합이 참조하는 단일 IAM 사용자를 만들어요.
  • 조직의 AWS 관리자가 스테이지 정의에 참조된 버킷에 접근할 수 있도록 IAM 사용자에게 권한을 부여해요. 많은 외부 스테이지 객체가 서로 다른 버킷과 경로를 참조하고 같은 스토리지 통합을 인증에 사용할 수 있다는 점에 주의해요.

사용자가 스테이지에서 데이터를 로드하거나 언로드할 때 Snowflake는 액세스를 허용하거나 거부하기 전에 버킷에서 IAM 사용자에 부여된 권한을 검증해요.

출처: Documentation

본문

클라우드 스토리지에 대한 보안 액세스 구성

이 섹션은 클라우드 스토리지의 인증 책임을 Snowflake IAM(Identity and Access Management) 엔터티에 위임하도록 Snowflake 스토리지 통합 객체를 구성하는 방법을 설명해요.

1단계: S3 버킷에 대한 액세스 권한 구성

AWS 액세스 제어 요구 사항

Snowflake가 폴더(및 하위 폴더)의 파일에 접근하려면 S3 버킷과 폴더에 다음 권한이 필요해요.

  • s3:GetBucketLocation
  • s3:GetObject
  • s3:GetObjectVersion
  • s3:ListBucket

참고 — 추가 SQL 작업을 수행하려면 다음 추가 권한이 필요해요.

권한 SQL 작업
s3:PutObject 버킷으로 파일 언로드.
s3:DeleteObject 성공적인 로드 후 스테이지에서 파일 자동 삭제 또는 REMOVE 문을 실행해 수동으로 파일 제거.

모범 사례로, Snowflake가 S3 버킷에 접근하도록 IAM 정책을 만드는 것을 권장해요. 그런 다음 정책을 역할에 연결하고 AWS가 역할에 대해 생성한 보안 자격 증명을 사용해 버킷의 파일에 접근할 수 있어요.

IAM 정책 만들기

다음 단계별 지침은 AWS Management Console에서 Snowflake에 대한 액세스 권한을 구성해 S3 버킷을 사용해 데이터를 로드하고 언로드하는 방법을 설명해요.

  1. AWS Management Console에 로그인해요.
  2. 홈 대시보드에서 IAM을 검색해 선택해요.
  3. 왼쪽 탐색 창에서 Account settings를 선택해요.
  4. Endpoints 목록의 Security Token Service(STS) 아래에서 계정이 위치한 Snowflake 리전을 찾아요. STS status가 비활성(inactive)이면 토글을 Active로 이동해요.
  5. 왼쪽 탐색 창에서 Policies를 선택해요.
  6. Create Policy를 선택해요.
  7. Policy editor에서 JSON을 선택해요.
  8. Snowflake가 S3 버킷과 폴더에 접근할 수 있게 하는 정책 문서를 추가해요.

다음 정책(JSON 형식)은 단일 버킷과 폴더 경로를 사용해 데이터를 로드하거나 언로드하는 데 필요한 권한을 Snowflake에 제공해요. PURGE 복사 옵션으로 데이터 파일을 삭제할 수도 있어요.

텍스트를 정책 편집기에 복사해 붙여넣어요.

참고

  • *bucket*과 *prefix*를 실제 버킷 이름과 폴더 경로 접두사로 바꿔야 해요.
  • 정부 리전의 버킷에 대한 Amazon 리소스 이름(ARN)은 arn:aws-us-gov:s3::: 접두사를 가져요.
  • 중국의 공용 AWS 리전 버킷에 대한 ARN은 arn:aws-cn:s3::: 접두사를 가져요.
  • S3 액세스 포인트를 사용하는 경우 버킷 ARN 대신 액세스 포인트 ARN을 지정해요. 자세한 내용은 액세스 포인트 사용을 위한 IAM 정책 구성을 참고해요.
{
 "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>/*"
                 ]
             }
         }
     }
 ]
}

참고 — "s3:prefix": 조건을 ["*"]으로 설정하면 지정된 버킷의 모든 접두사에 대한 액세스를 부여하고, ["<path>/*"]으로 설정하면 버킷의 해당 경로의 모든 접두사에 대한 액세스를 각각 부여해요. AWS 정책은 다양한 보안 사용 사례를 지원한다는 점에 주의해요.

다음 정책은 단일 읽기 전용 버킷과 폴더 경로에서 데이터를 로드하는 데 필요한 권한을 Snowflake에 제공해요. 정책에는 s3:GetBucketLocation, s3:GetObject, s3:GetObjectVersion, s3:ListBucket 권한이 포함돼요.

대체 정책: 읽기 전용 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>/*"
                 ]
             }
         }
     }
 ]
}
  1. Next를 선택해요.
  2. Policy name(예: snowflake_access)과 선택적인 Description을 입력해요.
  3. Create policy를 선택해요.

2단계: AWS에서 IAM 역할 만들기

AWS Management Console에서 Snowflake에 대한 액세스 권한을 구성하려면 다음을 수행해요.

  1. IAM(Identity and Access Management) Dashboard의 왼쪽 탐색 창에서 Roles를 선택해요.
  2. Create role을 선택해요.
  3. 신뢰 엔터티 유형으로 AWS account를 선택해요.
  4. Another AWS account를 선택해요.
  5. Account ID 필드에 일시적으로 자신의 AWS 계정 ID를 입력해요. 나중에 신뢰 관계를 수정하고 Snowflake에 액세스를 부여해요.
  6. Require external ID 옵션을 선택해요. 외부 ID는 S3 버킷 같은 AWS 리소스에 대한 액세스를 Snowflake 같은 타사에 부여하는 데 사용돼요. 0000 같은 자리 표시자 ID를 입력해요. 이후 단계에서 IAM 역할의 신뢰 관계를 수정하고 스토리지 통합의 외부 ID를 지정할 거예요.
  7. Next를 선택해요.
  8. (이 주제의) 1단계: S3 버킷에 대한 액세스 권한 구성에서 만든 정책을 선택해요.
  9. Next를 선택해요.
  10. 역할 이름과 설명을 입력한 다음 Create role을 선택해요.

이제 버킷에 대한 IAM 정책을 만들고, IAM 역할을 만들고, 정책을 역할에 연결했어요.

  1. 역할 요약 페이지에서 Role ARN 값을 찾아 기록해요. 다음 단계에서 이 역할을 참조하는 Snowflake 통합을 만들 거예요.

참고 — Snowflake는 60분 만료 시간을 초과할 수 없는 기간 동안 임시 자격 증명을 캐시해요. Snowflake에서 액세스를 취소하면 사용자는 캐시가 만료될 때까지 클라우드 스토리지 위치에서 파일을 나열하고 데이터에 접근할 수 있을 수 있어요.

3단계: Snowflake에서 클라우드 스토리지 통합 만들기

CREATE STORAGE INTEGRATION 명령으로 스토리지 통합을 만들어요. 스토리지 통합은 S3 클라우드 스토리지용으로 생성된 IAM(Identity and Access Management) 사용자와 허용 또는 차단된 스토리지 위치(즉, 버킷)의 선택적 집합을 저장하는 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 = ('<protocol>://<bucket>/<path>/', '<protocol>://<bucket>/<path>/')
  [ STORAGE_BLOCKED_LOCATIONS = ('<protocol>://<bucket>/<path>/', '<protocol>://<bucket>/<path>/') ]

여기서:

  • integration_name은 새 통합의 이름.
  • iam_role은 (이 주제의) 2단계: AWS에서 IAM 역할 만들기에서 만든 역할의 Amazon 리소스 이름(ARN).
  • protocol은 다음 중 하나.
    • s3 — 중국 밖의 공용 AWS 리전의 S3 스토리지.
    • s3china — 중국의 공용 AWS 리전의 S3 스토리지.
    • s3gov — 정부 리전의 S3 스토리지.
  • 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>;

여기서:

예를 들어:

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 사용자에게 권한 부여

다음 단계별 지침은 AWS Management Console에서 Snowflake에 대한 IAM 액세스 권한을 구성해 S3 버킷을 사용해 데이터를 로드하고 언로드하는 방법을 설명해요.

  1. AWS Management Console에 로그인해요.
  2. IAM을 선택해요.
  3. 왼쪽 탐색 창에서 Roles를 선택해요.
  4. (이 주제의) 2단계: AWS에서 IAM 역할 만들기에서 만든 역할을 선택해요.
  5. Trust relationships 탭을 선택해요.
  6. Edit trust policy를 선택해요.
  7. (이 주제의) 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를 가지며, 신뢰 정책을 업데이트하지 않으면 신뢰 관계를 해결할 수 없어요.

  1. 변경 사항을 저장하려면 Update policy를 선택해요.

참고 — Snowflake는 60분 만료 시간을 초과할 수 없는 기간 동안 임시 자격 증명을 캐시해요. Snowflake에서 액세스를 취소하면 사용자는 캐시가 만료될 때까지 클라우드 스토리지 위치에서 파일을 나열하고 데이터를 로드할 수 있을 수 있어요.

참고 — SYSTEM$VALIDATE_STORAGE_INTEGRATION 함수를 사용해 스토리지 통합의 구성을 검증할 수 있어요.

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

(이 주제의) 3단계: Snowflake에서 클라우드 스토리지 통합 만들기에서 만든 스토리지 통합을 참조하는 외부(즉, S3) 스테이지를 만들어요.

참고 — 스토리지 통합을 사용하는 스테이지를 만들려면 스키마에 대한 CREATE STAGE 권한과 스토리지 통합에 대한 USAGE 권한이 있는 역할이 필요해요. 예를 들어:

GRANT CREATE STAGE ON SCHEMA public TO ROLE myrole;

GRANT USAGE ON INTEGRATION s3_int TO ROLE myrole;

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

예를 들어 mydb.public을 사용자 세션의 현재 데이터베이스와 스키마로 설정한 다음 my_s3_stage라는 스테이지를 만들어요. 이 예제에서 스테이지는 통합이 지원하는 S3 버킷과 경로 mybucket1/path1을 참조해요. 스테이지는 또한 my_csv_format이라는 이름이 있는 파일 형식 객체를 참조해요.

USE SCHEMA mydb.public;

CREATE STAGE my_s3_stage
  STORAGE_INTEGRATION = s3_int
  URL = 's3://bucket1/path1/'
  FILE_FORMAT = my_csv_format;

참고

  • 스테이지 소유자(즉, 스테이지에 OWNERSHIP 권한이 있는 역할)가 스토리지 통합에 USAGE 권한이 있어야 해요.
  • URL 값에 슬래시(/)를 추가해 지정된 폴더 경로로 필터링해요. 슬래시를 생략하면 지정된 경로의 접두사로 시작하는 모든 파일과 폴더가 포함돼요. 스테이지의 비정형 데이터 파일에 접근하고 검색하려면 슬래시가 필요하다는 점에 주의해요.
  • 통합을 사용하는 스테이지에서 데이터를 로드하거나 언로드하려면 역할이 스테이지에 USAGE 권한이 있어야 해요. 스토리지 통합에 USAGE 권한도 가질 필요는 없어요.
  • STORAGE_INTEGRATION 매개 변수는 FILE_FORMAT 같은 다른 스테이지 매개 변수와 별도로 처리돼요. 이러한 다른 매개 변수에 대한 지원은 S3 버킷에 접근하는 데 사용되는 통합과 관계없이 동일해요.

더 알아보기