Amazon Redshift에서 UNLOAD 관련 문제를 해결하려면 어떻게 해야 합니까?

5분 분량
0

Amazon Redshift 클러스터에서 Amazon Simple Storage Service(S3) 로 데이터를 언로드하려고 합니다. 오류가 발생합니다. 이 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

Amazon Redshift 클러스터에서 Amazon S3 버킷으로 데이터를 언로드할 때 다음 오류가 발생할 수 있습니다.

DB 사용자에게 AWS Identity and Access Management(IAM) 역할을 수임할 권한 없음 오류

error:  User arn:aws:redshift:us-west-2:<account-id>:dbuser:<cluster-identifier>/<dbuser username> is not authorized to assume IAM Role arn:aws:iam::<account-id>:role/<Role name>

403 액세스 거부 오류

[Amazon](500310) Invalid operation: S3ServiceException:Access Denied,Status 403,Error AccessDenied,

참고: 데이터를 S3 버킷으로 언로드할 때 SELECT 문과 함께 UNLOAD 명령을 사용하십시오. 로드되는 동안 사용된 데이터 형식에 관계없이, 텍스트 데이터를 구분된 형식 또는 고정 폭 형식으로 언로드합니다. 압축된 gzip 파일을 제출할지 여부를 지정할 수도 있습니다.

S3에 지정된 언로드 대상이 비어 있지 않음

ERROR: Specified unload destination on S3 is not empty. Consider using a different bucket / prefix, manually removing the target files in S3, or using the ALLOWOVERWRITE option.

이 오류는 동일한 UNLOAD 명령을 실행하고 데이터 파일이 이미 있는 동일한 폴더에서 파일을 언로드하려 할 때 발생할 수 있습니다.

예를 들어, 다음 명령을 두 번 실행하면 이 오류가 발생합니다.

unload ('select * from test_unload')   
to 's3://testbucket/unload/test_unload_file1' 
iam_role 'arn:aws:iam::0123456789:role/redshift_role';

해결 방법

DB 사용자에게 AWS IAM 역할을 수임할 권한 없음 오류

데이터베이스 사용자에게 IAM 역할을 수임할 권한이 없는 경우 다음을 확인합니다.

403 액세스 거부 오류

S3 버킷에서 403 액세스 거부 오류가 발생하는 경우 S3 API 작업에 대해 적절한 권한이 부여되었는지 확인합니다.

"Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",       
        "s3:List*",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::your_bucket",
        "arn:aws:s3:::your_bucket/*"
      ]
    }
  ]
}

S3 관리형 암호화 키를 사용한 서버 측 암호화를 사용하는 경우 S3 버킷은 고유한 키로 각 객체를 암호화합니다. 추가적인 보호 조치로서 키 자체는 정기적으로 교체되는 루트 키로 암호화됩니다.

저장된 데이터를 암호화하려면 S3 버킷 정책의 s3:x-amz-server-side-encryption 파라미터가 “true”로 설정되어 있는지 확인합니다.

"Condition": {
   "Null": {
           "s3:x-amz-server-side-encryption": "true"
           }

KMS_KEY_ID가 암호화되어 암호화된 데이터를 S3 버킷에 UNLOAD할 수 있는지 확인합니다.

unload ('select * from a') to 's3://mybucket/test/varchar/' iam_role 'arn:aws:iam::xxxxxx:role/RedshiftS3Access' ALLOWOVERWRITE CSV
KMS_KEY_ID '11111111111111111111111111'
encrypted;

S3 버킷이 AWS Key Management Service(AWS KMS)의 루트 키로 암호화된 경우 IAM 정책에 다음 권한을 추가합니다.

"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
]

S3에 지정된 언로드 대상이 비어 있지 않음

S3의 지정된 언로드 대상이 비어있지 않은 오류는 동일한 이름의 파일이 존재하는 폴더에서 파일 UNLOAD를 시도할 때 발생합니다.

이 오류 메시지를 해결하려면 다음의 옵션 중 하나를 선택합니다.

  • 새로운 Amazon S3 버킷을 생성하거나 다른 S3 버킷 사용
  • S3 키 접두사 변경
  • 대상 Amazon S3 버킷에 있는 파일 정리
  • ALLOWOVERWRITE 옵션을 UNLOAD 명령과 함께 사용하십시오.

새로운 Amazon S3 버킷을 생성하거나 다른 S3 버킷 사용

1.    새 S3 버킷을 생성하거나 기존의 다른 S3 버킷을 식별합니다.

2.    신규 또는 기존 버킷에 대한 S3 버킷의 버킷 정책을 업데이트합니다. 다음 예제 정책을 권한 정책으로 추가해야 합니다.

{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": [
        {
            "Sid": "ExampleStatement01",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::0123456789:user/<UserName>"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetBucketLocation",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::testbucket/*",
                "arn:aws:s3:::testbucket",
                "arn:aws:s3:::testbucket2/*",  --> Additional permission for new bucket
                "arn:aws:s3:::testbucket2"       
            ]
        }
    ]
}

3.    UNLOAD 명령에서 새 버킷 경로를 사용합니다. 다음 예시에서는 s3://testbucket2/unload/test_unload_file1이 새로운 버킷 경로입니다.

iam_role 'arn:aws:iam::0123456789:role/redshift_role';
unload ('select * from test_unload')   
to 's3://testbucket2/unload/test_unload_file1'

S3 키 접두사 변경

UNLOAD 명령을 사용할 때 S3 경로에서 S3 버킷 키 접두사를 변경합니다. 다음 예제에서 unload2는 변경된 접두사입니다.

iam_role 'arn:aws:iam::0123456789:role/redshift_role';
unload ('select * from test_unload')   
to 's3://testbucket/unload2/test_unload_file1'

자세한 내용은 접두사를 사용하여 객체 구성 단원을 참조하십시오.

대상 Amazon S3 버킷에 있는 파일 정리

CLEANPATH 옵션을 사용하여 지정된 위치로 파일을 언로드하기 전에 TO 절에 지정된 Amazon S3 경로에 있는 기존 파일을 제거합니다. PARTITION BY 절을 포함하는 경우 파티션 폴더에서만 기존 파일이 제거됩니다. 이렇게 하면 Amazon S3 버킷이 UNLOAD 작업으로 생성한 새 파일을 수신할 수 있습니다.

중요: CLEANPATH 옵션을 사용하여 제거한 파일은 영구적으로 삭제되며 복구할 수 없습니다.

CLEANPATH 옵션을 사용하려면 Amazon S3 버킷에 대한 s3:DeleteObject 권한을 보유해야 합니다. 다음 예제 정책을 권한 정책으로 추가해야 합니다.

{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": [
        {
            "Sid": "ExampleStatement01",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::0123456789:user/<UserName>"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:DeleteObject"  --> Additional Action added for delete object
            ],
            "Resource": [
                "arn:aws:s3:::testbucket/*",
                "arn:aws:s3:::testbucket"
            ]
        }
    ]
}

참고: CLEANPATH 옵션을 지정할 수 없는 경우는 ALLOWOVERWRITE 옵션을 지정한 경우입니다.

ALLOWOVERWRITE 옵션을 UNLOAD 명령과 함께 사용

덮어쓸 가능성이 있는 파일을 찾으면 UNLOAD 명령은 실패합니다. ALLOWOVERWRITE를 지정한 경우 UNLOAD는 매니페스트 파일을 포함하는 기존 파일을 덮어씁니다. 다음 예시에서는 이전 파일을 덮어쓰고 버킷을 새 레코드로 업데이트합니다.

iam_role 'arn:aws:iam::0123456789:role/redshift_role' allowoverwrite;
unload ('select * from test_unload')   
to 's3://testbucket/unload/test_unload_file1'

ALLOWOVERWRITE 옵션을 사용하려면 Amazon S3 버킷에 대한 s3:PutObject 권한을 보유해야 합니다. 다음 예제 정책을 권한 정책으로 추가해야 합니다.

{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": [
        {
            "Sid": "ExampleStatement01",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::0123456789:user/<UserName>"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:PutObject"  --> Additional Action added for overwriting objects
            ],
            "Resource": [
                "arn:aws:s3:::testbucket/*",
                "arn:aws:s3:::testbucket"
            ]
        }
    ]
}

관련 정보

Authorizing Amazon Redshift to access other AWS services on your behalf

How to prevent uploads of unencrypted objects to Amazon S3

Queries appear to hang and sometimes fail to reach the cluster

암호화된 데이터 파일 언로드

Amazon S3의 정책 및 권한

AWS 공식
AWS 공식업데이트됨 일 년 전
댓글 없음

관련 콘텐츠