본문 바로가기

개발노트/JAVA

Spring Eureka 관련 정리

On-premise IDC 환경에서 운영중인 서버들을 Cloud 환경으로 이전하기 위해 부딪힌 몇가지 문제가 있었다.

이 문제들을 해결하기 위해 알아본 자료들을 정리해두면 후에 도움이 많이 될 것 같아 정리를 해 봄.

 

상황

1. 기존에는 VPN 을 통하였기 때문에 내부간 트래픽은 http 로 해도 안전하다고 여겨지고 있었음

2. Loadbalancer 트래픽 마저 VPN 의 트래픽을 점유하고 있었으므로 불필요한 성능 저하 유발

3. Cloud 환경에서는 가능한 VPN 을 타지 않고 `외부 트래픽 + 같은 서브넷 트래픽` 으로만 구성하는 것이 목표

4. Loadbalancer 에서 앱 서버(서비스)에 접근하기 위해서는 plain http 보다 https 로 전송해야 여러 공격으로부터의 최소한의 보안 레벨을 유지할 수 있다고 판단

5. 무중단 서버 이전을 위해 On-premise + Cloud = Hybrid 로 운영하는 과도기가 필요

6. 앱 서버들은 외부로부터 오는 트래픽도 있지만, Spring Eureka Server + Spring Eureka Client(Feign Client) = MSA(?)으로 구성된 내부 서버들간 요청들도 있었기에, 무중단 서버 이전을 위해서는 신경쓸 게 꽤 있었다.

Cloud Server 에 배포할 서버(스프링 부트)에는 SSL 인증서를 세팅하고 https 로 service 하도록 해야했고, 기존의 IDC 서버는 무중단을 위해 http 로 service 하면 되나, Eureka 에 앱 인스턴스가 등록될 때 https 로 설정이 명시적으로 되어 있지 않으면 DiscoveryClient 가 http 로 URI 를 만들어 내려주기 때문에 https 앱 인스턴스들이 Eureka 에 등록이 되었음에도 다른 Eureka client 들에서는 http 로 요청을 보내기 때문에 SSL Handshake Failure 가 발생하게 된다.

 

Troubleshooting

일단 Eureka 를 통한 내부 요청만이라도 https 로 잘 받도록 application.yml 설정에 eureka 관련 설정을 추가

1. 유레카에 등록될 때 hostname 으로 등록되도록 명시적으로 hostname 설정 추가

2. 배포될 서버에서 hostname 확인 및 DNS 레코드 등록

    - 필요 시, hostname 변경 (발급한 인증서의 도메인과 일치를 위해)

3. 아래의 설정 application.yml 에 추가

spring:
  cloud:
    client:
      hostname: ${HOSTNAME}
      
eureka:
  instance:
    hostname: ${HOSTNAME}
    non-secure-port-enabled: false
    secure-port-enabled: true
    secure-port: ${server.port}

 

그러면 eureka 에 인스턴스가 등록될 때 https 로 등록되고, 다른 서비스들의 DiscoveryClient 에서 https로 URI가 빌드됨을 확인할 수 있었다.

그리고 IDC 에서는 http 와 Cloud 에서는 https 를 동시에 운영이 가능해진다. (Eureka 를 통한 내부 API)

특이하게 eureka server Web GUI 에 들어가서 보면 Application ID 옆에 <a/> 태그로 생성되는 링크의 href 값이 `eureka.instance.hostname` 이 값이고, instance_id 값은 `spring.cloud.client.hostname` 의 값으로 시작함을 알 수 있다.

이 두 값은 쓰이는 곳이 서로 다르기 때문인건데, 굳이 다르게할 이유가 전혀 없으므로(오히려 아주 특별한 상황 외에 다르게 하면 안 되므로) 두 값 모두 ${HOSTNAME} 을 쓰게 한다.

그리고 eureka server Web GUI 에 <a/> 링크의 scheme 은 https 가 아니라 http 인데 이건 `eureka.instance` 의 설정을 명시적인 커스터마이징을 통해 보강해주면 https 로 보이게 설정이 가능하다. 그러나 이 설정이 없어도 DiscoveryClient 는 https 로 URI 를 빌드하기 때문에 내부 API 요청들에는 전혀 문제가 없다. (디버그로 확인 완료)

 

도움이 될만한 자료

- 유레카 서버 REST API 로 등록 인스턴스 관리

https://github.com/Netflix/eureka/wiki/Eureka-REST-operations

 

Netflix/eureka

AWS Service registry for resilient mid-tier load balancing and failover. - Netflix/eureka

github.com

    - 여기에는 `/v2` 가 들어가 있는데, 유레카 서버에서 명시적으로 v2 설정을 해주지 않았다면 `/v2` path 는 없어야 한다. : (https://github.com/spring-cloud/spring-cloud-netflix/issues/1056)

 

- 유레카에 https 로 등록

https://stackoverflow.com/questions/35617996/eureka-registration-of-https-micro-services

 

Eureka registration of Https micro services

Eureka does not recognized HTTPS endpoints like '/info' and '/health' and always points to HTTP endpoints after enabling HTTPS. How to enable HTTPS micro-service url registration at Eureka ?

stackoverflow.com

 

반응형