옵션 2: Amazon S3에 액세스하기 위한 AWS IAM 역할 구성하기 — 사용되지 않음

참고

더 이상 사용되지 않는 인증 방법을 사용할 때 assumeRole 오류가 발생할 수 있습니다.

이 섹션에서는 Snowflake 계정의 한 명 이상의 개별 사용자를 대신하여 Snowflake가 외부 스테이지에 안전하게 액세스할 수 있도록 S3 버킷, IAM 역할 및 정책을 구성하는 방법을 설명합니다.

가장 좋은 방법은 최소 필수 권한을 보유한 특정 IAM 역할로 S3 버킷 액세스를 제한하는 것입니다. IAM 역할은 S3 버킷에 액세스할 수 있는 권한 및 Snowflake가 IAM 역할을 수행하도록 허용하는 신뢰 정책과 함께 AWS 계정에 생성됩니다.

Trust policies allowing IAM user access to S3 bucket
  1. Snowflake 계정에 대해 생성된 AWS IAM 사용자는 신뢰 관계를 통해 구성한 IAM 역할과 연결됩니다.

  2. 사용자가 구성한 IAM 정책을 통해 역할에 S3 버킷에 대한 제한된 액세스 권한이 부여됩니다.

참고

이 항목의 지침을 완료하려면 AWS에 대한 관리 액세스 권한이 필요합니다. AWS 관리자가 아닌 경우 AWS 관리자에게 이러한 작업을 수행하도록 요청하십시오.

이 항목의 내용:

1단계: S3 버킷 액세스 허가 구성하기

AWS 액세스 제어 요구 사항

Snowflake가 폴더(및 모든 하위 폴더)의 파일에 액세스하기 위해 필요한 S3 버킷 및 폴더 권한은 다음과 같습니다.

  • s3:GetBucketLocation

  • s3:GetObject

  • s3:GetObjectVersion

  • s3:ListBucket

참고

추가 SQL 작업을 수행하기 위해 필요한 추가적인 권한은 다음과 같습니다.

권한

SQL 작업

s3:PutObject

파일을 버킷에 언로드합니다.

s3:DeleteObject

로드한 후 스테이지에서 파일을 자동으로 제거하거나 또는 REMOVE 문을 실행하여 수동으로 파일을 제거합니다.

Snowflake는 S3 버킷에 대한 Snowflake 액세스에 대한 IAM 정책을 생성하는 것을 모범 사례로 권장합니다. 그러면 정책을 역할에 연결하고 AWS에서 역할에 대해 생성한 보안 자격 증명을 사용하여 버킷의 파일에 액세스할 수 있습니다.

IAM 정책 만들기

다음 단계별 지침에서는 S3 버킷을 사용하여 데이터를 로드 및 언로드할 수 있도록 AWS 관리 콘솔에서 Snowflake에 대한 액세스 허가를 구성하는 방법을 설명합니다.

  1. AWS 관리 콘솔에 로그인합니다.

  2. 홈 대시보드에서 Identity & Access Management (IAM)를 선택합니다.

    Identity & Access Management in AWS Management Console
  3. 왼쪽 탐색 창에서 Account settings 을 선택합니다.

  4. Security Token Service Regions 목록을 확장하고 계정이 위치한 리전 에 해당하는 AWS 리전을 찾아 상태가 Inactive 이면 Activate 을 선택합니다.

  5. 왼쪽 탐색 창에서 Policies 을 선택합니다.

  6. Create Policy 을 클릭합니다.

    Create Policy button on Policies page
  7. JSON 탭을 클릭합니다.

  8. Snowflake가 S3 버킷 및 폴더에 액세스하도록 허용하는 정책 문서를 추가합니다.

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

    텍스트를 복사하여 정책 편집기에 붙여넣습니다.

    참고

    bucketprefix 를 실제 버킷 이름과 폴더 경로 접두사로 바꿔야 합니다.

    {
        "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>/*"
                        ]
                    }
                }
            }
        ]
    }
    
    Copy

    참고

    "s3:prefix": 조건을 ["*"] 또는 ["<경로>/*"] 로 설정하면 지정된 버킷의 모든 접두사 또는 버킷의 경로에 각각 액세스 권한이 부여됩니다.

    AWS 정책은 다양한 보안 사용 사례를 지원합니다.

    다음 정책은 Snowflake에 단일 읽기 전용 버킷 및 폴더 경로에서 데이터를 로드하기 위해 필요한 권한을 제공합니다. 이 정책에는 s3:GetBucketLocation, s3:GetObject, s3:GetObjectVersions3: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>/*"
                        ]
                    }
                }
            }
        ]
    }
    
    Copy
  9. Review policy 를 클릭합니다.

  10. 정책 이름(예: snowflake_access)과 선택 사항으로 설명을 입력합니다. 그리고 Create policy 를 클릭하여 정책을 생성합니다.

    Create Policy button in Review Policy page

2단계: AWS IAM 역할 만들기

AWS 관리 콘솔에서 데이터 파일이 포함된 S3 버킷에 대한 권한을 부여하는 AWS IAM 역할을 생성합니다.

  1. AWS 관리 콘솔에 로그인합니다.

  2. 홈 대시보드에서 Identity & Access Management (IAM)를 선택합니다.

    Identity & Access Management in AWS Management Console
  3. 왼쪽 탐색 창에서 Roles 을 선택합니다.

  4. Create role 버튼을 클릭합니다.

    Select Trusted Entity Page in AWS Management Console
  5. Another AWS account 을 신뢰할 수 있는 엔터티 타입으로 선택합니다.

  6. Account ID 필드에 본인의 AWS 계정 ID를 입력합니다. 이후에 신뢰할 수 있는 관계를 수정하고 Snowflake에 대한 액세스 권한을 부여합니다. 이 지침의 뒷부분에서 AWS 리소스(즉, S3)에 대한 액세스 권한을 제3자(이 경우 Snowflake)에 부여하려면 외부 ID가 필요합니다.

  7. Require external ID 옵션을 선택합니다. 0000 과 같은 더미 ID를 입력합니다. 이후에 신뢰 관계를 수정하고 Snowflake 스테이지에 대한 외부 ID를 지정합니다.

  8. Next 버튼을 클릭합니다.

  9. 이 항목의 1단계: S3 버킷 액세스 허가 구성하기 에서 생성한 정책을 찾아 이 정책을 선택합니다.

  10. Next 버튼을 클릭합니다.

    Review Page in AWS Management Console
  11. 역할의 이름과 설명을 입력하고 Create role 버튼을 클릭합니다.

    이제 버킷에 대한 IAM 정책을 생성하고 IAM 역할을 생성하며 정책을 역할에 연결했습니다.

  12. 역할 요약 페이지에 있는 Role ARN 값을 기록합니다. 다음 단계에서는 이 역할을 보안 자격 증명으로 참조하는 Snowflake 스테이지를 생성합니다.

    IAM Role

참고

Snowflake는 어떤 기간 동안(60분의 만료 시간을 초과할 수는 없음) 임시 자격 증명을 캐시합니다. Snowflake에서 액세스를 취소하면 캐시가 만료될 때까지 사용자가 파일을 나열하고 클라우드 저장소 위치에서 데이터를 로딩할 수 있습니다.

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

생성한 AWS 역할을 참조하는 외부(즉, S3) 스테이지를 생성합니다.

  1. 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');
    
    Copy
  2. 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                 |                  |
    +--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------+
    
    Copy
  3. 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 관리 콘솔에서, 이 항목의 3단계: 외부 스테이지 만들기 에서 기록한 스테이지 속성을 사용하여 IAM 역할을 구성합니다.

  1. AWS 관리 콘솔에 로그인합니다.

  2. 홈 대시보드에서 Identity & Access Management (IAM)를 선택합니다.

    Identity & Access Management in AWS Management Console
  3. 왼쪽 탐색 창에서 Roles 을 선택하고 이 항목의 2단계: AWS IAM 역할 만들기 에서 생성한 역할을 클릭합니다.

  4. Trust relationships 탭을 클릭하고 Edit trust relationship 버튼을 클릭합니다.

  5. Policy Document 필드에서 스테이지에 대한 속성 값과 함께 정책을 업데이트합니다.

    • AWS: SNOWFLAKE_IAM_USER 스테이지 속성에 대한 ARN을 입력합니다. 즉, 이 예에서 제공된 arn:aws:iam::123456789001:user/vj4g-a-abcd1234 를 입력합니다.

    • sts:ExternalId: 생성된 외부 ID를 입력합니다. 즉, 이 예에서 제공된 MYACCOUNT_SFCRole=2_jYfRf+gT0xSH7G2q0RAODp00Cqw= 를 입력합니다.

      {
          "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="
                    }
                }
            }
          ]
      }
      
      Copy

      참고

      위의 신뢰 정책은 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의 목적은 외부 스테이지에 대한 신뢰 정책으로 제한되므로, IDs에 대한 Snowflake 역할 매핑은 사용할 수 없습니다. 할당된 역할에 대한 역할 ID는 DESCRIBE STAGE 출력의 AWS_EXTERNAL_ID 값에만 노출됩니다. 가장 좋은 방법은 외부 S3 스테이지를 생성하는 기능을 단일 Snowflake 역할로 제한하는 것입니다.

        스테이지를 생성하는 역할이 스테이지 소유자(즉, 스테이지에 대한 OWNERSHIP 권한이 있는 역할)와 반드시 동일한 것은 아닙니다. 스테이지의 소유권은 신뢰 정책에서 해당 내용을 변경하지 않고 나중에 다른 역할로 이전할 수 있습니다.

      보안상의 이유로 새 저장소 통합을 생성하면(또는 CREATE OR REPLACE STORAGEINTEGRATION 구문을 사용하여 기존 저장소 통합을 다시 생성) 결과 통합의 ID가 다르므로 신뢰 정책이 수정되는 경우를 제외하고 IAM 역할을 수행할 수 없습니다.

      보안 수준이 낮은 일련의 제한이 있는 신뢰 정책(즉, 계정의 모든 외부 스테이지를 지원하는 정책)이 필요한 경우 외부 ID의 random_id 를 와일드카드 문자(*)로 바꿉니다.

      snowflake_account_SFCRole=snowflake_role_id_* (예: 현재 예제의 MYACCOUNT_SFCRole=2_*).

      이 외부 ID 형식을 사용하면 계정에서 동일한 Snowflake 역할(즉, SYSADMIN)의 사용자가 생성한 모든 외부 S3 스테이지가 IAM 역할을 수행할 수 있으며, 그 결과 모든 S3 버킷에 IAM 역할이 액세스할 수 있습니다. 보안 수준이 낮은 이러한 유형의 신뢰 정책을 구현하려면 반드시 ConditionStringEquals 에서 StringLike 로 변경해야 합니다.

  6. Update Trust Policy 버튼을 클릭합니다.

이제 AWS 역할을 사용하여 S3 버킷에 액세스하기 위한 일회성 설정이 완료되었습니다.

다음 항목: AWS 데이터 파일 암호화