[OpenTelemetry] AWS ECS 로그 수집 구성
관련 포스트
https://blog.naver.com/sssang97/224267416141
OpenTelemetry 기반의 수집기에 AWS ECS 로그를 붙이는 방법을 정리한다.
내 경우에는 Clickstack에 붓는 용도로 썼는데, 대상 시스템이 otel 호환만 되면 큰 차이는 없을 것이다.
조금 번잡스러울 수 있다.
서비스명과 env 같은 커스텀라벨을 주입하기 위해서는 collector를 좀 개조해야하기 때문이다.
그래서 그림으로 그리면 이런 흐름이 된다.
메인 컨테이너 구성
메인 컨테이너에는 로그 구성을 Firelens로 대체하고 다음과 같은 옵션을 넣어줘야 한다.

"containerDefinitions": [
{
"name": "api-server",
"image": ...
"logConfiguration": {
"logDriver": "awsfirelens",
"options": {
"Host": "127.0.0.1",
"Name": "forward",
"Port": "8006"
}
},
otel collector로 넘겨주게 하기 위해서 forward 옵션을 넣어줘야 한다.
이렇게 하지 않으면 firelens로 곧장 넘어간다.
그리고 로그가 유실되지 않도록 dependsOn도 적절히 넣어준다.
필수까진 아니지만 확실하게 수집하려면 이렇게 하는게 좋다.
안 그러면 메인 컨테이너가 먼저 떠버려서 초기 로그가 증발하는 불상사가 일어난다.
Firelens 컨테이너 구성
이건 이제 로그를 퍼오는 중개자 역할이다.
적당히 기본 이미지 갖다붙이고,
실행 순서를 보정하기 위해 상태확인을 정의한다.

그리고 otel collector가 실행된 이후에 firelens가 실행되도록 순서를 보정한다.

다음은 컨테이너 정의에 대한 JSON 전문이다.
{
"name": "log_router",
"image": "amazon/aws-for-fluent-bit:stable",
"cpu": 0,
"portMappings": [],
"essential": true,
"environment": [],
"mountPoints": [],
"volumesFrom": [],
"dependsOn": [
{
"containerName": "otel_collector",
"condition": "HEALTHY"
}
],
"user": "0",
"logConfiguration": {
...
},
"healthCheck": {
"command": ["CMD-SHELL", "bash -c 'exec 3<>/dev/tcp/127.0.0.1/24224'"],
"interval": 10,
"timeout": 5,
"retries": 3,
"startPeriod": 10
},
"systemControls": [],
"firelensConfiguration": {
"type": "fluentbit",
"options": {
"enable-ecs-log-metadata": "true"
}
}
}
이 컨테이너는 트러블슈팅을 위해 cloudwatch log를 활성화하는걸 추천한다.
otel collector 컨테이너 구성
마지막은 otel collector다. 이게 최종적으로 otel 엔드포인트에 로그를 전송하는 역할을 할 것이다.
이건 좀 커스텀을 해야할 수 있어서 직접 말아쓰는 것이 좋다.
베이스 코드는 github에 있다.
https://github.com/myyrakle/infrastructures/tree/master/Dockerfiles/aws-ecs-otel-collector
직접 말아서 써도 되고, 내가 올려둔걸 그대로 써도 된다. "myyrakle/otel-collector:latest" 이거다.
아무튼 적절히 ECR에 올려서 붙이면 된다.

그리고 여기에 엔드포인트 정보와 env/service 태그, 키를 넣으면 된다.

상태확인도 필요하다.

아래는 JSON 전문이다.
{
"name": "otel_collector",
"image": "....dkr.ecr.ap-northeast-2.amazonaws.com/otel-collector:latest",
"cpu": 0,
"portMappings": [],
"essential": true,
"environment": [
{
"name": "OTEL_SERVICE_NAME",
"value": "서비스명"
},
{
"name": "DEPLOY_ENV",
"value": "ENV명"
},
{
"name": "OTEL_INGESTION_KEY",
"value": "키"
},
{
"name": "OTEL_EXPORTER_OTLP_ENDPOINT",
"value": "https://clickhouse-... 엔드포인트"
}
],
"mountPoints": [],
"volumesFrom": [],
"logConfiguration": {
...
},
"healthCheck": {
"command": ["CMD", "/busybox", "wget", "-qO-", "http://127.0.0.1:13133/"],
"interval": 10,
"timeout": 5,
"retries": 3,
"startPeriod": 10
},
"systemControls": []
}
이 컨테이너도 트러블슈팅을 위해 cloudwatch log를 활성화하는걸 추천한다.
그렇게 해서 작업구성 정의하고 실행해서
컨테이너 다 이상 없이 잘 뜨고
clickhouse에 otel log 잘 찍히고
최종적으로 대시보드에서도 잘 보이면 끝이다.
참조
https://docs.fluentbit.io/manual/data-pipeline/outputs/opentelemetry
https://hub.docker.com/r/otel/opentelemetry-collector-contrib/tags?page=3