티스토리 뷰
[AWS] Error message: Unable to execute HTTP request: Connect to email.ap-northeast-2.amazonaws.com 에러 해결 로그
니용 2023. 5. 24. 14:27ECS를 사용하려면 VPC 엔드포인트에 설정을 하여야 합니다. SNS(Simple Notification Service), SES(Simple Email Service) 등이 가장 대표적이며 문제 로그는 이와 같이 발생합니다.
Caused by: com.amazonaws.SdkClientException: Unable to execute HTTP request: Connect to email.ap-northeast-2.amazonaws.com:443 [email.ap-northeast-2.amazonaws.com/13.125.10.216, email.ap-northeast-2.amazonaws.com/52.78.123.6, email.ap-northeast-2.amazonaws.com/43.200.122.182] failed: Connect timed out
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleRetryableException(AmazonHttpClient.java:1207)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1153)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:802)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:770)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:744)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:704)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:686)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:550)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:530)
at com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient.doInvoke(AmazonSimpleEmailServiceClient.java:5721)
at com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient.invoke(AmazonSimpleEmailServiceClient.java:5688)
at com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient.invoke(AmazonSimpleEmailServiceClient.java:5677)
at com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient.executeSendEmail(AmazonSimpleEmailServiceClient.java:3856)
at com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient.sendEmail(AmazonSimpleEmailServiceClient.java:3827)
왜 이런 에러가 발생하는 것일까요?
1. ECS는 내부망을 이용하기 때문입니다.
기본적으로 EC2를 생성하면서 만들어질 서버 내부에서 일정 IP를 할당 받습니다. 즉, 이렇게 할당받은 IP는 내부에서 사용하는 것으로 규칙이 정해지기 때문에 보안 그룹으로 1차적인 방화벽 역할을 가능하고, 그 다음에 내부에서 2차로 보안 처리를 진행합니다.
이것은 AWS에서 제공한 Client 유틸리티 또는 SDK를 사용한다고 해결되지 않습니다. 실제로 위 에러 메시지도 나와있지만 그럼 이러한 2차 방어막을 뚫고 사용가능한 방법은 없을까요?
2. ECS에서 외부로 이어질 인터페이스를 생성해두고, VPC 내부에서 지정한 엔드포인트로만 이동 가능하다.
결국 내부 IP인 xxx.xxx.xxx.xxx에서 외부에 노출되어 있는 도메인 (예를 들어, 같은 아마존 웹서비스에서 운영하는 도메인이어도 'email-smtp.ap-northeast-2.amazonaws.com'는 외부에 드러나 있는 도메인이다) 으로 요청을 보내기 위해서는 별도의 작업이 필요합니다.
'외부 -> 내부'의 작업은 까다롭고 이는 내부에서 오픈을 해주어야 하지만, '내부 -> 외부'로 연결이 가능하도록 작업해주는 것은 어렵지 않기 때문입니다. 우리는 후자에 대한 작업을 진행할 것이고, 여기서 '외부의 종단점'을 엔드포인트 라고 합니다. (예: email-smtp.ap-northeast-2.amazonaws.com:443 으로 연결할 것이면 이것이 엔드포인트)
3. 엔드포인트 설정 방법
엔드포인트는 AWS Console 내 VPC 메뉴에서 생성 가능합니다.
이제 위와 같이 엔드포인트에 대한 설정을 작성합니다. 주로 서비스 부분에 엔드포인트에서 필요한 아마존 웹서비스에서 제공하는 서비스 종류가 있습니다. 보통의 경우 지금 사용하고 계신 VPC에 연결하면 되지만, VPC연결 중 에러가 나는 경우 VPC를 하나 더 생성하고, 보안 그룹을 같이 생성하여 연결해도 가능합니다.
참고한 내용
https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/vpc-endpoints.html#ecr-minimum-s3-perms
https://docs.aws.amazon.com/ko_kr/vpc/latest/privatelink/concepts.html
'Server' 카테고리의 다른 글
[Shell Script] 1탄 - 기본 설정과 명령어에 대해 알아보기 (0) | 2023.06.12 |
---|---|
[Java] LinkedList 와 ArrayList 비교 (0) | 2023.06.06 |
Spring Boot Test 클래스 생성법 (0) | 2023.05.30 |
Command Line Interface에서 프로젝트의 버전을 확인하는 방법 (0) | 2023.04.29 |
[MySQL] Insert Select 로 한 번에 쿼리 수행하기 (0) | 2023.04.27 |
[AWS] ACM + EC2 로드밸런서로 HTTPS 연결하기 (0) | 2023.04.26 |