문제 상황
Spring Cloud 기반 MSA 아키텍처를 ECS Fargate 환경에서 구성하던 중, 다음과 같은 문제가 발생했습니다:
- 각 컨테이너는 Fargate 환경에서 잘 실행되고 있음
- Eureka 서버에 서비스들을 등록해야 함
- 기존처럼 http://eureka-service/eureka로 접근을 시도했지만 서비스 검색이 되지 않음
원인 분석
이 문제의 원인은 다음 두 가지입니다:
- Fargate는 EC2처럼 호스트 기반 DNS를 기본적으로 지원하지 않음
EC2에서는 컨테이너 이름 또는 서비스 이름으로도 DNS 해석이 가능하지만,
Fargate는 각 컨테이너가 독립된 ENI(Network Interface)를 가지며 DNS 해석이 불가능합니다. - ECS 서비스 디스커버리 설정이 빠져 있었음
Eureka 서버에 등록을 하려면 Eureka 주소에 접근할 수 있어야 하는데,
http://eureka-service 식의 접근은 Fargate 환경에서 통하지 않습니다.
왜냐하면 이는 DNS 이름을 해석할 수 없기 때문입니다.
ENI란?
https://jibinary.tistory.com/133
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html
해결 방법
1. AWS Cloud Map + Route 53 Private Hosted Zone 활용
AWS에서 제공하는 서비스 디스커버리 기능을 활용해
각 서비스가 서로의 DNS 이름을 인식할 수 있도록 구성해야 합니다.
2. ECS 서비스 생성 시, 서비스 검색 활성화
서비스 생성 또는 수정 시, 다음 설정을 추가합니다:
- 서비스 검색: 활성화
- Namespace
- Service name: eureka-service (Eureka 컨테이너가 속한 ECS 서비스 이름)
이렇게 설정하면, Fargate 환경에서도 다음과 같이 Eureka에 접근할 수 있습니다.
{service이름}.{namespace이름}
예시 : eureka-service url 등록. http://eureka-service.{namespace이름}/eureka
실제 적용
- application.yml의 Eureka 클라이언트 설정을 다음과 같이 변경:
eureka:
client:
serviceUrl:
defaultZone: http://eureka-service.moim/eureka
마무리
Fargate는 기본적으로 EC2와 네트워크 구조가 다르기 때문에,
컨테이너 간 통신을 위해 별도의 서비스 디스커버리 설정이 필수입니다.
특히 Spring Cloud 기반의 MSA 환경에서는 Eureka 등록 주소가 정확하지 않으면 통신이 아예 이루어지지 않기 때문에,
처음에 Cloud Map 연동을 설정해주는 것이 안정적인 운영에 도움이 됩니다.
댓글