Amazon Redshift에서 데이터를 삽입하거나 추출할 때 "Temporary directory not specified" 오류와 함께 AWS Glue 작업이 실패하는 이유는 무엇입니까?

최종 업데이트 날짜: 2021년 8월 13일

Amazon Redshift에서 데이터를 삽입하거나 추출할 때 "Temporary directory not specified" 오류와 함께 AWS Glue 작업이 실패합니다.

간략한 설명

다음은 AWS Glue 작업이 Amazon Redshift에서 데이터를 쓰거나 읽을 때 기억해야 할 몇 가지 사항입니다.

  • AWS Glue 작업이 Amazon Redshift 클러스터에 데이터를 쓰는 경우: 작업은 처음에 Amazon Simple Storage Service(Amazon S3) 버킷에 CSV 형식으로 데이터를 씁니다. 그런 다음 작업이 Amazon Redshift에 COPY 명령을 실행합니다.
  • AWS Glue 작업이 Amazon Redshift 클러스터에서 데이터를 읽는 경우: 작업은 먼저 UNLOAD 명령을 사용하여 Amazon S3 버킷에 CSV 형식으로 데이터를 언로드합니다. 그런 다음 작업은 이러한 임시 버킷 파일에서 DynamicFrame로 데이터를 로드합니다.

다음 조건 중 하나에 해당하는 경우 이 오류가 발생할 수 있습니다.

  • Amazon Redshift에서 임시 S3 버킷으로 데이터를 언로드하고 있습니다.
  • COPY 또는 UNLOAD 명령을 사용하여 S3 버킷에서 Amazon Redshift로 데이터를 로드하고 있습니다.

해결 방법

다음은 이 오류의 일반적인 원인 및 해결 옵션 중 일부입니다.

임시 디렉터리 정의

이 오류의 가장 일반적인 이유는 AWS Glue 작업에서 스테이징 디렉터리로 사용하는 임시 S3 버킷의 누락입니다. 따라서 S3 버킷을 작업의 임시 디렉터리로 정의해야 합니다. 임시 버킷을 정의하는 방법에 대한 자세한 내용은 AWS Glue를 사용하는 특수 파라미터를 참조하세요.

IAM 역할 권한 확인

IAM 역할 권한을 확인하여 임시 S3 버킷에 액세스할 수 있는 권한이 있는지 확인합니다. 또한 AWS Glue IAM 역할에 대한 다음 정책에서 버킷에 대한 필수 권한을 차단하지 않았는지 확인합니다.

  • 버킷 정책
  • S3 VPC 엔드포인트 정책
  • AWS Organizations 정책
  • 서비스 제어 정책

필요한 권한의 예로는 ListObjects, GetObject 및 PutObject가 있습니다.

임시 디렉터리의 이름 확인

임시 디렉터리로 사용되는 S3 버킷의 이름에는 다음과 같은 예외가 발생하지 않도록 마침표가 없어야 합니다.

Caused by: java.sql.SQLException: [Amazon](500310) Invalid operation: UNLOAD destination is not supported.

AWS Key Management Service(AWS KMS) 권한 확인

AWS Key Management Service(AWS KMS)의 고객 관리형 키를 사용하여 데이터를 암호화하는 경우, AWS Glue 스크립트에서 ETL 문에 대한 additional_optionsextraunloadoptions를 포함시켜야 합니다. 예를 들면 다음과 같습니다.

datasource0 = glueContext.create_dynamic_frame.from_catalog(
    database = "database-name", 
    table_name = "table-name", 
    redshift_tmp_dir = args["TempDir"],
    additional_options = {"extraunloadoptions":"ENCRYPTED KMS_KEY_ID 'CMK key ID'"}, 
    transformation_ctx = "datasource0"
  )

AWS KMS를 사용하여 S3 데이터를 암호화하고 AWS KMS와 관련된 권한 문제가 발생하는 경우 다음 사항을 확인하세요.

  • AWS Glue IAM 역할에 다음과 유사한 AWS KMS 작업 권한이 있습니다.
  • AWS KMS 키에 AWS Glue IAM 역할을 추가했습니다.
"Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:DescribeKey"
    ]

AWS Glue 파이썬 셸 작업에 대한 IAM 역할 권한 확인

AWS Glue Python 셸 작업에서 COPY 또는 UNLOAD 명령을 실행하려고 하는데 자격 증명을 로드할 수 없는 경우 다음 사항을 확인하세요.

  • Amazon Redshift에 AWS Glue IAM 역할을 추가했습니다.
  • AWS Glue 작업 역할에는 신뢰 관계 정책에 Amazon Redshift와 AWS Glue가 포함됩니다. 예를 들면 다음과 같습니다.
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "glue.amazonaws.com",
          "redshift.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

패킷 드롭 확인

연결이 성공한 후에도 쿼리가 Amazon Redshift 클러스터에 도달하지 못하는 것은 Amazon Redshift와 AWS Glue 네트워크 경로 간의 MTU(최대 전송 단위) 크기가 일치하지 않기 때문일 수 있습니다. ICMP ‘대상에 연결할 수 없음(destination unreachable)’을 허용하도록 Amazon Redshift 보안 그룹을 구성해 보세요. 자세한 내용은 쿼리가 중단된 것처럼 보이고 간혹 클러스터에 도달하지 못합니다를 참조하세요.

AWS CloudFormation 템플릿에 임시 디렉터리 정의

CloudFormation을 사용하여 AWS Glue 작업을 생성한 경우, CloudFormation 템플릿의 DefaultArguments 파라미터에 임시 디렉터리 위치를 제공해야 합니다. 예를 들면 다음과 같습니다.

"DefaultArguments": { "--TempDir": "s3://doc-example-bucket/doc-example-folder"}

DynamicFrame에 임시 디렉터리 정의

AWS Glue 작업에서 임시 디렉터리를 정의한 후에도 오류가 발생하는 경우에는 Amazon Redshift를 읽거나 쓰고 있는지 확인합니다. AWS Glue의 DynamicFrame 메서드를 사용하여 이를 수행할 수 있습니다. 그런 후 다음을 확인합니다.

임시 디렉터리를 DynamicFrame의 redshift_tmp_dir 속성으로 전달한 경우:

  • 데이터 카탈로그 데이터베이스 및 테이블을 사용하여 DynamicFrame을 생성하려면 create_dynamic_frame_from_catalog를 참조하세요.
  • 지정된 연결 및 형식을 가진 DynamicFrame을 생성하려면 create_dynamic_frame_from_options를 참조하세요.
  • 데이터 카탈로그 데이터베이스 및 테이블의 정보를 사용하여 DynamicFrame에 쓰려면 write_dynamic_frame_from_catalog를 참조하세요.
  • 지정된 연결 및 형식을 사용하여 DynamicFrame에 쓰려면 write_dynamic_frame_from_options를 참조하세요.
  • 지정된 연결 및 형식을 사용하여 DynamicFrame 또는 DynamicFrameCollection에 쓰려면 write_from_options를 참조하세요.
  • 지정된 JDBC 연결의 정보를 사용하여 DynamicFrame 또는 DynamicFrameCollection에 쓰려면 write_from_jdbc_conf를 참조하세요.

ETL 작업에 대한 getResolvedOptions 함수에 TempDir가 지정되어 있는 경우:

다음 명령을 사용하여 작업 이름 및 TempDir 파라미터를 검색합니다.

import sys
from awsglue.utils import getResolvedOptions
args = getResolvedOptions(sys.argv,['JOB_NAME','TempDir'])
TempDir = args['TempDir']

자세한 내용은 getResolvedOptions를 사용한 파라미터 액세스를 참조하세요.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?