AWS Glue 작업이 "Unable to execute HTTP request... connect timed out" 오류와 함께 실패합니다.
간략한 설명
연결이 연결된 상태로 AWS Glue 작업을 실행하는 경우 다른 서비스 엔드포인트에 연결하려고 하면 작업이 실패할 수 있습니다. 예를 들어 Amazon Simple Storage Service(Amazon S3) 및 AWS Key Management Service(AWS KMS)와 같은 서비스 엔드포인트에 연결을 시도할 수 있습니다. 이 서비스 엔드포인트에 대한 네트워킹 경로가 AWS Glue 연결에 사용되는 서브넷에 없는 경우 작업이 실패합니다. "Unable to execute HTTP request" 또는 "failed: connect timed out" 오류 메시지가 AWS Glue 작업 로그에 표시됩니다.
이 오류는 다음과 같은 이유로 발생합니다.
- AWS Glue 연결에 구성된 서브넷에 인터넷 게이트웨이가 포함되어 있거나 실패한 서비스 엔드포인트의 라우팅 테이블에 경로가 없습니다.
- AWS Glue 작업을 실행하면 AWS Glue API와 상호 작용합니다. 이는 AWS Glue Data Catalog 테이블을 나열하거나, 새 테이블을 만들거나, 테이블을 읽어야 하는 작업을 사용하는 경우 발생합니다. 작업에서 AWS Glue API에 액세스해야 하는 경우 HTTP REST API 요청을 보냅니다. 마찬가지로 Amazon S3, Amazon Simple Notification Service(Amazon SNS) 또는 AWS Secret Manager에 다른 서비스 API를 직접 호출할 수도 있습니다. API를 직접 호출하면 작업이 이러한 서비스 엔드포인트와 연결을 시도하고 시간 초과 오류와 함께 요청이 실패합니다. 이는 작업에서 요청을 보낼 수 있지만 제한 기간 내에 응답을 받지 못했기 때문에 발생합니다.
AWS Glue는 AWS Glue 연결에 지정된 서브넷에 탄력적 네트워크 인터페이스를 생성합니다. 자세한 내용은 데이터 스토어에 대한 네트워크 액세스 설정을 참조하십시오.
AWS Glue 작업의 리소스에는 프라이빗 IP 주소만 있습니다. 즉, 작업에서 인터넷 게이트웨이를 사용하여 다른 리소스에 연결할 수 없습니다. AWS Glue 작업은 퍼블릭 AWS 서비스 엔드포인트로 요청을 보내려고 하지만 이러한 요청은 프라이빗 IP 주소에서 발생합니다. 따라서 엔드포인트가 응답을 다시 보낼 수 없으며 작업이 "connect timed out" 오류 메시지와 함께 실패합니다.
해결 방법
사용 사례에 따라 로그에 표시되는 오류 메시지는 다음 중 하나와 비슷합니다.
AWS Glue REST API:
AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: com.amazonaws.SdkClientException: Unable to execute HTTP request: Connect to glue.ap-southeast-1.amazonaws.com:443
Amazon S3 요청:
Unable to execute HTTP request: Connect to s3BucketName.us-east-1.amazonaws.com:443 [s3BucketName.s3.us-east-1.amazonaws.com/xx.xxx.xx.xxx ] failed: connect timed out
AWS KMS 요청:
Unable to execute HTTP request: Connect to kms.us-east-1.amazonaws.com:443 [kms.us-east-1.amazonaws.com/xx.xxx.xx.xxx ] failed: connect timed out
AWS Glue 작업과 해당 작업에서 API 요청을 보내려는 서비스 간의 트래픽이 허용되는지 확인합니다. 가상 프라이빗 클라우드(VPC) 엔드포인트를 사용하거나 NAT 게이트웨이를 사용하여 이를 확인할 수 있습니다.
VPC 엔드포인트 사용
Amazon Virtual Private Cloud(Amazon VPC) 콘솔을 사용하여 오류가 발생한 서비스에 대한 인터페이스 VPC 엔드포인트를 만듭니다. 예를 들어, AWS Glue API에 액세스하려고 시도하는 동안 AWS Glue 작업이 실패하고 오류가 발생할 수 있습니다. AWS Glue 연결에 구성된 동일한 VPC 서브넷에 AWS Glue용 인터페이스 엔드포인트를 만듭니다. 그러면 AWS Glue 엔드포인트에 연결해야 하는 트래픽이 이 인터페이스를 사용하여 연결된다는 것을 확인할 수 있습니다.
- Amazon VPC 콘솔을 엽니다.
- 탐색 창에서 Endpoints(엔드포인트)를 선택합니다.
- 엔드포인트 생성을 선택합니다.
- 서비스 카테고리에서 AWS 서비스를 선택합니다.
- 서비스 이름에서 연결하려는 서비스를 선택합니다. 자세한 내용은 AWS PrivateLink와 통합되는 AWS 서비스를 참조하십시오.
- VPC에서 AWS 서비스에 액세스하려는 VPC를 선택합니다.
- Amazon S3용 인터페이스 엔드포인트를 만들려면 추가 설정 및 DNS 이름 사용을 선택 취소해야 합니다. 이는 Amazon S3가 인터페이스 VPC 엔드포인트의 프라이빗 DNS를 지원하지 않기 때문입니다.
- 서브넷에서 AWS 서비스에 액세스하려는 가용 영역(AZ)당 하나의 서브넷을 선택합니다.
- 보안 그룹에서 엔드포인트 네트워크 인터페이스와 연결할 보안 그룹을 선택합니다. 보안 그룹 규칙은 VPC 엔드포인트를 사용할 리소스를 허용해야 합니다. VPC 엔드포인트는 AWS 서비스와 통신한 후 엔드포인트 네트워크 인터페이스와 통신합니다.
- 정책에서 전체 액세스를 선택합니다. 이를 통해 VPC 엔드포인트의 모든 리소스에서 위탁자 모두 전체 작업을 수행할 수 있습니다. 또는 사용자 지정을 선택하여 VPC 엔드포인트 정책을 연결합니다. 이 정책은 위탁자가 VPC 엔드포인트를 통해 리소스에 대한 작업을 수행할 수 있는 권한을 제어합니다. 이 옵션은 서비스가 VPC 엔드포인트 정책을 지원하는 경우에만 사용할 수 있습니다. 자세한 내용은 VPC 엔드포인트 정책을 참조하십시오.
- (선택 사항) 태그를 추가하려면 새 태그 추가를 선택한 다음, 태그 키와 태그 값을 입력합니다.
- 엔드포인트 생성을 선택합니다.
NAT 게이트웨이 사용
AWS NAT Gateway는 프라이빗 인터넷을 사용하여 리소스를 비공개로 안전하게 연결합니다. 프라이빗 서브넷을 생성하고 AWS Glue 연결이 프라이빗 서브넷을 가리키도록 합니다. 동시에 AWS Glue VPC의 퍼블릭 서브넷 중 하나에 NAT 게이트웨이를 생성합니다. 트래픽이 인터넷으로 라우팅되는 경우 이 NAT Gateway를 사용하여 라우팅되도록 AWS Glue 연결 서브넷의 라우팅 테이블을 구성합니다. 자세한 내용은 Amazon VPC에서 프라이빗 서브넷용 NAT 게이트웨이를 설정하려면 어떻게 해야 합니까? 및 NAT 게이트웨이를 참조하십시오.
참고: NAT 게이트웨이를 사용하는 경우 서비스에 대한 트래픽은 인터넷을 통해 전달됩니다.
추가 문제 해결
- 연결 보안 그룹과 서브넷 네트워크 ACL이 API 요청 시 AWS Glue에서 트래픽을 전송할 수 있도록 허용하는지 확인합니다.
- 연결 문제를 테스트하려면 AWS Glue 연결을 만들 때 사용한 것과 동일한 VPC, 서브넷 및 보안 그룹에서 EC2 인스턴스를 시작합니다. 그 후 다음 명령을 실행하여 서비스 엔드포인트와의 연결을 확인합니다.
telnet <glue endpoint url> 443
dig <glue endpoint url>
예:
$ telnet glue.us-east-1.amazonaws.com 443
$ dig glue.us-east-1.amazonaws.com
관련 정보
AWS Glue에서 오류 해결