올리브영 테크블로그 포스팅 Datadog - "저는 모니터링 요정입니다. ✋🏻"
CI/CD

Datadog - "저는 모니터링 요정입니다. ✋🏻"

ECS Fargate 에서 Datadog 을 연결해보자

2022.06.22

📖 Table of Contents

해당 포스팅은 아래의 시리즈로 구성되어 있습니다. 시리즈대로 포스팅을 읽어주세요 💚

  1. Teamcity 를 사용한 Build Process 구성 방법
  2. Teamcity로 Docker Container Image를 ECR로 Push 하는 방법
  3. ECS Fargate 에서 Datadog을 연결하는 방법

안녕하세요! 생각보다 잦은 주기로 찾아뵙는 올디브에서 Back-end 업무를 맡은 코코리 입니다.

오늘의 포스팅은 이전 포스팅에서 얘기한 대로 AWS ECS Fargate에서 Datadog 연결하는 방법에 대해 알아보겠습니다.!

Teamcity, AWS ECR, ECS 그리고 Datadog..! 그리고 스포아닌 스포지만 ECS와 AWS Gateway 연결방법까지 앞으로 시리즈로 포스팅할 예정입니다! 점점 더 늘어가는 시리즈가 저도 기대되네요 🕺

그렇다면 바로 ECS 에서 구동되는 Application log 및 status를 Datadog으로 확인하는 방법에 대해 알아보러 가실까요?

ECS는 무엇인가요?

올리브영 ECS Fargat, Datadog Overview

Amazon Elastic Container Service(Amazon ECS)는 확장성이 뛰어나고 빠른 컨테이너 관리 서비스입니다. 이를 사용하여 클러스터에서 컨테이너를 실행, 중지 및 관리할 수 있습니다. Amazon ECS에서 컨테이너는 서비스 내 개별 태스크나 여러 태스크를 실행하는 데 사용하는 태스크 정의에 정의됩니다. 이 컨텍스트에서 서비스는 클러스터에서 지정된 수의 태스크를 동시에 실행하고 유지하는 데 사용할 수 있는 구성입니다. AWS Fargate에서 관리하는 서버를 사용하지 않는 인프라에서 태스크 및 서비스를 실행할 수 있습니다. 또는 인프라에 대한 더 세부적인 제어를 위해 관리하는 Amazon EC2 인스턴스의 클러스터에서 태스크와 서비스를 실행할 수 있습니다. (공식 홈페이지에서 발췌)

AWS Fargate의 서버리스 옵션. AWS Fargate를 사용하면 서버를 관리하거나, 용량 계획을 처리하거나, 보안을 위해 컨테이너 워크로드를 격리할 필요가 없습니다. Fargate는 워크로드의 인프라 관리 측면을 대신 처리합니다. 리소스 요구 사항, 격리 정책 및 가용성 요구 사항을 기반으로 클러스터에서의 컨테이너 배치를 예약할 수 있습니다. (공식 홈페이지에서 발췌)

쉽게 설명드리자면 클러스터에서 컨테이너를 쉽게 실행, 중지 및 관리할 수 있게 해주는 컨테이너 관리 서비스입니다.

Datadog은 무엇인가요?

올리브영 ECS Fargat, Datadog Overview
Datadog은 서비스 전반에 대한 End to End. Multi Infra, Multi Platform, Log 등의 Resource 들을 "통합"하여 모니터링하기 위한 솔루션입니다.

기존 올리브영 온라인몰의 서비스 모니터링 환경은 시스템적으로 산재하여(Jennifer, Maxguage 등) 있었고 일부 영역들은 모니터링을 할 수 있는 환경이 갖추어져 있지 않았습니다. 이외에도 여러 문제점이 있었고 이를 개선하기 위해 작년 10월부터 데이터독으로 모니터링하기 시작했습니다.

현재 올리브영에서는?

올리브영의 Mini Service는 AWS ECS Fargate 를 통해 제공되고 있습니다. 각 Service의 Health Check 및 오류 로그 추적, API 응답 속도를 모니터링 하기 원활하게 하기 위해 Datadog 을 도입해 사용하고 있습니다! 그렇다면 이제 정말로 ECS Fargate 에서 Datadog 을 연결해봅시다!

결론을 좋아하는 한국 사람을 위해 Overview of integration부터 보고 가시죠!

올리브영 ECS Fargat, Datadog Overview

오늘 포스팅을 따라하신다면 위의 사진처럼 구성이 가넝가넝

본격적인 ECS Fargate와 Datadog 적용기

0. 준비사항

ECS Fargate와 Datadog을 적용하기 위해 Datadog Agent (executable jar), Datadog Access Key (Datadog 에서 생성), Docker Application 가 필요합니다.

작업 순서는 아래와 같습니다.

  1. ECS Task에 Datadog Agent Container 추가
  2. Container > Application Entrypoint 수정

올리브영 Mini Service는 크게 React Application과 Spring Boot Application으로 구분할 수 있는데요. 여기서는 Spring Application에 적용하는 방법을 안내해 드리겠습니다.

1.ECS Task에 Datadog Agent Container 추가

ECS Task에 Datadog Agent Container 추가 방법 1

1. Aws Console > ECS > Datadog Agent 를 적용할 Task를 선택합니다.

ECS Task에 Datadog Agent Container 추가 방법 2

2. Task를 선택한 후 "Create New Version" 을 클릭해 Task를 업데이트 할 수 있도록 합니다.

ECS Task에 Datadog Agent Container 추가 방법 3

3. "Container Definition" 섹션에서 "Add Container" 를 클릭해 Datadog container 를 추가할 수 있게 합니다.

ECS Task에 Datadog Agent Container 추가 방법 4

4. Datadog Agent는 별도의 container Image를 구성하지 않고 공식 Image 를 사용합니다. Image 주소는 다음과 같습니다 : public.ecr.aws/datadog/agent:latest포트는 8125/8126 두개로 구성합니다.

ECS Task에 Datadog Agent Container 추가 방법 5

5. 그리고 Agent Environment Option을 추가합니다. DD_API_KEY 는 Datadog 의 Integration Menu에서 확인 가능합니다.


Agent 구동 시 설정한 각 변수의 의미는 다음과 같습니다.

변수명 설명
DD_ENV Application 환경 (dev, local, production) 정의
DD_SERVICE 동일한 작업을 수행하는 프로세스 집합의 이름, 여기선 Application Name 입니다.
DD_PROFILING_ENABLED Continuous Profiler 활성화 여부 (JDK FlightRecorder 사용) FlightRecorderOption은 이 Option과 연관있습니다.
DD_LOG_INJECTION MDC key injection 활성화



여기까지 완료 되었다면 ECS Task에 Datadog Agent Container이 추가가 되었을겁니다! 이후 Container의 Application Entrypoint 해야합니다! 얼마 안남았으니 조금만 더 화이팅해보아요!


2.Container > Application Entrypoint 수정

JVM 위에서 동작하는 Application의 Metric을 수집하기 위해 Application에서도 Tracing Agent 구성이 필요합니다. 올리브영 Mini Service는 Docker로 구성된 Kotlin - Spring boot Application으로 구성되어 있으므로 Dockerfile의 Application 실행 부분을 수정해 줍니다.

# AS-IS
# ENTRYPOINT ["java","-Dspring.profiles.active=production", "-jar","/app.jar"]

# TO-BE
ENTRYPOINT ["java","-javaagent:/usr/agent/dd-java-agent.jar", "-Ddd.agent.host=localhost",
"-Ddd.profiling.enabled=true","-XX:FlightRecorderOptions=stackdepth=256", "-Ddd.logs.injection=true", "-Ddd.service=discovery-api", "-Ddd.env=prod",
"-Dspring.profiles.active=production", "-jar", "/app.jar"]

React Application 의 경우는 아래와 같이 설정을 바꾸어 주면됩니다.

// server.ts
import "./tracer";

// tracer.ts
import tracer from "dd-trace";
tracer.init(); // hoisting 방지를 위해 다른 모듈에서 실행
export default tracer;

⭐️ 그런데 이 과정에서 주의해야 할 점이 있는데요! 바로 "-Ddd.agent.host" 항목입니다. Aggregation Agent의 host를 지정해야 하는데요, 앞서 설정한 ECS task에 추가한 Datadog Agent의 호스트를 지정해야 합니다. Bridge Mode와는 다르게 awsvpc 모드에서는 1개의 Task가 ENI를 할당받습니다. 여기서는 1 Task 당 2개의 container를 구동하기 때문에 "localhost" 로 입력합니다. 만약 다른 Task의 Container와 연결 해야 한다면 각 Task의 고유 할당된 IP를 입력해야 합니다.

올리브영 테크 블로그 ECS Fargate 에서 Datadog 을 연결 방법

ㅎㅎ ㅇㅇ~

ECS Network mode?

ECS > Task 에는 3가지 network mode가 제공됩니다. 겸사겸사 각 네트워크 모드의 특징을 정리해 보겠습니다.

bridge mode

ECS bridge mode

  • 기본으로 설정됩니다. (fargate 제외)
  • 각 container 에서 동일한 Port 를 실행한 후 각 container Port 를 host 의 다른 Port에 매핑할 수 있도록 하므로 동적 host Port 매핑을 활용할 수 있습니다.
  • bridge network가 가상화되고 Docker 소프트웨어가 호스트로 들어오고 나가는 트래픽의 변환을 수행하기 때문에 networking 성능이 우수하지 않습니다.

host mode

ECS host mode

  • container port 를 EC2 인스턴스의 Network 인터페이스에 직접 매핑합니다.그리고 EC2 인스턴스의 동일한 Network 네임스페이스를 공유하므로 container가 host IP 주소와 동일한 IP를 사용합니다.
  • host mode 는 가상 Docker Network 대신 EC2 Network 스택을 사용하므로 bridge mode보다 빠른 성능을 제공합니다.

awsvpc mode

ECS awsvpc mode

  • 각 Task 당 한개의 ENI (Elastic Network Interface) 를 제공합니다.
  • Task 당 하나의 container가 있는 경우 각 container에 ENI 가 할당되고 VPC 서브넷 IP 주소 풀에서 주소를 가져옵니다.
  • EC2 네트워크 스택도 사용하므로 bridge mode 보다 빠른 성능을 제공합니다. 기본적으로 각 Task가 자체 ENI를 사용해 VPC 내에서 EC2 인스턴스와 동일하게 동작하도록 합니다.



올리브영 테크 블로그 ECS Fargate 에서 Datadog 을 연결 방법

다 모르셔도 괜찮습니다. 사는데에는 지장이 없는데 전 지장있습니다.

💚 적용이후 우리는 이렇게 모니터링 합니다

ECS Fargate 에서 Datadog 을 연결까지 모두 완료했습니다 🎉🎉🎉

모든 설정과 연결이 완료가 되면 아래 사진과 같이 Datadog 으로 모니터링이 가능합니다~!

올리브영 ECS Fargate 에서 Datadog 을 연결

Application Level 에서의 지표, Application에서 실행한 Tracing Agent에서 수집한 지표를 확인할 수 있습니다.

올리브영 ECS Fargate 에서 Datadog 을 연결

ECS Level 의 지표, Container / Task / Cluster 단위의 Metric을 확인할 수 있습니다.

마무리

오늘의 포스팅은 다른 시리즈보다 더 많은 설정과 설명이 많았는데요! CI/CD 이후 Datadog을 통한 Cluster/ Application Monitoring 하는 과정이라 조금 어려울 수 있지만 그래도 쉽게 설명하고자 노력했습니다. 다음 시리즈는 바로바로 VPC Link를 이용해 ECS와 AWS Gateway의 연결방법을 소개하고자 합니다. 그렇다면 우리 다음에 만나요!💚

ECSDatadogDevOps
올리브영 테크 블로그 작성 Datadog - "저는 모니터링 요정입니다. ✋🏻"
🤬
코코리 |
Back-end Engineer
복사해서 붙여넣기 잘하고 싶습니다.