Amazon ECS Windows 컨테이너에서 Fluent Bit 배포
Fluent Bit는 다양한 운영 체제에서 지원하는 빠르고 유연한 로그 프로세서 및 라우터입니다. Amazon CloudWatch Logs, Firehose Amazon S3 및 Amazon OpenSearch Service와 같은 다양한 AWS 대상으로 로그를 라우팅하는 데 사용할 수 있습니다. Fluent Bit는 Datadog
AWS for Fluent Bit 이미지는 고가용성을 위해 대부분 리전의 Amazon ECR 퍼블릭 갤러리와 Amazon ECR 리포지토리에 있는 Amazon ECR에 사용할 수 있습니다. 자세한 내용은 GitHub 웹 사이트의
aws-for-fluent-bit
이 자습서에서는 Amazon ECS에서 실행 중인 Windows 인스턴스에 Fluent Bit 컨테이너를 배포하여 중앙 집중식 로깅을 위해 Windows 작업에서 생성된 로그를 Amazon CloudWatch로 스트리밍하는 방법을 안내합니다.
이 자습서에서는 다음 접근 방식을 사용합니다.
-
Fluent Bit는 대몬(daemon) 스케줄링 전략과 함께 서비스로 실행됩니다. 이 전략은 Fluent Bit의 단일 인스턴스가 항상 클러스터의 컨테이너 인스턴스에서 실행되도록 합니다.
-
전달 입력 플러그인을 사용하여 포트 24224에서 수신 대기합니다.
-
도커 런타임에서 노출된 포트를 사용하여 Fluent Bit로 로그를 전송할 수 있도록 포트 24224를 호스트에 노출합니다.
-
Fluent Bit가 지정된 대상으로 로그 레코드를 전송하도록 허용하는 구성이 있습니다.
-
-
fluentd 로깅 드라이버를 사용하여 다른 모든 Amazon ECS 작업 컨테이너를 실행합니다. 자세한 내용은 도커 설명서 웹 사이트의 Fluentd logging driver
(Fluentd 로깅 드라이버)를 참조하세요. -
도커 는 호스트 네임스페이스 내의 로컬 호스트에 있는 TCP 소켓 24224에 연결합니다.
-
Amazon ECS 에이전트는 클러스터 이름, 작업 정의 패밀리 이름, 작업 정의 개정 번호, 작업 ARN 및 컨테이너 이름을 포함하는 레이블을 컨테이너에 추가합니다. fluentd docker 로깅 드라이버의 label 옵션을 사용하여 동일한 정보가 로그 레코드에 추가됩니다. 자세한 내용은 도커 설명서 웹 사이트의 labels, labels-regex, env, and env-regex
(labels, labels-regex, env 및 env-regex)를 참조하세요. -
fluentd 로깅 드라이버의
async
옵션이true
로 설정되어 있기 때문에 Fluent Bit 컨테이너가 다시 시작되면 도커는 Fluent Bit 컨테이너가 다시 시작될 때까지 로그를 버퍼링합니다. fluentd-buffer-limit 옵션을 설정하여 버퍼 제한을 높일 수 있습니다. 자세한 내용은 도커 설명서 웹 사이트의 fluentd-buffer-limit을 참조하세요.
-
작업 흐름은 다음과 같습니다.
-
Fluent Bit 컨테이너는 호스트에 노출된 포트 24224에서 시작하고 수신 대기합니다.
-
Fluent Bit는 작업 정의에 지정된 작업 IAM 역할 자격 증명을 사용합니다.
-
동일한 인스턴스에서 실행되는 다른 작업은 fluentd docker 로깅 드라이버를 사용하여 포트 24224의 Fluent Bit 컨테이너에 연결합니다.
-
애플리케이션 컨테이너가 로그를 생성하면 도커 런타임은 해당 레코드에 태그를 지정하고, 레이블에 지정된 추가 메타데이터를 추가한 다음 호스트 네임스페이스의 포트 24224에 전달합니다.
-
Fluent Bit는 포트 24224에서 로그 레코드를 수신하는데, 이 포트가 호스트 네임스페이스에 노출되기 때문입니다.
-
Fluent Bit는 내부 처리를 수행하고 지정된 대로 로그를 라우팅합니다.
이 자습서에서는 다음을 수행하는 기본 CloudWatch Fluent Bit 구성을 사용합니다.
-
각 클러스터 및 작업 정의 패밀리에 대한 새 로그 그룹을 생성합니다.
-
새 작업이 시작될 때마다 위에 생성된 로그 그룹의 각 작업 컨테이너에 대한 새 로그 스트림을 생성합니다. 각 스트림에는 컨테이너가 속한 작업 ID가 표시됩니다.
-
클러스터 이름, 작업 ARN, 작업 컨테이너 이름, 작업 정의 패밀리, 작업 정의 개정 번호를 비롯한 추가 메타데이터를 각 로그 항목에 추가합니다.
예를 들어
container_1
및container_2
가 포함된task_1
과container_3
이 포함된 task_2
가 있는 경우 CloudWatch 로그 스트림은 다음과 같습니다.-
/aws/ecs/windows.ecs_task_1
task-out.
TASK_ID
.container_1task-out.
TASK_ID
.container_2 -
/aws/ecs/windows.ecs_task_2
task-out.
TASK_ID
.container_3
-
단계
사전 조건
이 자습서에서는 다음 사전 조건이 충족되었다고 가정합니다.
-
최신 버전의 AWS CLI가 설치 및 구성됩니다. 자세한 내용은 AWS CLI 최신 버전 설치 또는 업데이트를 참조하세요.
-
aws-for-fluent-bit
컨테이너 이미지는 다음 Windows 운영 체제에서 사용할 수 있습니다.-
Windows Server 2019 Core
-
Windows Server 2019 Full
-
Windows Server 2022 Core
-
Windows Server 2022 Full
-
-
Amazon ECS 사용 설정의 단계가 완료되었습니다.
-
클러스터가 있습니다. 이 자습서에서 클러스터 이름은 FluentBit-cluster입니다.
-
EC2 인스턴스를 실행할 퍼블릭 서브넷이 포함된 VPC가 있습니다. 기본 VPC를 사용할 수 있습니다. Amazon CloudWatch 엔드포인트가 서브넷에 도달할 수 있도록 하는 프라이빗 서브넷을 사용할 수도 있습니다. Amazon CloudWatch 엔드포인트에 대한 자세한 내용은 AWS 일반 참조의 Amazon CloudWatch endpoints and quotas를 참조하세요. VPC 생성을 위해 Amazon VPC 마법사를 사용하는 방법에 대한 자세한 내용은 Virtual Private Cloud 생성 섹션을 참조하세요.
1단계: IAM 액세스 역할 생성
Amazon ECS IAM 역할을 생성합니다.
-
Amazon ECS 컨테이너 인스턴스 역할 "ecsInstanceRole"을 생성합니다. 자세한 내용은 Amazon ECS 컨테이너 인스턴스 IAM 역할을 참조하세요.
-
이름이
fluentTaskRole
인 Fluent Bit 작업에 대한 IAM 역할을 생성합니다. 자세한 내용은 Amazon ECS 작업 IAM 역할 단원을 참조하십시오.이 IAM 역할에 부여된 IAM 권한은 작업 컨테이너에서 수임합니다. Fluent Bit에서 CloudWatch로 로그를 전송하도록 허용하려면 작업 IAM 역할에 다음 권한을 연결해야 합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup", "logs:DescribeLogStreams", "logs:PutLogEvents" ], "Resource": "*" } ] }
-
책을 역할에 연결합니다.
-
fluent-bit-policy.json
파일에 위 내용을 저장합니다. -
다음 명령을 실행하여 인라인 정책을
fluentTaskRole
IAM 역할에 연결합니다.aws iam put-role-policy --role-name fluentTaskRole --policy-name fluentTaskPolicy --policy-document file://fluent-bit-policy.json
-
2단계: Amazon ECS Windows 컨테이너 인스턴스 생성
Amazon ECS Windows 컨테이너 인스턴스를 생성합니다.
Amazon ECS 인스턴스 생성
-
aws ssm get-parameters
명령을 사용하여 VPC를 호스팅하는 리전에 대한 AMI ID를 검색합니다. 자세한 내용은 Amazon ECS 최적화 AMI 메타데이터 검색을 참조하세요. -
Amazon EC2 콘솔을 사용하여 인스턴스를 시작합니다.
https://console.aws.amazon.com/ec2/
에서 Amazon EC2 콘솔을 엽니다. -
탐색 모음에서 사용할 리전을 선택합니다.
-
EC2 대시보드에서 인스턴스 시작(Launch Instance)을 선택합니다.
-
Name(이름)에 고유한 이름을 입력합니다.
-
Application and OS Images (Amazon Machine Image)(애플리케이션 및 OS 이미지(Amazon Machine Image))에서 첫 번째 단계에서 검색한 AMI를 선택합니다.
-
인스턴스 유형에서
t3.xlarge
를 선택합니다. -
Key pair (login)(키 페어(로그인))에서 키 페어를 선택합니다.
-
Network settings(네트워크 설정)의 Security group(보안 그룹)에서 기존 보안 그룹을 선택하거나 새 보안 그룹을 생성합니다.
-
Network settings(네트워크 설정)의 Auto-assign Public IP(퍼블릭 IP 자동 할당)에서 Enable(활성화)을 선택합니다.
-
Advanced details(고급 세부 정보)의 IAM instance profile(IAM 인스턴스 프로파일)에서 ecsInstanceRole을 선택합니다.
-
다음 사용자 데이터로 Amazon ECS 컨테이너 인스턴스를 구성합니다. Advanced Details(고급 세부 정보)에서 다음 스크립트를 User data(사용자 데이터) 필드에 붙여 넣고
cluster_name
을 클러스터의 이름으로 바꿉니다.<powershell> Import-Module ECSTools Initialize-ECSAgent -Cluster
cluster-name
-EnableTaskENI -EnableTaskIAMRole -LoggingDrivers '["awslogs","fluentd"]' </powershell> -
준비가 되었으면 승인 필드를 선택한 다음 인스턴스 시작(Launch Instances)을 선택합니다.
-
확인 페이지에서 인스턴스가 실행 중인지 확인할 수 있습니다. 인스턴스 보기를 선택하여 확인 페이지를 닫고 콘솔로 돌아갑니다.
3단계: Fluent Bit 구성
AWS에서 제공하는 다음 기본 구성을 사용하여 빠르게 시작할 수 있습니다.
-
Fluent Bit 공식 설명서의 Amazon CloudWatch
용 Fluent Bit 플러그인을 기반으로 하는 Amazon CloudWatch
또는 AWS에서 제공하는 다른 기본 구성을 사용할 수 있습니다. 자세한 내용은 Github 웹 사이트의 aws-for-fluent-bit
에서 Windows 이미지용 엔트리포인트 재정의
기본 Amazon CloudWatch Fluent Bit 구성은 아래와 같습니다.
다음 변수를 바꿉니다.
-
region
을 Amazon CloudWatch Logs를 전송하려는 리전으로 바꿉니다.
[SERVICE] Flush 5 Log_Level info Daemon off [INPUT] Name forward Listen 0.0.0.0 Port 24224 Buffer_Chunk_Size 1M Buffer_Max_Size 6M Tag_Prefix ecs. # Amazon ECS agent adds the following log keys as labels to the docker container. # We would use fluentd logging driver to add these to log record while sending it to Fluent Bit. [FILTER] Name modify Match ecs.* Rename com.amazonaws.ecs.cluster ecs_cluster Rename com.amazonaws.ecs.container-name ecs_container_name Rename com.amazonaws.ecs.task-arn ecs_task_arn Rename com.amazonaws.ecs.task-definition-family ecs_task_definition_family Rename com.amazonaws.ecs.task-definition-version ecs_task_definition_version [FILTER] Name rewrite_tag Match ecs.* Rule $ecs_task_arn ^([a-z-:0-9]+)/([a-zA-Z0-9-_]+)/([a-z0-9]+)$ out.$3.$ecs_container_name false Emitter_Name re_emitted [OUTPUT] Name cloudwatch_logs Match out.* region
region
log_group_name fallback-group log_group_template /aws/ecs/$ecs_cluster.$ecs_task_definition_family log_stream_prefix task- auto_create_group On
Fluent Bit에 들어오는 모든 로그에는 지정한 태그가 있으며, 태그를 지정하지 않은 경우에는 자동으로 생성됩니다. 태그를 사용하여 다양한 로그를 각기 다른 대상으로 라우팅할 수 있습니다. 자세한 내용은 Fluent Bit 공식 설명서의 Tag
위에서 설명한 Fluent Bit 구성에는 다음과 같은 속성이 있습니다.
-
전달 입력 플러그인은 TCP 포트 24224에서 들어오는 트래픽을 수신 대기합니다.
-
해당 포트에서 수신된 각 로그 항목에는 전달 입력 플러그인이
ecs.
문자열을 레코드 접두사로 수정하는 태그가 있습니다. -
Fluent Bit 내부 파이프라인은 Match 정규식을 사용하여 필터를 수정하기 위해 로그 항목을 라우팅합니다. 이 필터는 로그 레코드 JSON의 키를 Fluent Bit가 사용할 수 있는 형식으로 바꿉니다.
-
그러면 수정된 로그 항목이 rewrite_tag 필터에서 사용됩니다. 이 필터는 로그 레코드의 태그를 out.
TASK_ID
.CONTAINER_NAME
형식으로 변경합니다. -
새 태그는 CloudWatch 출력 플러그인의
log_group_template
및log_stream_prefix
옵션을 사용하여 앞서 설명한 것과 같이 로그 그룹과 스트림을 생성하는 출력 cloudwatch_logs 플러그인으로 라우팅됩니다. 자세한 내용은 Fluent Bit 공식 설명서의 Configuration parameters(구성 파라미터)를 참조하세요.
4단계: 로그를 CloudWatch로 라우팅하는 Windows Fluent Bit 작업 정의 등록
로그를 CloudWatch로 라우팅하는 Windows Fluent Bit 작업 정의를 등록합니다.
참고
이 작업 정의는 Fluent Bit 컨테이너 포트 24224를 호스트 포트 24224에 노출시킵니다. 외부로부터의 액세스를 방지하기 위해 EC2 인스턴스 보안 그룹에서 이 포트가 열려 있지 않은지 확인합니다.
태스크 정의를 등록하려면
-
다음 콘텐츠를 가진
fluent-bit.json
이라는 파일을 생성합니다:다음 변수를 바꿉니다.
-
task-iam-role을 작업 IAM 역할의 Amazon 리소스 이름(ARN)으로 바꿉니다.
-
region을 작업이 실행되는 리전으로 바꿉니다.
{ "family": "ecs-windows-fluent-bit", "taskRoleArn": "
task-iam-role
", "containerDefinitions": [ { "name": "fluent-bit", "image": "public.ecr.aws/aws-observability/aws-for-fluent-bit:windowsservercore-latest", "cpu": 512, "portMappings": [ { "hostPort": 24224, "containerPort": 24224, "protocol": "tcp" } ], "entryPoint": [ "Powershell", "-Command" ], "command": [ "C:\\entrypoint.ps1 -ConfigFile C:\\ecs_windows_forward_daemon\\cloudwatch.conf" ], "environment": [ { "name": "AWS_REGION", "value": "region
" } ], "memory": 512, "essential": true, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/fluent-bit-logs", "awslogs-region": "region
", "awslogs-stream-prefix": "flb", "awslogs-create-group": "true" } } } ], "memory": "512", "cpu": "512" } -
-
다음 명령을 실행하여 작업 정의를 등록합니다.
aws ecs register-task-definition --cli-input-json
file://fluent-bit.json
--regionregion
list-task-definitions
명령을 실행하여 계정의 작업 정의를 나열할 수 있습니다. 출력에는run-task
또는start-task
에 사용할 수 있는 패밀리 및 리비전 값이 표시됩니다.
5단계: 대몬(daemon) 스케줄링 전략을 사용하여 ecs-windows-fluent-bit
작업 정의를 Amazon ECS 서비스로 실행
계정에 대한 작업 정의를 등록한 후 클러스터에서 작업을 실행할 수 있습니다. 이 자습서에서는 FluentBit-cluster
클러스터에서 ecs-windows-fluent-bit:1
작업 정의의 인스턴스 1개를 실행합니다. Fluent Bit의 단일 인스턴스가 항상 각 컨테이너 인스턴스에서 실행되도록 하는 대몬(daemon) 스케줄링 전략을 사용하는 서비스에서 작업을 실행합니다.
태스크를 실행하려면
-
다음 명령을 실행하여
ecs-windows-fluent-bit:1
작업 정의(이전 단계에서 등록됨)를 서비스로 시작합니다.참고
이 작업 정의는
awslogs
로깅 드라이버를 사용하며, 컨테이너 인스턴스에는 필요한 권한이 있어야 합니다.다음 변수를 바꿉니다.
-
region을 서비스가 실행되는 리전으로 바꿉니다.
aws ecs create-service \ --cluster FluentBit-cluster \ --service-name FluentBitForwardDaemonService \ --task-definition ecs-windows-fluent-bit:1 \ --launch-type EC2 \ --scheduling-strategy DAEMON \ --region
region
-
-
다음 명령을 실행하여 작업을 나열합니다.
다음 변수를 바꿉니다.
-
region을 서비스 작업이 실행되는 리전으로 바꿉니다.
aws ecs list-tasks --cluster
--regionFluentBit-cluster
region
-
6단계: 로그를 생성하는 Windows 작업 정의 등록
로그를 생성하는 작업 정의를 등록합니다. 이 작업 정의는 1초마다 stdout
에 증분 숫자를 기록하는 Windows 컨테이너 이미지를 배포합니다.
작업 정의는 Fluent Bit 플러그인이 수신 대기하는 포트 24224에 연결되는 fluentd 로깅 드라이버를 사용합니다. Amazon ECS 에이전트는 클러스터 이름, 작업 ARN, 작업 정의 패밀리 이름, 작업 정의 개정 번호 및 작업 컨테이너 이름을 포함하는 태그를 사용하여 각 Amazon ECS 컨테이너에 레이블을 추가합니다. 이러한 키-값 레이블은 Fluent Bit에 전달됩니다.
참고
이 작업은 default
네트워크 모드를 사용합니다. 하지만 작업에서 awsvpc
네트워크 모드를 사용할 수도 있습니다.
태스크 정의를 등록하려면
-
다음 콘텐츠를 가진
windows-app-task.json
이라는 파일을 생성합니다:{ "family": "windows-app-task", "containerDefinitions": [ { "name": "sample-container", "image": "mcr.microsoft.com/windows/servercore:ltsc2019", "cpu": 512, "memory": 512, "essential": true, "entryPoint": [ "Powershell", "-Command" ], "command": [ "$count=1;while(1) { Write-Host $count; sleep 1; $count=$count+1;}" ], "logConfiguration": { "logDriver": "fluentd", "options": { "fluentd-address": "localhost:24224", "tag": "{{ index .ContainerLabels \"com.amazonaws.ecs.task-definition-family\" }}", "fluentd-async": "true", "labels": "com.amazonaws.ecs.cluster,com.amazonaws.ecs.container-name,com.amazonaws.ecs.task-arn,com.amazonaws.ecs.task-definition-family,com.amazonaws.ecs.task-definition-version" } } } ], "memory": "512", "cpu": "512" }
-
다음 명령을 실행하여 작업 정의를 등록합니다.
다음 변수를 바꿉니다.
-
region을 작업이 실행되는 리전으로 바꿉니다.
aws ecs register-task-definition --cli-input-json
file://windows-app-task.json
--regionregion
list-task-definitions
명령을 실행하여 계정의 작업 정의를 나열할 수 있습니다. 출력에는run-task
또는start-task
에 사용할 수 있는 패밀리 및 리비전 값이 표시됩니다. -
7단계: windows-app-task
작업 정의 실행
windows-app-task
작업 정의를 등록한 후 FluentBit-cluster
클러스터에서 실행합니다.
태스크를 실행하려면
-
이전 단계에서 등록한
windows-app-task:1
작업 정의를 실행합니다.다음 변수를 바꿉니다.
-
region을 작업이 실행되는 리전으로 바꿉니다.
aws ecs run-task --cluster FluentBit-cluster --task-definition windows-app-task:1 --count 2 --region
region
-
-
다음 명령을 실행하여 작업을 나열합니다.
aws ecs list-tasks --cluster
FluentBit-cluster
8단계: CloudWatch에서 로그 확인
Fluent Bit 설정을 확인하려면 CloudWatch 콘솔에서 다음 로그 그룹을 확인합니다.
-
/ecs/fluent-bit-logs
- 컨테이너 인스턴스에서 실행 중인 Fluent Bit 대몬(daemon) 컨테이너에 해당하는 로그 그룹입니다. -
/aws/ecs/FluentBit-cluster.windows-app-task
-FluentBit-cluster
클러스터 내windows-app-task
작업 정의 패밀리에 대해 실행된 모든 작업에 해당하는 로그 그룹입니다.task-out.
- 이 로그 스트림에는 sample-container 작업 컨테이너에 있는 작업의 첫 번째 인스턴스에서 생성된 모든 로그가 포함됩니다.FIRST_TASK_ID
.sample-containertask-out.
- 이 로그 스트림에는 sample-container 작업 컨테이너에 있는 작업의 두 번째 인스턴스에서 생성된 모든 로그가 포함됩니다.SECOND_TASK_ID
.sample-container
task-out.
로그 스트림에는 다음과 유사한 필드가 있습니다.TASK_ID
.sample-container
{
"source": "stdout",
"ecs_task_arn": "arn:aws:ecs:region
:0123456789012:task/FluentBit-cluster/13EXAMPLE",
"container_name": "/ecs-windows-app-task-1-sample-container-cEXAMPLE",
"ecs_cluster": "FluentBit-cluster",
"ecs_container_name": "sample-container",
"ecs_task_definition_version": "1",
"container_id": "61f5e6EXAMPLE",
"log": "10",
"ecs_task_definition_family": "windows-app-task"
}
Fluent Bit 설정 확인
https://console.aws.amazon.com/cloudwatch/
에서 CloudWatch 콘솔을 엽니다. -
탐색 창에서 로그 그룹을 선택합니다. 컨테이너에 Fluent Bit를 배포한 리전에 있는지 확인합니다.
해당 AWS 리전의 로그 그룹 목록에서 다음을 확인해야 합니다.
-
/ecs/fluent-bit-logs
-
/aws/ecs/FluentBit-cluster.windows-app-task
이러한 로그 그룹을 보면 Fluent Bit 설정이 확인됩니다.
-
9단계: 정리
이 자습서를 완료한 후에는 사용하지 않는 리소스에 요금이 발생하지 않도록 연결된 리소스를 정리합니다.
자습서 리소스를 정리하려면
-
windows-simple-task
작업과ecs-fluent-bit
작업을 중지합니다. 자세한 내용은 Amazon ECS 태스크 중지 단원을 참조하십시오. -
다음 명령을 실행하여
/ecs/fluent-bit-logs
로그 그룹을 삭제합니다. 로그 그룹 삭제에 대한 자세한 내용은 AWS Command Line Interface 참조의 delete-log-group을 참조하세요.aws logs delete-log-group --log-group-name /ecs/fluent-bit-logs aws logs delete-log-group --log-group-name /aws/ecs/FluentBit-cluster.windows-app-task
-
다음 명령을 실행하여 인스턴스를 종료합니다.
aws ec2 terminate-instances --instance-ids
instance-id
-
다음 명령을 실행하여 IAM 역할을 삭제합니다.
aws iam delete-role --role-name ecsInstanceRole aws iam delete-role --role-name fluentTaskRole
-
다음 명령을 실행하여 Amazon ECS 클러스터를 삭제합니다.
aws ecs delete-cluster --cluster
FluentBit-cluster