-
AWS Service DiscoveryDevops/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