Amazon S3의 외부 볼륨 구성하기¶
Snowflake의 Apache Iceberg™ 테이블에 대한 외부 볼륨을 사용하여 Amazon S3 버킷에 대한 Snowflake 제한 액세스 권한을 부여합니다.
모범 사례로, S3 위치에 대한 Snowflake 액세스 권한을 부여하는 지정된 IAM 정책을 만듭니다. 그런 다음 정책을 역할에 첨부하고 해당 역할에 대해 AWS에서 생성한 보안 자격 증명을 사용하여 파일에 액세스할 수 있습니다.
전제 조건¶
외부 볼륨을 구성하기 전에 다음을 수행해야 합니다.
Snowflake 계정을 호스팅하는 동일한 리전에 있는 S3 저장소 버킷.
외부에서 관리되는 Iceberg 테이블에 외부 볼륨을 사용하려면 모든 테이블 데이터와 메타데이터 파일이 버킷에 있어야 합니다.
Snowflake는 버킷 이름에 점(예:
my.s3.bucket
)이 포함된 외부 볼륨은 지원할 수 없습니다. Snowflake는 가상 호스팅 스타일 경로와 HTTPS를 사용하여 S3의 데이터에 액세스합니다. 그러나 S3는 이름에 점이 있는 가상 호스팅 스타일 버킷에 대해서는 SSL을 지원하지 않습니다.데이터 복구를 지원하려면 외부 클라우드 저장소 위치에 대한 버전 관리를 활성화하십시오.
IAM 정책 및 역할을 만들고 관리할 수 있는 AWS의 권한. AWS 관리자가 아닌 경우 AWS 관리자에게 이러한 작업을 수행하도록 요청하십시오.
1단계: S3 위치에 대한 액세스 권한을 부여하는 IAM 정책 만들기¶
AWS Management Console에서 Snowflake에 대한 액세스 권한을 구성하려면 다음을 수행하십시오.
AWS Management Console에 로그인합니다.
홈 대시보드에서 IAM 을 검색하여 선택합니다.
왼쪽 탐색 창에서 Account settings 를 선택합니다.
Endpoints 목록의 Security Token Service (STS) 에서 사용자의 계정이 위치한 Snowflake 리전 을 찾습니다. STS status 가 비활성 상태인 경우 토글을 Active 로 이동합니다.
왼쪽 탐색 창에서 Policies 를 선택합니다.
Create Policy 를 선택합니다.
Policy editor 에서 JSON 을 선택합니다.
Snowflake에 S3 위치에서 데이터를 읽고 쓸 수 있는 필요한 권한을 제공하는 정책을 추가합니다.
다음 예제 정책은 지정된 버킷의 모든 위치에 대한 액세스 권한을 부여합니다.
참고
my_bucket
을 실제 버킷 이름으로 바꿉니다. 버킷에 경로를 지정할 수도 있습니다(예:my_bucket/path
)."s3:prefix":
조건을["*"]
로 설정하면 지정된 버킷의 모든 접두사에 대한 액세스 권한이 부여되고,["path/*"]
로 설정하면 버킷의 지정된 경로에 대한 액세스 권한이 부여됩니다.정부 리전 에 있는 버킷의 경우, 버킷 ARNs은
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:::<my_bucket>/*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::<my_bucket>", "Condition": { "StringLike": { "s3:prefix": [ "*" ] } } } ] }
Next 를 선택합니다.
Policy name (예:
snowflake_access
)과 선택 사항인 Description 을 입력합니다.Create policy 를 선택합니다.
2단계: IAM 역할 만들기¶
데이터 파일이 포함된 S3 버킷에 대한 권한을 부여하는 AWS IAM 역할을 생성합니다.
ID 및 액세스 관리(IAM) 대시보드의 왼쪽 탐색 창에서 Roles 를 선택합니다.
Create role 을 선택합니다.
신뢰할 수 있는 엔터티 유형에는 AWS account 를 선택합니다.
An AWS account 에서 This account 를 선택합니다. 이후 단계에서는 신뢰 관계를 수정하고 Snowflake에 대한 액세스 권한을 부여합니다.
Require external ID 옵션을 선택합니다. 선택한 외부 ID 를 입력합니다. 예:
iceberg_table_external_id
.AWS 리소스(예: S3 버킷)에 대한 액세스 권한을 Snowflake와 같은 서드 파티에 부여하는 데 외부 ID가 사용됩니다.
Next 를 선택합니다.
외부 볼륨에 대해 생성한 정책을 선택한 다음 Next 를 선택합니다.
역할의 Role name 및 설명을 입력한 다음 Create role 을 선택합니다.
S3 위치에 대한 IAM 정책을 생성하고 IAM 역할을 생성하며 정책을 역할에 연결했습니다.
View role 을 선택하여 역할 요약 페이지를 확인합니다. 역할의 ARN (Amazon 리소스 이름) 값을 찾아서 기록합니다.
3단계: SSE-KMS 암호화에 필요한 권한을 IAM 역할에 부여(선택 사항)¶
AWS KMS 키를 사용하여 암호화된 오브젝트를 Amazon S3에 업로드하려면 외부 볼륨에 대해 생성한 IAM 역할에 키에 대한 kms:GenerateDataKey
권한이 필요합니다. AWS KMS 키로 암호화된 오브젝트를 다운로드하려면 IAM 역할에 키에 대한 kms:Decrypt
권한이 필요합니다.
서버 측 암호화에 KMS 키를 사용하려면 다음 단계에 따라 키를 만들고 참조하십시오.
AWS Management Console에서 키 관리 서비스(KMS)로 이동합니다. 왼쪽 탐색에서 Customer managed keys 를 선택한 다음 Create key 를 선택합니다. 버킷과 동일한 리전에 키를 생성해야 합니다.
Symmetric 키 유형을 만듭니다. 키 사용량은 Encrypt and decrypt 를 선택하십시오. Next 를 선택합니다.
Alias 에, 키의 이름을 입력하고 Next 를 선택합니다.
필요한 경우 키의 관리자를 선택하고 Next 를 선택합니다.
Define key usage permissions 에서, IAM 역할을 선택하고 Next 를 선택합니다.
키 구성 세부 정보를 검토한 다음 Finish 를 선택하여 키를 생성합니다.
고객 관리 키 목록에서 키를 찾아 선택하고 해당 ARN을 기록합니다. 키의 ARN 예로는
arn:aws:kms:us-west-2:111111122222:key/1a1a11aa-aa1a-aaa1a-a1a1-000000000000
을 들 수 있습니다.외부 볼륨을 생성할 때
KMS_KEY_ID
값을 키의 ARN으로 설정하십시오.
4단계: Snowflake에서 외부 볼륨 만들기¶
CREATE EXTERNAL VOLUME 명령을 사용하여 외부 볼륨을 생성합니다. 다음 예제에서는 암호화가 적용된 단일 Amazon S3 저장소 위치를 정의하는 이름이 iceberg_external_volume
인 외부 볼륨을 생성합니다.
CREATE OR REPLACE EXTERNAL VOLUME iceberg_external_volume
STORAGE_LOCATIONS =
(
(
NAME = 'my-s3-us-west-2'
STORAGE_PROVIDER = 'S3'
STORAGE_BASE_URL = 's3://<my_bucket>/'
STORAGE_AWS_ROLE_ARN = '<arn:aws:iam::123456789012:role/myrole>'
STORAGE_AWS_EXTERNAL_ID = 'iceberg_table_external_id'
)
);
예제에서는 외부 볼륨에 대해 생성한 IAM 역할과 연결된 외부 ID(iceberg_table_external_id
)를 지정합니다. 외부 ID를 지정하면 여러 외부 볼륨에서 동일한 IAM 역할(및 외부 ID)을 사용할 수 있습니다.
참고
AWS에서 제공한 대로 ARNs를 정확하게 지정합니다. ARNs는 대/소문자 구분합니다.
5단계: Snowflake 계정에 대한 AWS IAM 사용자 검색¶
DESCRIBE EXTERNAL VOLUME 명령을 사용하여 Snowflake 계정에 대해 자동으로 생성된 AWS IAM 사용자에 대한 ARN를 검색합니다. 외부 볼륨의 이름을 지정합니다.
다음 예제에서는 이름이
iceberg_external_volume
인 외부 볼륨을 설명합니다.DESC EXTERNAL VOLUME iceberg_external_volume;
Snowflake 계정에 대해 생성된 AWS IAM 사용자인
STORAGE_AWS_IAM_USER_ARN
속성의 값을 기록합니다(예:arn:aws:iam::123456789001:user/abc1-b-self1234
).Snowflake는 전체 Snowflake 계정에 대해 단일 IAM 사용자를 프로비저닝합니다. 계정의 모든 S3 외부 볼륨은 해당 IAM 사용자를 사용합니다.
참고
외부 볼륨을 생성할 때 외부 ID(
STORAGE_AWS_EXTERNAL_ID
)를 지정하지 않은 경우 Snowflake는 사용할 수 있는 ID를 생성합니다. 생성된 외부 ID로 IAM 역할 신뢰 정책을 업데이트할 수 있도록 값을 기록합니다.
6단계: 버킷 오브젝트에 액세스할 수 있도록 IAM 사용자 권한 부여¶
이 단계에서는 Snowflake 계정의 IAM 사용자가 S3 버킷의 오브젝트에 액세스할 수 있도록 허용하는 권한을 구성합니다.
AWS Management Console에 로그인합니다.
홈 대시보드에서 IAM 을 검색하여 선택합니다.
왼쪽 탐색 창에서 Roles 를 선택합니다.
외부 볼륨에 대해 생성한 IAM 역할을 선택합니다.
Trust relationships 탭을 선택합니다.
Edit trust policy 를 선택합니다.
기록한 DESC EXTERNAL VOLUME 출력 값으로 정책 문서를 수정합니다.
IAM 역할에 대한 정책 문서
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "<snowflake_user_arn>" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "<iceberg_table_external_id>" } } } ] }
여기서
snowflake_user_arn
은 사용자가 기록한 STORAGE_AWS_IAM_USER_ARN 값입니다.iceberg_table_external_id
는 사용자의 외부 ID입니다. 역할을 생성할 때 외부 ID를 이미 지정하고 동일한 ID를 사용하여 외부 볼륨을 생성한 경우에는 값을 그대로 둡니다. 그렇지 않으면, 기록해 둔 값으로sts:ExternalId
를 업데이트합니다.
참고
새 외부 볼륨을 생성하고(또는 CREATE OR REPLACE EXTERNAL VOLUME 구문을 사용하여 기존 외부 볼륨을 다시 생성하고) 자체 외부 ID를 제공하지 않는 경우 이 정책 문서를 업데이트해야 합니다. 보안상의 이유로, 새 외부 볼륨이나 다시 생성된 외부 볼륨에는 다른 외부 ID가 있으며 이 신뢰 정책을 업데이트하지 않으면 신뢰 관계를 확인할 수 없습니다.
Update policy 를 선택하여 변경 사항을 저장합니다.
7단계: 저장소 액세스 확인¶
Snowflake가 저장소 공급자를 성공적으로 인증할 수 있는지 확인하려면 SYSTEM$VERIFY_EXTERNAL_VOLUME 함수를 호출합니다.
SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('my_s3_external_volume');
다음 단계¶
외부 볼륨을 구성하면 Iceberg 테이블을 생성할 수 있습니다.
외부 카탈로그를 사용하는 읽기 전용 Iceberg 테이블을 만들려면 카탈로그 통합 구성하기 섹션을 참조하십시오.
Snowflake 플랫폼이 완벽하게 지원되는 Iceberg 테이블을 만들려면 Snowflake 관리 테이블 만들기 를 참조하십시오.