티스토리 뷰

반응형

ECS를 사용하려면 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

 

Amazon ECR 인터페이스 VPC 엔드포인트(AWS PrivateLink) - Amazon ECR

Windows 이미지의 기본 계층은 크기가 큽니다. 큰 크기의 계층은 푸시하는 데 시간이 길어지고 Amazon ECR에서 이러한 이미지에 대한 추가 스토리지 비용을 발생시킵니다. 이러한 이유로 빌드 시간과

docs.aws.amazon.com

https://docs.aws.amazon.com/ko_kr/vpc/latest/privatelink/concepts.html

 

AWS PrivateLink 개념 - Amazon Virtual Private Cloud

AWS PrivateLink 개념 Amazon VPC를 사용하면 논리적으로 분리된 가상 네트워크인 Virtual Private Cloud(VPC)를 정의할 수 있습니다. VPC에서 AWS 리소스를 시작할 수 있습니다. 그리고 VPC의 리소스에서 해당 VPC

docs.aws.amazon.com

 

반응형
댓글
공지사항