상세 컨텐츠

본문 제목

Splunk Otel Collector install on AWS ECS EC2

Splunk/Observability

by 야솔아빠 2024. 3. 20. 09:41

본문

반응형

[환경]

1. Java 17 SpringBoot

- Factorial 서비스

- docker pull command

docker pull ijung075/factorial-app

- AWS ECR URI

public.ecr.aws/e7b5k4u7/factorial

만약 AWS ECR 로 docker image를 push 해야 한다면...

# docker hub에서 최신 image 를 pull
docker pull ijung075/factorial-app:latest

# ECR에 image tagging
docker tag ijung075/factorial-app:latest public.ecr.aws/e7b5k4u7/factorial:latest

# ECR에 push
docker push public.ecr.aws/e7b5k4u7/factorial:latest

- test

http://IP:8080/factorial?n=5

 

2. AWS ECS on EC2

환경 구성 순서

- ECS Clustering 생성

- Task 정의

awsvpc로 설정시, Task Public IP를 할당 받을 수 없음.

이문제 해결방법:

옵션 1] 네트워크 모드를 "bridge [2]" 또는 "host [3]" 모드로 변경합니다.
"bridge/host" 모드를 사용하는 경우 EC2 인스턴스에 할당된 Public IP를 통해 외부에서 컨테이너로 접근을 할 수 있습니다. Task Definition을 정의할 때 "networkMode" 파라미터 [4]를 'bridge' 또는 'host'로 설정하여 변경하실 수 있습니다. ECS Service에 변경된 Task Definition으로 배포 후 EC2 인스턴스의 Public IP와 Host mapping port (ex. 23.22.37.249:8080)로 접근을 시도해보시기 바랍니다.

옵션 2] ELB를 연결하여 ELB의 URL을 통해 해당 Task에 접근합니다.
Task가 1개일 때는 Host의 IP를 이용하여 접근하는 것이 가능하지만 Task가 여러 개로 구성되어 있는 경우 ELB를 통해서 Service로 유입되는 트래픽을 분산처리하여야 합니다. ALB와 NLB를 생성하여 ECS Service에 매핑시킬 수 있으며 관련하여 자세한 설명은 문서 [5][6]를 참고하시기 바랍니다.

- 서비스 정의 및 배포

 

3. Splunk Otel Collector 설치 (Single container)

AWS ECS > Task definitions > Create new revision > Create new revision with JSON

Splunk Otel collector (ECS EC2)의 가이드 (위 화면)의 JSON을 복사하여, overwrite 함.

이후 가이드는 Splunk Otel collector (ECS EC2)의 가이드대로 진행을 한다. (서비스 배포)

 

* 이렇게 배포된 otel collector는 APM, Log를 위한 용도이며, ECS clustering에 속한 service, task를 모니터링 하지 못함.

Cloudwatch를 통해서 연동해야 함.

 

3. Splunk Otel Collector 설치 (sidecar)

기존의 서비스 task

{
    "taskDefinitionArn": "arn:aws:ecs:us-east-1:432274630114:task-definition/factorial-task:6",
    "containerDefinitions": [
        {
            "name": "factorial",
            "image": "public.ecr.aws/e7b5k4u7/factorial",
            "cpu": 0,
            "portMappings": [
                {
                    "name": "forwader8080",
                    "containerPort": 8080,
                    "hostPort": 8080,
                    "protocol": "tcp",
                    "appProtocol": "http"
                },
                {
                    "name": "forwarder80",
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "essential": true,
            "environment": [],
            "environmentFiles": [],
            "mountPoints": [],
            "volumesFrom": [],
            "ulimits": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-create-group": "true",
                    "awslogs-group": "/ecs/factorial-task",
                    "awslogs-region": "us-east-1",
                    "awslogs-stream-prefix": "ecs"
                },
                "secretOptions": []
            },
            "systemControls": []
        }
    ],
    "family": "factorial-task",
    "taskRoleArn": "arn:aws:iam::432274630114:role/ecsTaskExecutionRole",
    "executionRoleArn": "arn:aws:iam::432274630114:role/ecsTaskExecutionRole",
    "networkMode": "bridge",
    "revision": 6,
    "volumes": [],
    "status": "ACTIVE",
    "requiresAttributes": [
        {
            "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
        },
        {
            "name": "ecs.capability.execution-role-awslogs"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
        },
        {
            "name": "com.amazonaws.ecs.capability.task-iam-role"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.29"
        }
    ],
    "placementConstraints": [],
    "compatibilities": [
        "EC2"
    ],
    "requiresCompatibilities": [
        "EC2"
    ],
    "cpu": "1024",
    "memory": "3072",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    },
    "registeredAt": "2024-03-17T01:50:43.408Z",
    "registeredBy": "arn:aws:sts::432274630114:assumed-role/AWSReservedSSO_SPLKAdministratorAccess_06c8810013bb6e59/ijung@splunk.com",
    "tags": []
}

 

task에 otel collector 추가 (변경후 task)

{
    "taskDefinitionArn": "arn:aws:ecs:us-east-1:432274630114:task-definition/factorial-task:12",
    "containerDefinitions": [
        {
            "name": "factorial",
            "image": "public.ecr.aws/e7b5k4u7/factorial",
            "cpu": 1024,
            "portMappings": [
                {
                    "name": "forwader8080",
                    "containerPort": 8080,
                    "hostPort": 8080,
                    "protocol": "tcp",
                    "appProtocol": "http"
                },
                {
                    "name": "forwarder80",
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "essential": true,
            "environment": [],
            "mountPoints": [],
            "volumesFrom": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-create-group": "true",
                    "awslogs-group": "/ecs/factorial-task",
                    "awslogs-region": "us-east-1",
                    "awslogs-stream-prefix": "ecs"
                }
            },
            "systemControls": []
        },
        {
            "name": "splunk-otel-collector",
            "image": "quay.io/signalfx/splunk-otel-collector:latest",
            "cpu": 512,
            "memory": 512,
            "portMappings": [],
            "essential": true,
            "environment": [
                {
                    "name": "METRICS_TO_EXCLUDE",
                    "value": "[]"
                },
                {
                    "name": "HOST_DEV",
                    "value": "/hostfs/dev"
                },
                {
                    "name": "HOST_ETC",
                    "value": "/hostfs/etc"
                },
                {
                    "name": "SPLUNK_CONFIG",
                    "value": "/etc/otel/collector/ecs_ec2_config.yaml"
                },
                {
                    "name": "SPLUNK_REALM",
                    "value": "us1"
                },
                {
                    "name": "HOST_PROC",
                    "value": "/hostfs/proc"
                },
                {
                    "name": "SPLUNK_ACCESS_TOKEN",
                    "value": "토큰값"
                },
                {
                    "name": "HOST_SYS",
                    "value": "/hostfs/sys"
                },
                {
                    "name": "HOST_RUN",
                    "value": "/hostfs/run"
                },
                {
                    "name": "ECS_METADATA_EXCLUDED_IMAGES",
                    "value": "[\"quay.io/signalfx/splunk-otel-collector\"]"
                },
                {
                    "name": "HOST_VAR",
                    "value": "/hostfs/var"
                }
            ],
            "mountPoints": [
                {
                    "sourceVolume": "hostfs",
                    "containerPath": "/hostfs",
                    "readOnly": true
                }
            ],
            "volumesFrom": [],
            "systemControls": []
        }
    ],
    "family": "factorial-task",
    "taskRoleArn": "arn:aws:iam::432274630114:role/ecsTaskExecutionRole",
    "executionRoleArn": "arn:aws:iam::432274630114:role/ecsTaskExecutionRole",
    "networkMode": "bridge",
    "revision": 12,
    "volumes": [
        {
            "name": "hostfs",
            "host": {
                "sourcePath": "/"
            }
        }
    ],
    "status": "ACTIVE",
    "requiresAttributes": [
        {
            "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
        },
        {
            "name": "ecs.capability.execution-role-awslogs"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
        },
        {
            "name": "com.amazonaws.ecs.capability.task-iam-role"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.29"
        }
    ],
    "placementConstraints": [],
    "compatibilities": [
        "EC2"
    ],
    "requiresCompatibilities": [
        "EC2"
    ],
    "cpu": "2048",
    "memory": "6072",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    },
    "registeredAt": "2024-03-19T14:54:21.178Z",
    "registeredBy": "arn:aws:sts::432274630114:assumed-role/AWSReservedSSO_SPLKAdministratorAccess_06c8810013bb6e59/ijung@splunk.com",
    "tags": []
}

containerDefinitions의 하위의 아래 항목을 그대로 추가.

"cpu" --> 값을 지정해되 됨

"environment"

"essential"

"image"

"memory" --> 값을 지정해도 됨

"mountPoints"

"volumes"--> 이 항목의 위치가 위의 항목들과 다르므로 변경후의 JSON task를 참고

아래처럼 splunk-otel-collector task 뿐만 아니라 기존 application task도 모니터링 가능

반응형

관련글 더보기

댓글 영역