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

4분 분량
0

UNLOAD 명령을 사용하여 Amazon Redshift 클러스터에서 Amazon Simple Storage Service(Amazon S3)로 데이터를 언로드하고 싶습니다. 하지만 오류 메시지가 나타납니다.

간략한 설명

UNLOAD 명령을 실행할 때 다음 중 하나와 유사한 오류 메시지가 나타날 수 있습니다.

  • "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"
  • "[Amazon](500310) Invalid operation: S3ServiceException:Access Denied,Status 403,Error AccessDenied,"
  • "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."

문제를 해결하려면 수신한 오류 메시지를 기반으로 다음 조치 중 하나를 수행하십시오.

  • 데이터베이스가 AWS Identity and Access Management (IAM) 역할을 수임하도록 권한을 부여합니다.
  • Amazon S3 작업에 적절한 권한을 부여합니다.
  • 대상 버킷의 객체를 제거하거나 덮어씁니다. S3 키 접두사를 변경합니다. 또는 다른 버킷을 사용합니다.

해결 방법

데이터베이스가 IAM 역할을 수임하도록 권한 부여

이 문제를 해결하려면 IAM 역할을 Amazon Redshift 클러스터에 연결하십시오. UNLOAD 명령에 IAM 역할을 포함할 때는 후행 공백이 없어야 합니다. 또한 Amazon Redshift 클러스터에 할당하는 IAM 역할에 올바른 신뢰 관계를 사용해야 합니다.

Amazon S3 작업에 적절한 권한 부여

S3 버킷에서 403 Access Denied 오류가 발생하면 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/*"
      ]
    }
  ]
}

Amazon S3 관리형 암호화 키(SSE-S3)로 서버 측 암호화를 사용하는 경우 S3 버킷은 각 객체를 고유 키로 암호화합니다.

언로드된 저장 데이터를 암호화하려면 다음 명령을 실행하여 S3 버킷 정책의 s3:x-amz-server-side-encryption 파라미터를 true로 설정합니다.

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

다음 명령을 실행하여 KMS_KEY_ID를 암호화했는지 확인하여 암호화된 데이터를 S3 버킷에 언로드할 수 있습니다.

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

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

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

버킷 문제 해결

동일한 파일 이름이 있는 폴더에서 파일을 언로드하려고 하면 오류 메시지가 나타납니다.

이 문제를 해결하려면 다음 작업 중 하나를 수행하십시오.

  • 새 S3 버킷을 생성하거나 다른 S3 버킷을 사용합니다.
  • S3 키 접두사를 변경합니다.
  • 대상 S3 버킷에 있는 파일을 제거합니다.
  • UNLOAD 명령에 ALLOWOVERWRITE 옵션을 포함합니다.

새 S3 버킷 생성 또는 다른 S3 버킷 사용

  1. 새 S3 버킷을 생성 하거나 다른 S3 버킷을 선택합니다.
  2. 다음 권한을 포함하도록 새 S3 버킷 또는 다른 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 명령에서 새 버킷 경로를 사용합니다.
명령 예시:

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

S3 키 접두사 변경

UNLOAD 명령을 실행할 때 S3 경로의 S3 버킷 키 접두사를 변경합니다.

변경된 접두사로 unload2를 포함하는 명령 예시:

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

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

대상 S3 버킷에 있는 파일 제거

중요: CLEANPATH 옵션을 사용하여 파일을 제거하면 파일이 영구적으로 삭제되며 복구할 수 없습니다. 또한 ALLOWOVERWRITE 옵션을 지정하는 경우 CLEANPATH 옵션을 지정할 수 없습니다.

CLEANPATH 옵션을 사용하려면 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"
            ]
        }
    ]
}

파티션 폴더에서만 기존 파일을 제거하려면 PARTITION BY를 포함시키십시오.

CLEANPATHPARTITION BY를 포함하는 UNLOAD 명령 예시:

unload ('select * from test_unload')  
to 's3://testbucket/unload/test_unload_file1
iam_role 'arn:aws:iam::0123456789:role/redshift_role'
partition by (col1,col2) include
CLEANPATH;

참고: 언로드된 파일에서 파티션 열을 제거하지 않으려면 INCLUDE 옵션을 사용하여 PARTITION BY를 지정하십시오.

ALLOWOVERWRITE 옵션 사용

UNLOAD 명령이 덮어쓸 수 있는 파일을 찾으면 언로드 작업이 실패합니다. 명령에 ALLOOVERWRITE를 포함하면 UNLOAD는 매니페스트 파일을 비롯한 기존 파일을 덮어씁니다.

ALLOWOVERWRITE 옵션을 사용하려면 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"
            ]
        }
    ]
}

ALLOWOVERWRITE 옵션을 포함하는 UNLOAD 명령 예시:

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

관련 정보

Amazon Redshift가 사용자를 대신하여 AWS 서비스에 액세스할 수 있도록 승인

암호화되지 않은 객체가 Amazon S3에 업로드되는 것을 방지하는 방법

쿼리가 중단된 것처럼 보이고 때때로 클러스터에 도달하지 못함

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

Amazon S3의 정책 및 권한

AWS 공식
AWS 공식업데이트됨 한 달 전