ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AWS Service Discovery
    Devops/Terraform 2022. 8. 30. 00:38

    elastic container service (ecs)를 사용하다가 슬슬 내부 통신이 필요할 때가 와서 관련 서비스 (consul, aws cloud map)등을 조사하다가 aws cloud map을 사용하기로 결정을 했습니다.

    그 이유는

    • 현재 사용중인 ecs는 eks 또는 k8s로 변경할 예정이다.
    • headless service로 간단하게 거쳐갈 솔루션이 필요하다.

    이다. 하지만, 사용해보니 몇 가지 단점이 보였습니다.

    • route 53에 private hosting을 하기에 DNS 레코드 변경, 삭제되면 지연시간이 발생한다.  
    • terraform으로 프로비저닝 할때, ecs가 destroy 후 apply가 된다. 

     

    사용하게될 Private DNS Service Discovery에 대해서 간단하게 설명을 드리자면,

     Service Discovery는 컨테이너에서 다른 컨테이너로 직접 ip 주소를 사용해서 접근하는 기술입니다.

    • 아래의 경우가 Service Discovery를 사용하기 적합한 경우입니다.
      • 내부 서비스 디스커버리
      • 서비스간 낮은 지연 시간을 갖어야 할 때,
      • grpc같은 수명이 긴 양방향 통신을 사용할 때,
    • 그림은 다음과 같습니다

     

    terraform으로 프로비저닝을 해봅니다.

    * 환경은 ecs를 사용하고 있습니다.

    우선, private_dns_namespace resource를 정의해야 합니다.

    variable "namespace_name" {
      type = string
    }
    
    variable "description" {
      type = string
    }
    
    variable "vpc_id" {
      type = string
    }
    
    resource "aws_service_discovery_private_dns_namespace" "default" {
      name        = var.namespace_name
      description = var.description
      vpc         = var.vpc_id
    }

    다음으로 aws_service_discovery_service resource를 정의해줍니다. 

    정의를 해줄때, namespace_id를 위에 선언한 aws_service_discovery_private_dns_namespace의 id 값을 넣어줍니다.

    (아래는 모듈을 분리했기에 terraform의 data source (https://www.terraform.io/language/data-sources) 로 terraform의 state를 가져옵니다.)

    resource "aws_service_discovery_service" "default" {
      name = var.name
    
      dns_config {
        namespace_id = data.terraform_remote_state.private_dns_namespace.outputs.id
    
        dns_records {
          ttl  = 60
          type = "A"
        }
    
        routing_policy = "MULTIVALUE"
      }
      ...
    }

    다음으로 ecs resource에 service_registries를 위에 선언한 private_dns_namespace를 연결시켜줍니다.

    dynamic block에 registry_arn에 위 aws_service_discovery_service의 arn을 넣어줍니다.

    # ecs service
    resource "aws_ecs_service" "service" {
    
      # aws_ecs_service의 다른 부분은 생략.
      ...
    
      # dynamic block을 사용하여 service discovery를 선택할 수 있게 함
      dynamic service_registries {
        for_each = var.service_registries
        content {
          registry_arn = service_registries.value.registry_arn
        }
      }
    }

    위 처럼 

    1. aws_service_discovery_private_dns_namespace 

    2. aws_service_discovery_service

    3. aws_ecs_service에 service_registries에 등록

    하게 되면 Route 53에 private로 dns가 생긴걸 볼 수 있습니다. (자세한 정보는 aws cloud map에서 볼 수 있습니다.)

    Route 53에 생성된 private dns

     

    다음에는 Consul을 학습해서 Consul을 사용해 Service Discovery를 해볼 계획입니다.

     

    'Devops > Terraform' 카테고리의 다른 글

    Terraform에서 tagging하기  (0) 2022.04.09
Designed by Tistory.