ECS에서 Fargate로 서비스를 생성하고 로드 밸런서에 연결하게 되면, 추후 서비스 배포를 위해서는 반드시 CodeDeploy를 이용해야 합니다. 그리고 블루/그린 배포는 선택이 아닌 필수가 됩니다. 그리고 의외로, 이러한 설정 과정은 결코 쉽지가 않습니다. ECS의 구성으로 EC2를 선택하면 Rolling Update 같은 방식을 제공하지만, Fargate는 그렇지가 않았기 때문입니다.

그렇다고 배치성 작업이라 할지라도 호출이 필요한 서비스를 로드 밸런서에 연결하지 않을 수도 없는 난처한 상황에서 ECS에서 제공하는 Service Discovery 기능은 한줄기 빛이었습니다.

  • AWS에서 제공하는 Service Discovery 기본 컨셉 (바로 가기)
  • Nginx에서 설명하는 Service Discovery (바로 가기)

Service Discovery

간단하게 설명하자면, Service Discovery 기능은 MSA (Micro Service Architecture) 서비스에서 동적으로 변화하는 서비스 주소를 손쉽게 찾을 수 있도록 Service Registry를 구성하고 이를 이용하여 동적인 서비스를 호출하기 쉽게 도와주는 기술입니다.

그래서 AWS의 ECS에서는 동적으로 변화하는 서비스의 개별 작업 혹은 서버 주소를 Route 53의 DNS에 저장하고 지속적으로 업데이트 하면서 서비스를 연결해주는 기능을 의미합니다.

ECS의 서비스 생성시 옵션

예를 들어, Route 53의 Private DNS인 opsnow.local을 Namespace로 이용한다고 가정하겠습니다. 이 때, ECS에서 서비스를 만들면서 해당 Namespace에 서비스 검색 이름을 test로 생성하게 되면, 해당 ECS 서비스는 test.opsnow.local 서브 도메인을 가지는 A 레코드를 가지게 됩니다. 그리고 서비스로 배포되는 개별 작업 하나하나가 A 레코드를 자동으로 등록하게 됩니다.

Route 53의 DNS 레코드

실제 운영 환경에서 사용중인 데이터 콜렉터가 작업을 15개 가량 사용할 때, Route 53에서 본 레코드의 모습입니다. 동일 서비스에 대한 A 레코드가 15개가 등록된 것을 확인할 수 있습니다. 콜렉터를 호출하기 위해서는 별도의 로드 밸런서를 거치지 않고도 얼마든지 사전 정의된 형태의 도메인을 이용하면 됩니다.

이처럼 Service Discovery를 이용한다면 별도의 로드 밸런서 없이도 손쉽게 서비스를 호출할 수 있습니다. 작업을 줄이거나 늘리면 자동적으로 Route 53에 반영되기 때문에 사용자가 별도로 조치할 작업이 없습니다. 사용자는 그저 서비스 사이에서 호출에 필요한 도메인만 정의하면 됩니다. 점점 서비스 메쉬 컨셉으로 다가가고 있습니다.

Terraform에서 추가하기

최근에 OpsNow는 관련 인프라를 코드화하기 위해서 Terraform을 이용하고 있습니다. 자세한 글은 다음 기회에 작성할 예정이지만, 코드 샘플은 다음과 같습니다.

resource "aws_ecs_service" "new" {
...
service_registries {
registry_arn = aws_service_discovery_service.new.arn
}
}resource “aws_service_discovery_service” “new” {
name = lower(“${var.service}-${var.usage}”)

dns_config {
namespace_id = var.namespace_id

dns_records {
ttl = 60
type = “A”
}

routing_policy = “MULTIVALUE”
}
}

Code language: PHP (php)

사전 정의된 Namespace에서 아이디를 변수로 제공하고, 기존 ECS 서비스에 몇 줄만 추가하면 Service Discovery 기능을 구현할 수 있습니다. 일관된 기준을 사용하기 위해서 내부적으로 정의된 service와 usage 변수를 이용하고 있습니다. 참 쉽죠? 😀

맺음말

서비스가 점점 MSA 패턴으로 개발되면서 각각의 서비스를 연결하는 일은 어려워지고 있습니다. 로드 밸런서를 이용한다 하더라도 많은 서비스를 연결하다 보면 로드 밸런서의 관리 자체가 부담되기 시작하고, 또한 서비스 부하도 무시하지 못할 수준이 되어가고 있습니다. 서비스 사이에 직접 통신할 수 있도록 Service Discovery를 구성함으로써 좀 더 빠르게 MSA를 도입할 수 있도록 해보시는 것은 어떨까요.