

# Amazon ECS Windows 컨테이너에서 Fluent Bit 배포
<a name="tutorial-deploy-fluentbit-on-windows"></a>

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

**AWS for Fluent Bit** 이미지는 고가용성을 위해 대부분 리전의 Amazon ECR 퍼블릭 갤러리와 Amazon ECR 리포지토리에 있는 Amazon ECR에 사용할 수 있습니다. 자세한 내용은 GitHub 웹 사이트의 [https://github.com/aws/aws-for-fluent-bit](https://github.com/aws/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](https://docs.docker.com/engine/logging/drivers/fluentd/)(Fluentd 로깅 드라이버)를 참조하세요.
  + 도커 는 호스트 네임스페이스 내의 로컬 호스트에 있는 TCP 소켓 24224에 연결합니다.
  + Amazon ECS 에이전트는 클러스터 이름, 작업 정의 패밀리 이름, 작업 정의 개정 번호, 작업 ARN 및 컨테이너 이름을 포함하는 레이블을 컨테이너에 추가합니다. fluentd docker 로깅 드라이버의 label 옵션을 사용하여 동일한 정보가 로그 레코드에 추가됩니다. 자세한 내용은 도커 설명서 웹 사이트의 [labels, labels-regex, env, and env-regex](https://docs.docker.com/config/containers/logging/fluentd/#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](https://docs.docker.com/config/containers/logging/fluentd/#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`이 포함된 t`ask_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, SDK 및 Amazon ECS API에서 IPv4 및 IPv6 모두를 통해 Amazon ECS와 상호 작용할 수 있습니다. 자세한 내용은 [Amazon ECS 듀얼 스택 엔드포인트 사용](dual-stack-endpoint.md) 섹션을 참조하세요.

**Topics**
+ [사전 조건](#tutorial-deploy-fluentbit-on-windows-prereqs)
+ [1단계: IAM 액세스 역할 생성](#tutorial-deploy-fluentbit-on-windows-iam-access-role)
+ [2단계: Amazon ECS Windows 컨테이너 인스턴스 생성](#tutorial-deploy-fluentbit-on-windows-instance)
+ [3단계: Fluent Bit 구성](#tutorial-deploy-fluentbit-on-windows-configure-fluentbit)
+ [4단계: 로그를 CloudWatch로 라우팅하는 Windows Fluent Bit 작업 정의 등록](#tutorial-deploy-fluentbit-on-windows-register-task-definition)
+ [5단계: 대몬(daemon) 스케줄링 전략을 사용하여 `ecs-windows-fluent-bit` 작업 정의를 Amazon ECS 서비스로 실행](#tutorial-deploy-fluentbit-on-windows-run-task)
+ [6단계: 로그를 생성하는 Windows 작업 정의 등록](#tutorial-deploy-fluentbit-on-windows-register-task-def-logs)
+ [7단계: `windows-app-task` 작업 정의 실행](#tutorial-deploy-fluentbit-on-windows-run-task-fluentbit)
+ [8단계: CloudWatch에서 로그 확인](#tutorial-deploy-fluentbit-on-windows-verify)
+ [9단계: 정리](#tutorial-deploy-fluentbit-on-windows-cleanup)

## 사전 조건
<a name="tutorial-deploy-fluentbit-on-windows-prereqs"></a>

이 자습서에서는 다음 사전 조건이 충족되었다고 가정합니다.
+ 최신 버전의 AWS CLI가 설치 및 구성됩니다. 자세한 내용은 [AWS CLI 최신 버전 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.
+ `aws-for-fluent-bit` 컨테이너 이미지는 다음 Windows 운영 체제에서 사용할 수 있습니다.
  + Windows Server 2019 Core
  + Windows Server 2019 Full
  + Windows Server 2022 Core
  + Windows Server 2022 Full
+ [Amazon ECS 사용 설정](get-set-up-for-amazon-ecs.md)의 단계가 완료되었습니다.
+ 클러스터가 있습니다. 이 자습서에서 클러스터 이름은 **FluentBit-cluster**입니다.
+ EC2 인스턴스를 실행할 퍼블릭 서브넷이 포함된 VPC가 있습니다. 기본 VPC를 사용할 수 있습니다. Amazon CloudWatch 엔드포인트가 서브넷에 도달할 수 있도록 하는 프라이빗 서브넷을 사용할 수도 있습니다. Amazon CloudWatch 엔드포인트에 대한 자세한 내용은 **AWS 일반 참조의 [Amazon CloudWatch endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/cw_region.html)를 참조하세요. VPC 생성을 위해 Amazon VPC 마법사를 사용하는 방법에 대한 자세한 내용은 [Virtual Private Cloud 생성](get-set-up-for-amazon-ecs.md#create-a-vpc) 섹션을 참조하세요.

## 1단계: IAM 액세스 역할 생성
<a name="tutorial-deploy-fluentbit-on-windows-iam-access-role"></a>

Amazon ECS IAM 역할을 생성합니다.

1.  Amazon ECS 컨테이너 인스턴스 역할 "ecsInstanceRole"을 생성합니다. 자세한 내용은 [Amazon ECS 컨테이너 인스턴스 IAM 역할](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/instance_IAM_role.html)을 참조하세요.

1. 이름이 `fluentTaskRole`인 Fluent Bit 작업에 대한 IAM 역할을 생성합니다. 자세한 내용은 [Amazon ECS 작업 IAM 역할](task-iam-roles.md) 섹션을 참조하세요.

    이 IAM 역할에 부여된 IAM 권한은 작업 컨테이너에서 수임합니다. Fluent Bit에서 CloudWatch로 로그를 전송하도록 허용하려면 작업 IAM 역할에 다음 권한을 연결해야 합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
       {
           "Effect": "Allow",
           "Action": [
               "logs:CreateLogStream",
               "logs:CreateLogGroup",
               "logs:DescribeLogStreams",
               "logs:PutLogEvents"
           ],
           "Resource": "*"
       }
       ]
   }
   ```

------

1. 책을 역할에 연결합니다.

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

   1. 다음 명령을 실행하여 인라인 정책을 `fluentTaskRole` IAM 역할에 연결합니다.

      ```
      aws iam put-role-policy --role-name fluentTaskRole --policy-name fluentTaskPolicy --policy-document file://fluent-bit-policy.json
      ```

## 2단계: Amazon ECS Windows 컨테이너 인스턴스 생성
<a name="tutorial-deploy-fluentbit-on-windows-instance"></a>

Amazon ECS Windows 컨테이너 인스턴스를 생성합니다.

**Amazon ECS 인스턴스 생성**

1. `aws ssm get-parameters` 명령을 사용하여 VPC를 호스팅하는 리전에 대한 AMI ID를 검색합니다. 자세한 내용은 [Amazon ECS 최적화 AMI 메타데이터 검색](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/retrieve-ecs-optimized_windows_AMI.html)을 참조하세요.

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

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

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

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

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

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

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

   1. **키 페어(로그인)**에서 키 페어를 선택합니다.

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

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

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

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

      ```
      <powershell>
      Import-Module ECSTools
      Initialize-ECSAgent -Cluster {{cluster-name}} -EnableTaskENI -EnableTaskIAMRole -LoggingDrivers '["awslogs","fluentd"]'
      </powershell>
      ```

   1. 준비가 되었으면 승인 필드를 선택한 다음 **인스턴스 시작(Launch Instances)**을 선택합니다.

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

## 3단계: Fluent Bit 구성
<a name="tutorial-deploy-fluentbit-on-windows-configure-fluentbit"></a>

AWS에서 제공하는 다음 기본 구성을 사용하여 빠르게 시작할 수 있습니다.
+ Fluent Bit 공식 설명서**의 [Amazon CloudWatch](https://docs.fluentbit.io/manual/v/1.9-pre/pipeline/outputs/cloudwatch)용 Fluent Bit 플러그인을 기반으로 하는 [Amazon CloudWatch](https://github.com/aws/aws-for-fluent-bit/blob/mainline/ecs_windows_forward_daemon/cloudwatch.conf)

또는 AWS에서 제공하는 다른 기본 구성을 사용할 수 있습니다. 자세한 내용은 Github 웹 사이트의 `aws-for-fluent-bit`에서 [Windows 이미지용 엔트리포인트 재정의](https://github.com/aws/aws-for-fluent-bit/tree/mainline/ecs_windows_forward_daemon#overriding-the-entrypoint-for-the-windows-image)를 참조하세요.

기본 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](https://docs.fluentbit.io/manual/concepts/key-concepts#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](https://docs.fluentbit.io/manual/v/1.9-pre/pipeline/outputs/cloudwatch#configuration-parameters)(구성 파라미터)를 참조하세요.

## 4단계: 로그를 CloudWatch로 라우팅하는 Windows Fluent Bit 작업 정의 등록
<a name="tutorial-deploy-fluentbit-on-windows-register-task-definition"></a>

로그를 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"
   }
   ```

1. 다음 명령을 실행하여 작업 정의를 등록합니다.

   ```
   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 서비스로 실행
<a name="tutorial-deploy-fluentbit-on-windows-run-task"></a>

계정에 대한 작업 정의를 등록한 후 클러스터에서 작업을 실행할 수 있습니다. 이 자습서에서는 `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}}
   ```

1. 다음 명령을 실행하여 작업을 나열합니다.

   다음 변수를 바꿉니다.
   + {{}}region을 서비스 작업이 실행되는 리전으로 바꿉니다.

   ```
   aws ecs list-tasks --cluster {{FluentBit-cluster}} --region {{region}}
   ```

## 6단계: 로그를 생성하는 Windows 작업 정의 등록
<a name="tutorial-deploy-fluentbit-on-windows-register-task-def-logs"></a>

로그를 생성하는 작업 정의를 등록합니다. 이 작업 정의는 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"
   }
   ```

1. 다음 명령을 실행하여 작업 정의를 등록합니다.

   다음 변수를 바꿉니다.
   + {{}}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` 작업 정의 실행
<a name="tutorial-deploy-fluentbit-on-windows-run-task-fluentbit"></a>

`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}}
   ```

1. 다음 명령을 실행하여 작업을 나열합니다.

   ```
   aws ecs list-tasks --cluster {{FluentBit-cluster}}
   ```

## 8단계: CloudWatch에서 로그 확인
<a name="tutorial-deploy-fluentbit-on-windows-verify"></a>

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/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

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

   해당 AWS 리전의 로그 그룹 목록에서 다음을 확인해야 합니다.
   + `/ecs/fluent-bit-logs`
   + `/aws/ecs/FluentBit-cluster.windows-app-task`

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

## 9단계: 정리
<a name="tutorial-deploy-fluentbit-on-windows-cleanup"></a>

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

**자습서 리소스를 정리하려면**

1. `windows-simple-task` 작업과 `ecs-fluent-bit` 작업을 중지합니다. 자세한 내용은 [Amazon ECS 태스크 중지](standalone-task-stop.md) 섹션을 참조하세요.

1. 다음 명령을 실행하여 `/ecs/fluent-bit-logs` 로그 그룹을 삭제합니다. 로그 그룹 삭제에 대한 자세한 내용은 AWS Command Line Interface 참조**의 [delete-log-group](https://docs.aws.amazon.com/cli/latest/reference/logs/delete-log-group.html)을 참조하세요.

   ```
   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
   ```

1. 다음 명령을 실행하여 인스턴스를 종료합니다.

   ```
   aws ec2 terminate-instances --instance-ids {{instance-id}}
   ```

1. 다음 명령을 실행하여 IAM 역할을 삭제합니다.

   ```
   aws iam delete-role --role-name ecsInstanceRole
   aws iam delete-role --role-name fluentTaskRole
   ```

1. 다음 명령을 실행하여 Amazon ECS 클러스터를 삭제합니다.

   ```
   aws ecs delete-cluster --cluster {{FluentBit-cluster}}
   ```