Amazon Redshift에서 다른 계정의 Amazon S3 버킷으로 데이터를 COPY 또는 UNLOAD하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2020년 10월 9일

Amazon Redshift와 다른 계정에 있는 Amazon Simple Storage Service(Amazon S3) 버킷 간에 데이터를 COPY 또는 UNLOAD하려고 합니다. 하지만 다른 계정에서 AWS Identity and Access Management(IAM) 역할을 수임할 수 없습니다. 교차 계정 액세스를 설정하려면 어떻게 해야 합니까?

간략한 설명

Amazon Redshift를 사용 중인 계정과 다른 계정에 있는 Amazon S3 리소스에 액세스하려면 다음 단계를 수행하십시오.

1.    Amazon S3 계정에서 IAM 역할인 RoleA를 생성합니다.

2.    RoleA를 수임할 권한이 있는 Amazon Redshift 계정에서 IAM 역할 RoleB를 생성합니다.

3.    RoleARoleB 간의 교차 계정 액세스를 테스트합니다.

해결 방법

참고: 다음 단계에서는 Amazon Redshift 클러스터와 S3 버킷이 동일한 리전에 있다고 가정합니다. 이 둘이 서로 다른 리전에 있다면 COPY 또는 UNLOAD 명령에 REGION 파라미터를 추가해야 합니다.

Amazon S3(RoleA)를 사용하는 계정에서 IAM 역할을 생성합니다.

1.    IAM 콘솔을 엽니다.

2.    [Policies]를 선택한 후 [Create policy]를 선택합니다.

3.    JSON 탭을 선택하고 다음과 같은 IAM 정책을 입력합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": [
                "<KMS_KEY_ARN_A_Used_for_S3_encryption>"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::awsexamplebucket",
                "arn:aws:s3:::awsexamplebucket/*"
            ]
        }
    ]
}

awsexamplebucket은 액세스하려는 S3 버킷의 이름으로 바꿉니다. 또한 KMS_KEY_ARN_A_Used_for_S3_encryption은 S3 버킷을 암호화하는 데 사용되는 AWS Key Management Service(AWS KMS)의 Amazon 리소스 이름(ARN)으로 바꿉니다.

참고: S3 버킷이 AWS KMS 키로 암호화되지 않은 경우에는 KMS 권한이 필요하지 않습니다.

4.    [Review policy]를 선택합니다.

5.    정책 이름(예: policy_for_roleA)을 입력한 다음 정책 생성을 선택합니다.

6.    탐색 창에서 역할을 선택합니다.

7.    역할 생성을 선택합니다.

8.    신뢰할 수 있는 엔터티 역할로 다른 AWS 계정을 선택합니다.

9.    Amazon Redshift를 사용 중인 계정의 AWS 계정 ID를 입력합니다.

10.    다음: 권한을 선택한 후 방금 생성한 정책(policy_for_roleA)을 선택합니다.

11.    [다음: 태그(Next: Tags)]를 선택한 후 [다음: 검토(Next: Review)]를 선택합니다. 태그는 필요하지 않습니다.

12.    역할 이름(예: RoleA)을 입력합니다.

13.    [역할 생성(Create role)]을 선택합니다.

RoleA를 수임할 권한이 있는 Amazon Redshift 계정에서 IAM 역할(RoleB) 생성

1.    IAM 콘솔을 엽니다.

2.    [Policies]를 선택한 후 [Create policy]를 선택합니다.

3.    JSON 탭을 선택하고 다음과 같은 IAM 정책을 입력합니다.

{
    "Version": "2012-10-17",
    "Statement": [
            {
            "Sid": "CrossAccountPolicy",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "AmazonS3AccountRoleARN"
        }
    ]
}

AmazonS3AccountPolicy는 S3 계정에서 생성한 정책의 ARN으로 바꿉니다.

4.    [Review policy]를 선택합니다.

5.    정책 이름(예: policy_for_roleB)을 입력한 다음 정책 생성을 선택합니다.

6.    탐색 창에서 역할을 선택합니다.

7.    역할 생성을 선택합니다.

8.    신뢰할 수 있는 엔터티 유형으로 AWS 서비스를 선택합니다.

9.    Redshift를 선택합니다.

10.    Redshift - 사용자 지정 가능을 선택합니다.

11.    다음: 권한을 선택한 후 방금 생성한 정책(policy_for_roleB)을 선택합니다.

12.    [다음: 태그(Next: Tags)]를 선택한 후 [다음: 검토(Next: Review)]를 선택합니다. 태그는 필요하지 않습니다.

13.    역할 이름(예: RoleB)을 입력합니다.

14.    [역할 생성(Create role)]을 선택합니다.

15.    IAM 역할(RoleB)을 Amazon Redshift 클러스터와 연결합니다.

참고: Amazon Redshift에서 IAM 역할을 연결하면 Amazon Redshift 클러스터가 RoleB를 수임하고, 그런 다음 RoleA를 수임합니다. 이 역할 연결을 통해 Amazon Redshift가 Amazon S3에 액세스할 수 있습니다.

S3 버킷과 Amazon Redshift 간의 교차 계정 액세스 테스트

COPY 명령을 실행하여 S3 버킷에서 Amazon Redshift로 데이터를 가져옵니다.

copy table_name from 's3://awsexamplebucket/crosscopy1.csv' iam_role 'arn:aws:iam::Amazon_Redshift_Account_ID:role/RoleB,arn:aws:iam::Amazon_S3_Account_ID:role/RoleA' delimiter ',' removequotes;

예제에서 다음 값을 대체합니다.

table_name: Amazon S3 데이터를 복사하려는 Amazon Redshift 테이블
s3://awsexamplebucket/crosscopy1.csv: 복사하려는 데이터가 있는 S3 버킷
Amazon_Redshift_Account_ID: Amazon Redshift 계정의 AWS 계정 ID
RoleB: 생성한 두 번째 역할
Amazon_S3_Account_ID: Amazon S3 계정의 AWS 계정 ID
RoleA: 생성한 첫 번째 역할

그런 다음 UNLOAD 명령을 실행하여 Amazon Redshift에서 S3 버킷으로 데이터를 언로드하는 방식으로 교차 계정 액세스를 확인합니다.

unload ('select * from table_name') to 's3://awsexamplebucket/folder/test.dat' iam_role 'arn:aws:iam::Amazon_Redshift_Account_ID:role/RoleB,arn:aws:iam::Amazon_S3_Account_ID:role/RoleA' KMS_KEY_ID 'ARN_KMS_KEY_ID' ENCRYPTED;

예제에서 다음 값을 대체합니다.

table_name: S3 버킷으로 업로드하려는 Amazon Redshift 테이블
s3://awsexamplebucket/folder/test.dat: Amazon Redshift 데이터를 언로드할 S3 경로
Amazon_Redshift_Account_ID: Amazon Redshift 계정의 AWS 계정 ID
RoleB: 생성한 두 번째 역할
Amazon_S3_Account_ID: Amazon S3 계정의 AWS 계정 ID
RoleA: 생성한 첫 번째 역할
ARN_KMS_KEY_ID: S3 버킷을 암호화하는 데 사용되는 KMS 키 ID의 ARN