옵션 1: Amazon S3에 액세스하기 위한 Snowflake 저장소 통합 구성하기¶
이 항목에서는 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 사용자에 부여된 권한을 확인합니다.
이 항목의 내용:
클라우드 저장소에 대한 보안 액세스 구성하기¶
이 섹션에서는 Snowflake ID 및 액세스 관리(IAM) 엔터티에 클라우드 저장소에 대한 인증 책임을 위임하도록 Snowflake 저장소 통합 오브젝트를 구성하는 방법을 설명합니다.
1단계: S3 버킷에 대한 액세스 허가 구성¶
AWS 액세스 제어 요구 사항¶
Snowflake가 폴더(및 하위 폴더)의 파일에 액세스하기 위해 필요한 S3 버킷 및 폴더 권한은 다음과 같습니다.
s3:GetBucketLocation
s3:GetObject
s3:GetObjectVersion
s3:ListBucket
참고
추가 SQL 작업을 수행하기 위해 필요한 추가적인 권한은 다음과 같습니다.
권한 |
SQL 작업 |
---|---|
|
파일을 버킷에 언로드합니다. |
|
로드한 후 스테이지에서 파일을 자동으로 제거하거나 또는 REMOVE 문을 실행하여 수동으로 파일을 제거합니다. |
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에 단일 버킷 및 폴더 경로를 사용하여 데이터를 로드하거나 언로드하기 위해 필요한 권한을 제공합니다. PURGE 복사 옵션을 사용하여 데이터 파일을 제거할 수도 있습니다.
텍스트를 복사하여 정책 편집기에 붙여넣습니다.
참고
bucket
및prefix
를 실제 버킷 이름과 폴더 경로 접두사로 바꿔야 합니다.정부 리전 의 버킷에 대한 ARN(Amazon Resource Name)에는
arn:aws-us-gov:s3:::
접두사가 있습니다.
{ "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":
조건을["*"]
또는["<경로>/*"]
로 설정하면 지정된 버킷의 모든 접두사 또는 버킷의 경로에 각각 액세스 권한이 부여됩니다.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>/*" ] } } } ] }
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에서 액세스를 취소하면 캐시가 만료될 때까지 사용자가 파일을 나열하고 클라우드 저장소 위치에서 데이터를 로딩할 수 있습니다.
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 버킷에 액세스하기 위해 사용하는 통합에 관계없이 동일하게 지원됩니다.
다음 항목: AWS 데이터 파일 암호화