옵션 2: Amazon S3에 접근하도록 AWS IAM 역할 구성 — *더 이상 사용되지 않음*
옵션 2: Amazon S3에 접근하도록 AWS IAM 역할 구성 — 더 이상 사용되지 않음
더 이상 사용되지 않는 기능 — 프라이빗 S3 버킷에 접근해 데이터를 로드하거나 언로드하기 위해 AWS IAM 역할을 사용하는 기능은 이제 더 이상 사용되지 않아요(즉, 향후 릴리스에서 지원이 제거될 예정). 이 기능을 사용하는 기존 S3 스테이지를 수정해 스토리지 통합 객체(이 주제의 옵션 1)를 참조하도록 하는 것을 매우 권장해요.
참고 — 더 이상 사용되지 않는 인증 방법을 사용할 때
assumeRole오류가 발생할 수 있어요.
이 섹션은 Snowflake 계정의 한 명 이상의 개별 사용자를 대신해 Snowflake가 보안 방식으로 외부 스테이지에 접근할 수 있도록 S3 버킷, IAM 역할, 정책을 구성하는 방법을 설명해요.
모범 사례로, S3 버킷 액세스를 최소 필요 권한이 있는 특정 IAM 역할로 제한해요. IAM 역할은 AWS 계정에서 S3 버킷에 접근할 권한과 Snowflake가 그 IAM 역할을 수임(assume)하도록 허용하는 신뢰 정책과 함께 만들어져요.
- Snowflake 계정을 위해 만들어진 AWS IAM 사용자는 신뢰 관계를 통해 구성한 IAM 역할과 연결돼요.
- 구성한 IAM 정책을 통해 역할에 S3 버킷에 대한 제한된 액세스가 부여돼요.
참고 — 이 주제의 지침을 완료하려면 AWS에 대한 관리자 액세스가 필요해요. AWS 관리자가 아니라면 관리자에게 이 작업을 수행하도록 요청해요.
출처: Documentation
본문
1단계: S3 버킷 액세스 권한 구성
AWS 액세스 제어 요구 사항
Snowflake가 폴더(및 하위 폴더)의 파일에 접근하려면 S3 버킷과 폴더에 다음 권한이 필요해요.
s3:GetBucketLocations3:GetObjects3:GetObjectVersions3:ListBucket
참고 — 추가 SQL 작업을 수행하려면 다음 추가 권한이 필요해요.
권한 SQL 작업 s3:PutObject 버킷으로 파일 언로드. s3:DeleteObject 성공적인 로드 후 스테이지에서 파일 자동 삭제 또는 REMOVE 문을 실행해 수동으로 파일 제거.
모범 사례로, Snowflake가 S3 버킷에 접근하도록 IAM 정책을 만드는 것을 권장해요. 그런 다음 정책을 역할에 연결하고 AWS가 역할에 대해 생성한 보안 자격 증명을 사용해 버킷의 파일에 접근할 수 있어요.
IAM 정책 만들기
다음 단계별 지침은 AWS Management Console에서 Snowflake에 대한 액세스 권한을 구성해 S3 버킷을 사용해 데이터를 로드하고 언로드하는 방법을 설명해요.
- AWS Management Console에 로그인해요.
- 홈 대시보드에서 IAM을 검색해 선택해요.
- 왼쪽 탐색 창에서 Account settings를 선택해요.
- Security Token Service Regions 목록을 펼쳐 계정이 위치한 리전에 해당하는 AWS 리전을 찾고, 상태가 Inactive이면 Activate를 선택해요.
- 왼쪽 탐색 창에서 Policies를 선택해요.
- Create Policy를 클릭해요.
- JSON 탭을 클릭해요.
- Snowflake가 S3 버킷과 폴더에 접근할 수 있게 하는 정책 문서를 추가해요.
다음 정책(JSON 형식)은 단일 버킷과 폴더 경로를 사용해 데이터를 로드하거나 언로드하는 데 필요한 권한을 Snowflake에 제공해요. PURGE 복사 옵션으로 데이터 파일을 삭제할 수도 있어요.
텍스트를 정책 편집기에 복사해 붙여넣어요.
참고 —
*bucket*과*prefix*를 실제 버킷 이름과 폴더 경로 접두사로 바꿔야 해요.
{
"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>/*"
]
}
}
}
]
}
- Review policy를 클릭해요.
- Policy name(예:
snowflake_access)과 선택적인 Description을 입력해요. - Create policy를 선택해요.
2단계: AWS IAM 역할 만들기
AWS Management Console에서 데이터 파일이 포함된 S3 버킷에 권한을 부여하는 AWS IAM 역할을 만들어요.
- IAM(Identity and Access Management) Dashboard의 왼쪽 탐색 창에서 Roles를 선택해요.
- Create role을 선택해요.
- 신뢰 엔터티 유형으로 AWS account를 선택해요.
- An AWS account 아래에서 This account를 선택해요. 이후 단계에서 신뢰 관계를 수정하고 Snowflake에 액세스를 부여해요.
- Require external ID 옵션을 선택해요.
0000같은 더미 ID를 입력해요. 나중에 신뢰 관계를 수정하고 Snowflake 스테이지의 외부 ID를 지정할 거예요. - Next 버튼을 클릭해요.
- (이 주제의) 1단계: S3 버킷 액세스 권한 구성에서 만든 정책을 찾아 선택해요.
- Next 버튼을 클릭해요.
- 역할 이름과 설명을 입력하고 Create role 버튼을 클릭해요.
이제 버킷에 대한 IAM 정책을 만들고, IAM 역할을 만들고, 정책을 역할에 연결했어요.
- 역할 요약 페이지에 있는 Role ARN 값을 기록해요. 다음 단계에서 이 역할을 보안 자격 증명으로 참조하는 Snowflake 스테이지를 만들 거예요.
참고 — Snowflake는 60분 만료 시간을 초과할 수 없는 기간 동안 임시 자격 증명을 캐시해요. Snowflake에서 액세스를 취소하면 사용자는 캐시가 만료될 때까지 클라우드 스토리지 위치에서 파일을 나열하고 데이터를 로드할 수 있을 수 있어요.
3단계: 외부 스테이지 만들기
만든 AWS 역할을 참조하는 외부(즉, S3) 스테이지를 만들어요.
- CREATE STAGE 명령으로 외부 스테이지를 만들거나, 기존 외부 스테이지를 변경해 CREDENTIALS 옵션을 설정할 수 있어요.
참고
- 자격 증명은 ENCRYPTION, FILE_FORMAT 같은 다른 스테이지 매개 변수와 별도로 처리돼요. 이러한 다른 매개 변수에 대한 지원은 외부 S3 버킷에 접근하는 데 사용되는 자격 증명과 관계없이 동일해요.
- URL 값에 슬래시(
/)를 추가해 지정된 폴더 경로로 필터링해요. 슬래시를 생략하면 지정된 경로의 접두사로 시작하는 모든 파일과 폴더가 포함돼요. 스테이지의 비정형 데이터 파일에 접근하고 검색하려면 슬래시가 필요하다는 점에 주의해요.
예를 들어 mydb.public을 사용자 세션의 현재 데이터베이스와 스키마로 설정한 다음 my_S3_stage라는 스테이지를 만들어요. 이 예제에서 스테이지는 S3 버킷과 경로 mybucket/load/files를 참조해요. S3 버킷의 파일은 서버 측 암호화(AWS_SSE_KMS)로 암호화돼요.
USE SCHEMA mydb.public;
CREATE STAGE my_s3_stage
URL='s3://mybucket/load/files'
CREDENTIALS = (AWS_ROLE = 'arn:aws:iam::001234567890:role/mysnowflakerole')
ENCRYPTION=(TYPE='AWS_SSE_KMS' KMS_KEY_ID = 'aws/key');
DESCRIBE STAGE 명령을 실행해 스테이지 속성을 확인해요.
DESC STAGE my_S3_stage;
+--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------+
| parent_property | property | property_type | property_value | property_default |
|--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------+
...
| STAGE_CREDENTIALS | AWS_ROLE | String | arn:aws:iam::001234567890:role/mysnowflakerole | |
| STAGE_CREDENTIALS | AWS_EXTERNAL_ID | String | MYACCOUNT_SFCRole=2_jYfRf+gT0xSH7G2q0RAODp00Cqw= | |
| STAGE_CREDENTIALS | SNOWFLAKE_IAM_USER | String | arn:aws:iam::123456789001:user/vj4g-a-abcd1234 | |
+--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------+
SNOWFLAKE_IAM_USER와 AWS_EXTERNAL_ID 속성의 값을 기록해요. 여기서:
- SNOWFLAKE_IAM_USER: Snowflake 계정을 위해 만들어진 AWS IAM 사용자. 이 사용자는 계정에 만들어진 모든 외부 S3 스테이지에 대해 동일해요.
- AWS_EXTERNAL_ID: 특정 스테이지에 할당된 고유 ID. ID 형식은
*snowflakeAccount*SFCRole=*snowflakeRoleId**randomId*이에요.
이 예제에서 사용된 AWS_ROLE, AWS_EXTERNAL_ID, SNOWFLAKE_IAM_USER 값은 설명 목적으로만 사용됐다는 점에 주의해요.
다음 단계에서 생성된 AWS 외부 ID를 사용해 Snowflake IAM 사용자에게 액세스를 부여하도록 AWS IAM 역할을 구성할 거예요.
4단계: 스테이지에 접근하도록 AWS IAM 역할 구성
AWS Management Console에서 (이 주제의) 3단계: 외부 스테이지 만들기에서 기록한 스테이지 속성을 사용해 IAM 역할을 구성해요.
- AWS Management Console에 로그인해요.
- 홈 대시보드에서 IAM을 검색해 선택해요.
- 왼쪽 탐색 창에서 Roles를 선택하고 (이 주제의) 2단계: AWS IAM 역할 만들기에서 만든 역할을 클릭해요.
- Trust relationships 탭을 클릭하고 Edit trust relationship 버튼을 클릭해요.
- Policy Document 필드에서 스테이지의 속성 값으로 정책을 업데이트해요.
- AWS: SNOWFLAKE_IAM_USER 스테이지 속성의 ARN을 입력해요. 이 예제에서는
arn:aws:iam::123456789001:user/vj4g-a-abcd1234. - sts:ExternalId: 생성된 외부 ID를 입력해요. 이 예제에서는
MYACCOUNT_SFCRole=2_jYfRf+gT0xSH7G2q0RAODp00Cqw=.
- AWS: SNOWFLAKE_IAM_USER 스테이지 속성의 ARN을 입력해요. 이 예제에서는
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::123456789001:user/vj4g-a-abcd1234"
]
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "MYACCOUNT_SFCRole=2_jYfRf+gT0xSH7G2q0RAODp00Cqw="
}
}
}
]
}
참고 — 위 신뢰 정책은 Snowflake 계정의 단일 외부 스테이지가 IAM 역할을 수임하도록 허용해요. 가장 제한적인 신뢰 정책이므로 가장 안전해요.
IAM 역할 수임 권한은 외부 ID와 연결돼요. 외부 ID의 형식은 *snowflake_account*SFCRole=*snowflake_role_id**random_id*이에요.
여기서:
*snowflake_account*는 Snowflake 계정에 할당된 이름.*snowflake_role_id*는 (이 주제의) 3단계: 외부 스테이지 만들기에서 스테이지를 만든 Snowflake 역할에 할당된 ID.
현재 예제에서 *snowflake_role_id* 값은 2예요. 이 ID는 Snowflake 계정의 단일 역할과 연결돼요. 이 ID의 목적은 외부 스테이지의 신뢰 정책으로 제한되므로, Snowflake 역할과 ID의 매핑은 제공되지 않아요. 주어진 역할의 역할 ID는 DESCRIBE STAGE 출력의 AWS_EXTERNAL_ID 값에서만 노출돼요. 모범 사례로, 외부 S3 스테이지를 만드는 기능을 단일 Snowflake 역할로 제한해요.
스테이지를 만드는 역할이 스테이지 소유자(즉, 스테이지에 OWNERSHIP 권한이 있는 역할)와 반드시 같지는 않다는 점에 주의해요. 스테이지 소유권은 나중에 다른 역할로 이전될 수 있으며 신뢰 정책에 해당 변경이 필요 없어요.
보안상의 이유로 새 스토리지 통합을 만들거나(CREATE OR REPLACE STORAGE INTEGRATION 문법으로 기존 스토리지 통합을 다시 만들면) 결과 통합은 다른 외부 ID를 가지므로 신뢰 정책이 수정되지 않는 한 IAM 역할을 수임할 수 없어요.
덜 안전한 제한 집합(즉, 계정의 모든 외부 스테이지를 지원하는 정책)이 있는 신뢰 정책이 필요하다면 외부 ID의 *random_id*를 와일드카드 문자(*)로 바꿔요. *snowflake_account*SFCRole=*snowflake_role_id**, 예를 들어 현재 예제에서는 MYACCOUNT_SFCRole=2_*.
이 형태의 외부 ID는 계정에서 같은 Snowflake 역할(즉, SYSADMIN)을 가진 사용자가 만든 모든 외부 S3 스테이지가 IAM 역할을 수임하고, 결과적으로 IAM 역할이 접근할 수 있는 모든 S3 버킷에 접근할 수 있게 해요. 이 덜 안전한 유형의 신뢰 정책을 구현한다면 Condition을 StringEquals에서 StringLike로 변경해야 한다는 점에 주의해요.
- Update Trust Policy 버튼을 클릭해요.
이제 AWS 역할을 사용해 S3 버킷에 접근하기 위한 일회성 설정을 완료했어요.