ECS 애플리케이션 추적

개요

ECS 컨테이너에서 트레이스를 수집하려면 아래 설명된 대로 에이전트와 애플리케이션 컨테이너 모두에 대한 작업 정의를 업데이트하세요.

옵션 중 하나는 이전에 사용한 작업 정의 파일업데이트된 작업 정의 등록을 수정하는 것입니다. 대신 Amazon Web UI에서 직접 작업 정의를 편집할 수 있습니다.

활성화되면 Datadog 에이전트 컨테이너가 동일한 호스트에 있는 다른 애플리케이션 컨테이너에서 전송된 트레이스를 수집합니다.

트레이스를 수신하도록 Datadog 에이전트 설정

  1. 실행되는 ECS 컨테이너에서 모든 트레이스를 수집하려면 아래 설정을 사용해 원래 ECS 설정에서 에이전트 작업 정의를 업데이트하세요.

    필수 기본 설정에 대한 참조 요소로 datadog-agent-ecs-apm.json을 사용합니다. Datadog 에이전트 컨테이너에 대한 작업 정의에서 tcp 프로토콜을 사용해 8126에 있는 호스트-컨테이너 포트를 설정합니다.

    {
      "containerDefinitions": [
        {
          "name": "datadog-agent",
          "image": "public.ecr.aws/datadog/agent:latest",
          "cpu": 100,
          "memory": 512,
          "essential": true,
          "portMappings": [
            {
              "hostPort": 8126,
              "protocol": "tcp",
              "containerPort": 8126
            }
          ],
          (...)
        }
      ]
    }
    
  2. 에이전트 v7.17 이하의 경우 다음 환경 변수를 추가합니다.

    "environment": [
      (...)
      {
        "name": "DD_APM_ENABLED",
        "value": "true"
      },
      {
        "name": "DD_APM_NON_LOCAL_TRAFFIC",
        "value": "true"
      }
    ]
    
  3. 에이전트의 작업 정의에서 로컬 파일을 업데이트하려면 업데이트된 작업 정의를 등록하세요. 이를 통해 새 수정을 생성할 수 있습니다. 그런 다음 Datadog 에이전트를 위한 데몬 서비스에서 이 업데이트된 수정을 참조할 수 있습니다.

애플리케이션 컨테이너를 수정하여 Datadog 에이전트에 트레이스 제출

추적 라이브러리 설치

애플레케이션 언어의 경우 [Datadog 추적 라이브러리 설치를 위한 설정 지침]을 따르세요. ECS의 경우 애플리케이션 컨테이너 이미지에 트레이서를 설치하세요.

EC2 인스턴스에 대한 비공개 IP 주소 제공

애플리케이션 컨테이너가 실행되는 기본 EC2 인스턴스의 비공개 IP 주소를 사용해 트레이서를 제공하세요. 이 주소는 트레이서 엔드포인트의 호스트 이름입니다. 동일한 호스트(호스트 포트가 활성화된 경우)에 있는 Datadog 에이전트 컨테이너가 이 트레이스를 수신합니다.

다음 방법 중 하나를 사용해 동적으로 비공개 IP 주소 얻기:

Amazon EC2 메타데이터 엔드포인트(IMDSv1)을 통해 비공개 IP 주소 검색을 허용할 수 있습니다. 각 호스트에 대한 비공개 IP 주소를 얻으려면 다음 URL에 Curl을 사용합니다.

curl http://169.254.169.254/latest/meta-data/local-ipv4

인스턴스 메타데이터 서비스(IMDSv2) 버전 2를 사용하는 경우

TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl http://169.254.169.254/latest/meta-data/local-ipv4 -H "X-aws-ec2-metadata-token: $TOKEN"

Amazon ECS 컨테이너 메타데이터 파일을 통해 비공개 IP 주소 검색을 허용할 수 있습니다. 각 호스트에 대한 비공개 IP 주소를 얻으려면 다음 명령을 실행하세요.

cat $ECS_CONTAINER_METADATA_FILE | jq -r .HostPrivateIPv4Address

트레이스를 전송하는 각 애플리케이션 컨테이너에 대한 DD_AGENT_HOST 환경 변수를 설정하여 이 요청 결과를 트레이서에 제공합니다.

트레이스 에이전트 엔트포인트 설정

ECS 애플리케이션 변수가 시작 시점에 설정된 경우(Java, .NET 및 PHP), 위 방법 중 하나를 사용해 DD_AGENT_HOST를 포함하는 환경 변수로 트레이서 엔드포인트의 호스트이름을 설정해야 합니다. 아래 얘시는 IMDSv1 메타데이터 엔드포인트를 사용하지만 필요한 경우 설정을 교환 사용할 수 있습니다. 시작 요소로 시작 스크립트가 있는 경우 스크립트의 일부로 이 호출을 포함합니다. 아니면 ECS 작업 정의의 entryPoint에 추가합니다.

다른 지원되는 언어(파이썬(Python), 자바스크립트(Javascript), 루비(Ruby), 고(Go)의 경우 대신 애플리케이션 소스 코트에 호스트 이름을 설정할 수 있습니다.

시작 시간 변수

다음으로 <Python Startup Command>을 대체하여 작업 정의의 entryPoint를 업데이트합니다.

"entryPoint": [
  "sh",
  "-c",
  "export DD_AGENT_HOST=$(curl http://169.254.169.254/latest/meta-data/local-ipv4); <Python Startup Command>"
]

파이썬(Python)의 경우 시작 명령은 일반적으로 ddtrace-run python my_app.py지만 사용한 프레임워크에 따라 달라질 수 있습니다. 예를 들어 uWSGI를 사용하거나 [patch_all를 사용해 직접 코드를 계측하세요].

코드

대신 코드를 업데이트해 트레이서가 명시적으로 호스트 이름을 설정할 수 있도록 할 수 있습니다.

import requests
from ddtrace import tracer


def get_aws_ip():
  r = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4')
  return r.text

tracer.configure(hostname=get_aws_ip())

IMDSv2

IMDSv2를 사용하는 경우 해당 entryPoint 설정이 다음과 같습니다. 위 예시에서처럼 언어에 따라 <Startup Command>를 적절한 명령으로 대체합니다.

"entryPoint": [
  "sh",
  "-c",
  "export TOKEN=$(curl -X PUT \"http://169.254.169.254/latest/api/token\" -H \"X-aws-ec2-metadata-token-ttl-seconds: 21600\"); export DD_AGENT_HOST=$(curl -H \"X-aws-ec2-metadata-token: $TOKEN\" http://169.254.169.254/latest/meta-data/local-ipv4); <Startup Command>"
]

참고 자료

PREVIEWING: carles.capell/nodejs-security-controls