내 Amazon S3 버킷에는 다른 계정의 Amazon Redshift 클러스터에서 UNLOAD 명령을 사용하여 생성한 데이터 파일이 있습니다. 이러한 파일에 액세스할 수 없는 이유는 무엇입니까?

최종 업데이트 날짜: 2019년 7월 29일

Amazon Simple Storage Service(Amazon S3) 버킷에 다른 AWS 계정의 Amazon Redshift 클러스터에서 UNLOAD 명령을 사용하여 생성한 데이터 파일이 있습니다. 그러나 계정에서 해당 파일에 액세스하려고 하면 403 Access Denied 오류가 나타납니다. 이 문제를 해결하려면 어떻게 해야 합니까? 

간략한 설명

기본적으로 S3 객체는 해당 객체를 업로드한 AWS 계정의 소유입니다. 이는 버킷을 다른 계정에서 소유하는 경우에도 마찬가지입니다. UNLOAD 명령의 Amazon Redshift 데이터 파일은 다른 계정에 의해 사용자의 버킷에 저장되었기 때문에 사용자(버킷 소유자)에게는 해당 파일에 액세스 할 수 있는 기본 권한이 없습니다.

데이터 파일에 액세스하려면 교차 계정 권한이 있는 AWS Identity and Access Management(IAM) 역할이 UNLOAD 명령을 재실행해야 합니다. 버킷에 대한 교차 계정 권한이 있는 Amazon Redshift 클러스터를 설정하려면 다음 단계를 따르십시오.

1.    S3 버킷 계정에서 버킷에 대한 권한이 있는 IAM 역할(버킷 역할)을 생성하십시오.

2.    Amazon Redshift 클러스터의 계정에서 버킷 역할을 맡을 수 있는 권한이 있는 다른 IAM 역할(클러스터 역할)을 생성하십시오.

3.    버킷 액세스를 허용하고 클러스터 역할과 신뢰 관계를 구축하려면 버킷 역할을 업데이트하십시오.

4.    Amazon Redshift 클러스터에서 클러스터 역할 및 버킷 역할을 사용하여 UNLOAD 명령을 실행하십시오.

중요: 이 솔루션은 AWS Key Management Service(AWS KMS)를 통해 서버 측 암호화를 사용하는 Amazon Redshift 클러스터 또는 S3 버킷에는 적용되지 않습니다.

해결 방법

S3 버킷 계정에서 버킷에 대한 권한이 있는 IAM 역할(버킷 역할)을 생성

1.    S3 버킷의 계정에서 IAM 콘솔을 엽니다.

2.    IAM 역할을 생성합니다. 역할을 생성할 때 다음을 선택합니다.
신뢰할 수 있는 유형의 개체 선택 섹션에서 AWS 서비스를 선택합니다.
이 역할을 사용할 서비스 선택 섹션에서 Redshift를 선택합니다.
사용 사례 선택에서 Redshift - 사용자 지정 가능을 선택합니다.

3.    IAM 역할을 생성한 후 버킷에 권한을 부여하는 정책을 연결합니다. 다음과 비슷한 정책을 사용할 수 있습니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234537676482",
      "Action": [
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::awsexamplebucket/*",
        "arn:aws:s3:::awsexamplebucket"
      ]
    }
  ]
}

4.    버킷 역할의 Amazon 리소스 이름(ARN)을 확인하십시오. 이후 단계에서 이 역할의 ARN이 필요합니다.

Amazon Redshift 클러스터의 계정에서 버킷 역할을 맡을 권한이 있는 다른 IAM 역할(클러스터 역할)을 생성

1.    Amazon Redshift 클러스터 계정에서 IAM 콘솔을 여십시오.

2.    IAM 역할을 생성합니다. 역할을 생성할 때 다음을 선택합니다.
신뢰할 수 있는 유형의 개체 선택 섹션에서 AWS 서비스를 선택합니다.
이 역할을 사용할 서비스 선택 섹션에서 Redshift를 선택합니다.
사용 사례 선택에서 Redshift - 사용자 지정 가능을 선택합니다.

3.    IAM 역할을 생성한 후에는 다음 정책을 역할에 연결하십시오.

중요: arn:aws:iam::123456789012:role/Bucket_Role을 생성한 버킷 역할의 ARN으로 바꾸십시오.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234537501110",
      "Action": [
        "sts:AssumeRole"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:iam::123456789012:role/Bucket_Role"
    }
  ]
}

4.    클러스터 역할의 ARN을 확인하십시오. 이후 단계에서 이 역할의 ARN이 필요합니다.

버킷 역할을 업데이트하여 클러스터 역할과 신뢰 관계를 구축

1.    S3 버킷의 계정에서 IAM 콘솔을 엽니다.

2.    탐색 창에서 [역할]을 선택합니다.

3.    역할 목록에서 생성한 버킷 역할을 엽니다.

4.    신뢰 관계 탭을 선택합니다.

5.    신뢰 관계 편집을 선택합니다.

6.    정책 문서에서 기존 정책을 다음 내용으로 바꿉니다.

중요: arn:aws:iam::012345678901:role/Cluster_Role을 생성한 클러스터 역할의 ARN으로 바꾸십시오.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::012345678901:role/Cluster_Role"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

7.    그런 다음 신뢰 정책 업데이트를 선택합니다.

Amazon Redshift 클러스터에서 클러스터 역할 및 버킷 역할을 사용하여 언로드 작업을 실행

1.    Amazon Redshift 클러스터에 연결하십시오.

2.    다음과 유사한 방식으로 생성한 IAM 역할을 모두 사용해 UNLOAD 명령을 실행하십시오.

중요: arn:aws:iam::012345678901:role/Cluster_Role을 클러스터 역할의 ARN으로 바꾸십시오. 그런 다음, arn:aws:iam::123456789012:role/Bucket_Role을 버킷 역할의 ARN으로 바꾸십시오.

unload ('select * from TABLE_NAME')
to 's3://awsexamplebucket' 
iam_role 'arn:aws:iam::012345678901:role/Cluster_Role,arn:aws:iam::123456789012:role/Bucket_Role';

UNLOAD 명령을 실행하면 데이터 파일은 저장되어 있는 버킷과 동일한 계정에 의해 소유됩니다.


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?