Amazon ECS Windows 컨테이너에서 Fluent Bit 배포 - Amazon Elastic Container Service

Amazon ECS Windows 컨테이너에서 Fluent Bit 배포

Fluent Bit는 다양한 운영 체제에서 지원하는 빠르고 유연한 로그 프로세서 및 라우터입니다. Amazon CloudWatch Logs, Firehose Amazon S3 및 Amazon OpenSearch Service와 같은 다양한 AWS 대상으로 로그를 라우팅하는 데 사용할 수 있습니다. Fluent Bit는 Datadog, Splunk 및 사용자 지정 HTTP 서버와 같은 일반적인 파트너 솔루션을 지원합니다. Fluent Bit에 대한 자세한 내용은 Fluent Bit 웹 사이트를 참조하세요.

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_1container_2가 포함된 task_1container_3이 포함된 task_2가 있는 경우 CloudWatch 로그 스트림은 다음과 같습니다.

    • /aws/ecs/windows.ecs_task_1

      task-out.TASK_ID.container_1

      task-out.TASK_ID.container_2

    • /aws/ecs/windows.ecs_task_2

      task-out.TASK_ID.container_3

사전 조건 

이 자습서에서는 다음 사전 조건이 충족되었다고 가정합니다.

  • 최신 버전의 AWS CLI가 설치 및 구성됩니다. 자세한 정보는 AWS Command Line Interface 설치 섹션을 참조하세요.

  • 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 역할을 생성합니다.

  1. Amazon ECS 컨테이너 인스턴스 역할 "ecsInstanceRole"을 생성합니다. 자세한 내용은 Amazon ECS 컨테이너 인스턴스 IAM 역할을 참조하세요.

  2. 이름이 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": "*" } ] }
  3. 책을 역할에 연결합니다.

    1. fluent-bit-policy.json 파일에 위 내용을 저장합니다.

    2. 다음 명령을 실행하여 인라인 정책을 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 인스턴스 생성
  1. aws ssm get-parameters 명령을 사용하여 VPC를 호스팅하는 리전에 대한 AMI ID를 검색합니다. 자세한 내용은 Amazon ECS 최적화 AMI 메타데이터 검색을 참조하세요.

  2. Amazon EC2 콘솔을 사용하여 인스턴스를 시작합니다.

    1. https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 엽니다.

    2. 탐색 모음에서 사용할 리전을 선택합니다.

    3. EC2 대시보드에서 인스턴스 시작(Launch Instance)을 선택합니다.

    4. Name(이름)에 고유한 이름을 입력합니다.

    5. Application and OS Images (Amazon Machine Image)(애플리케이션 및 OS 이미지(Amazon Machine Image))에서 첫 번째 단계에서 검색한 AMI를 선택합니다.

    6. 인스턴스 유형에서 t3.xlarge를 선택합니다.

    7. Key pair (login)(키 페어(로그인))에서 키 페어를 선택합니다.

    8. Network settings(네트워크 설정)의 Security group(보안 그룹)에서 기존 보안 그룹을 선택하거나 새 보안 그룹을 생성합니다.

    9. Network settings(네트워크 설정)의 Auto-assign Public IP(퍼블릭 IP 자동 할당)에서 Enable(활성화)을 선택합니다.

    10. Advanced details(고급 세부 정보)의 IAM instance profile(IAM 인스턴스 프로파일)에서 ecsInstanceRole을 선택합니다.

    11. 다음 사용자 데이터로 Amazon ECS 컨테이너 인스턴스를 구성합니다. Advanced Details(고급 세부 정보)에서 다음 스크립트를 User data(사용자 데이터) 필드에 붙여 넣고 cluster_name을 클러스터의 이름으로 바꿉니다.

      <powershell> Import-Module ECSTools Initialize-ECSAgent -Cluster cluster-name -EnableTaskENI -EnableTaskIAMRole -LoggingDrivers '["awslogs","fluentd"]' </powershell>
    12. 준비가 되었으면 승인 필드를 선택한 다음 인스턴스 시작(Launch Instances)을 선택합니다.

    13. 확인 페이지에서 인스턴스가 실행 중인지 확인할 수 있습니다. 인스턴스 보기를 선택하여 확인 페이지를 닫고 콘솔로 돌아갑니다.

3단계: Fluent Bit 구성

AWS에서 제공하는 다음 기본 구성을 사용하여 빠르게 시작할 수 있습니다.

또는 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_templatelog_stream_prefix 옵션을 사용하여 앞서 설명한 것과 같이 로그 그룹과 스트림을 생성하는 출력 cloudwatch_logs 플러그인으로 라우팅됩니다. 자세한 내용은 Fluent Bit 공식 설명서Configuration parameters(구성 파라미터)를 참조하세요.

4단계: 로그를 CloudWatch로 라우팅하는 Windows Fluent Bit 작업 정의 등록

로그를 CloudWatch로 라우팅하는 Windows Fluent Bit 작업 정의를 등록합니다.

참고

이 작업 정의는 Fluent Bit 컨테이너 포트 24224를 호스트 포트 24224에 노출시킵니다. 외부로부터의 액세스를 방지하기 위해 EC2 인스턴스 보안 그룹에서 이 포트가 열려 있지 않은지 확인합니다.

태스크 정의를 등록하려면
  1. 다음 콘텐츠를 가진 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" }
  2. 다음 명령을 실행하여 작업 정의를 등록합니다.

    aws ecs register-task-definition --cli-input-json file://fluent-bit.json --region region

    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) 스케줄링 전략을 사용하는 서비스에서 작업을 실행합니다.

태스크를 실행하려면
  1. 다음 명령을 실행하여 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
  2. 다음 명령을 실행하여 작업을 나열합니다.

    다음 변수를 바꿉니다.

    • region을 서비스 작업이 실행되는 리전으로 바꿉니다.

    aws ecs list-tasks --cluster FluentBit-cluster --region region

6단계: 로그를 생성하는 Windows 작업 정의 등록

로그를 생성하는 작업 정의를 등록합니다. 이 작업 정의는 1초마다 stdout에 증분 숫자를 기록하는 Windows 컨테이너 이미지를 배포합니다.

작업 정의는 Fluent Bit 플러그인이 수신 대기하는 포트 24224에 연결되는 fluentd 로깅 드라이버를 사용합니다. Amazon ECS 에이전트는 클러스터 이름, 작업 ARN, 작업 정의 패밀리 이름, 작업 정의 개정 번호 및 작업 컨테이너 이름을 포함하는 태그를 사용하여 각 Amazon ECS 컨테이너에 레이블을 추가합니다. 이러한 키-값 레이블은 Fluent Bit에 전달됩니다.

참고

이 작업은 default 네트워크 모드를 사용합니다. 하지만 작업에서 awsvpc 네트워크 모드를 사용할 수도 있습니다.

태스크 정의를 등록하려면
  1. 다음 콘텐츠를 가진 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" }
  2. 다음 명령을 실행하여 작업 정의를 등록합니다.

    다음 변수를 바꿉니다.

    • region을 작업이 실행되는 리전으로 바꿉니다.

    aws ecs register-task-definition --cli-input-json file://windows-app-task.json --region region

    list-task-definitions 명령을 실행하여 계정의 작업 정의를 나열할 수 있습니다. 출력에는 run-task 또는 start-task에 사용할 수 있는 패밀리 및 리비전 값이 표시됩니다.

7단계: windows-app-task 작업 정의 실행

windows-app-task 작업 정의를 등록한 후 FluentBit-cluster 클러스터에서 실행합니다.

태스크를 실행하려면
  1. 이전 단계에서 등록한 windows-app-task:1 작업 정의를 실행합니다.

    다음 변수를 바꿉니다.

    • region을 작업이 실행되는 리전으로 바꿉니다.

    aws ecs run-task --cluster FluentBit-cluster --task-definition windows-app-task:1 --count 2 --region region
  2. 다음 명령을 실행하여 작업을 나열합니다.

    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.FIRST_TASK_ID.sample-container - 이 로그 스트림에는 sample-container 작업 컨테이너에 있는 작업의 첫 번째 인스턴스에서 생성된 모든 로그가 포함됩니다.

    task-out.SECOND_TASK_ID.sample-container - 이 로그 스트림에는 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 설정 확인
  1. https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.

  2. 탐색 창에서 로그 그룹을 선택합니다. 컨테이너에 Fluent Bit를 배포한 리전에 있는지 확인합니다.

    해당 AWS 리전의 로그 그룹 목록에서 다음을 확인해야 합니다.

    • /ecs/fluent-bit-logs

    • /aws/ecs/FluentBit-cluster.windows-app-task

    이러한 로그 그룹을 보면 Fluent Bit 설정이 확인됩니다.

9단계: 정리

이 자습서를 완료한 후에는 사용하지 않는 리소스에 요금이 발생하지 않도록 연결된 리소스를 정리합니다.

자습서 리소스를 정리하려면
  1. windows-simple-task 작업과 ecs-fluent-bit 작업을 중지합니다. 자세한 내용은 Amazon ECS 태스크 중지 단원을 참조하십시오.

  2. 다음 명령을 실행하여 /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
  3. 다음 명령을 실행하여 인스턴스를 종료합니다.

    aws ec2 terminate-instances --instance-ids instance-id
  4. 다음 명령을 실행하여 IAM 역할을 삭제합니다.

    aws iam delete-role --role-name ecsInstanceRole aws iam delete-role --role-name fluentTaskRole
  5. 다음 명령을 실행하여 Amazon ECS 클러스터를 삭제합니다.

    aws ecs delete-cluster --cluster FluentBit-cluster