

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# 클러스터에 대한 AWS Fargate 로깅 시작하기
<a name="fargate-logging"></a>

Amazon EKS on Fargate는 Fluent Bit를 기반으로 내장된 로그 라우터를 제공합니다. 즉, 사용자가 Fluent Bit 컨테이너를 사이드카로 명시적으로 실행하지는 않지만 Amazon이 자동으로 실행합니다. 로그 라우터를 구성하기만 하면 됩니다. 이 구성은 다음 기준을 충족해야 하는 전용 `ConfigMap`을 통해 이루어집니다.
+ `aws-logging`으로 이름 지정 
+ `aws-observability`라는 전용 네임스페이스에서 생성 
+ 5300자를 초과할 수 없습니다.

`ConfigMap`을 생성하고 나면 Fargate의 Amazon EKS가 자동으로 감지하고 로그 라우터를 구성합니다. Fargate는 AWS for Fluent Bit의 한 버전인 AWS 관리형 Fluent Bit의 업스트림 호환 배포판을 사용합니다. 자세한 내용은 GitHub에서 [AWS for Fluent Bit](https://github.com/aws/aws-for-fluent-bit)를 참조하세요.

로그 라우터를 사용하면 AWS에서 로그 분석 및 저장을 위한 다양한 서비스를 사용할 수 있습니다. Fargate에서 Amazon CloudWatch, Amazon OpenSearch Service로 로그를 직접 스트리밍할 수 있습니다. [Amazon S3](https://aws.amazon.com/s3/), [Amazon Kinesis Data Streams](https://aws.amazon.com/kinesis/data-streams/), [Amazon Data Firehose](https://aws.amazon.com/kinesis/data-firehose/)를 통한 파트너 도구 등의 대상으로 로그를 스트리밍할 수도 있습니다.
+ Fargate 포드를 배포할 기존 Kubernetes 네임스페이스를 지정하는 기존 Fargate 프로필. 자세한 내용은 [3단계: 클러스터에 대한 Fargate 프로필 생성](fargate-getting-started.md#fargate-gs-create-profile) 섹션을 참조하세요.
+ 기존 Fargate 포드 실행 역할. 자세한 내용은 [2단계: Fargate 포드 실행 역할 생성](fargate-getting-started.md#fargate-sg-pod-execution-role) 섹션을 참조하세요.

## 로그 라우터 구성
<a name="fargate-logging-log-router-configuration"></a>

**중요**  
로그가 성공적으로 게시되려면 클러스터가 있는 VPC에서 로그 대상으로 네트워크 액세스가 있어야 합니다. 이는 주로 VPC에 대한 송신 규칙을 사용자 지정하는 사용자와 관련이 있습니다. CloudWatch를 사용하는 예제는 *Amazon CloudWatch Logs 사용 설명서*의 [인터페이스 VPC 엔드포인트에서 CloudWatch Logs 사용](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html)을 참조하세요.

다음 단계에서 모든 {{예제 값}}을 고유한 값으로 바꿉니다.

1. `aws-observability`라는 전용 Kubernetes 네임스페이스를 생성합니다.

   1. 다음 콘텐츠를 컴퓨터에 `aws-observability-namespace.yaml`이라는 파일에 저장합니다. `name`의 값은 `aws-observability`여야 하며 `aws-observability: enabled` 레이블이 필요합니다.

      ```
      kind: Namespace
      apiVersion: v1
      metadata:
        name: aws-observability
        labels:
          aws-observability: enabled
      ```

   1. 네임스페이스를 생성합니다.

      ```
      kubectl apply -f aws-observability-namespace.yaml
      ```

1. `Fluent Conf` 데이터 값을 사용하여 `ConfigMap`을 생성함으로써 컨테이너 로그를 대상에 전달합니다. Fluent Conf는 Fluent Bit입니다. 이는 원하는 로그 대상에 컨테이너 로그를 라우팅하는 데 사용되는 빠르고 가벼운 로그 프로세서 구성 언어입니다. 자세한 내용은 Fluent Bit 문서의 [구성 파일(Configuration File)](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/configuration-file)을 참조하세요.
**중요**  
일반적인 `Fluent Conf`에 포함된 주요 단원은 `Service`, `Input`, `Filter`, `Output`입니다. 하지만 Fargate 로그 라우터는 다음 부분만 수락합니다.  
`Filter` 및`Output` 부분입니다.
`Parser` 부분.
기타 부분을 제공하는 경우 해당 부분은 거부됩니다.

   Fargate 로그 라우터에서는 `Service` 및`Input` 부분을 관리합니다. 여기에는 수정할 수 없고 `ConfigMap`에서 필요하지 않은 다음과 같은 `Input` 부분이 있습니다. 그러나 메모리 버퍼 제한과 로그에 적용된 태그와 같은 인사이트를 얻을 수 있습니다.

   ```
   [INPUT]
       Name tail
       Buffer_Max_Size 66KB
       DB /var/log/flb_kube.db
       Mem_Buf_Limit 45MB
       Path /var/log/containers/*.log
       Read_From_Head On
       Refresh_Interval 10
       Rotate_Wait 30
       Skip_Long_Lines On
       Tag kube.*
   ```

   `ConfigMap` 생성 시에는 Fargate가 필드를 검증하는 데 사용하는 다음 규칙을 고려하세요.
   +  `[FILTER]`, `[OUTPUT]`, `[PARSER]`는 각 해당 키 아래에 지정되어야 합니다. 예를 들어, `filters.conf`은 `[FILTER]`에 있어야 합니다. `filters.conf`에 하나 이상의 `[FILTER]`가 있을 수 있습니다. `[OUTPUT]` 및 `[PARSER]` 부분도 해당 키 아래에 있어야 합니다. 여러 개의 `[OUTPUT]` 부분을 지정하여 로그를 여러 대상으로 동시에 라우팅할 수 있습니다.
   + Fargate는 각 섹션에 필요한 키를 검증합니다 `Name` 및 `match`는 `[FILTER]` 및 `[OUTPUT]`에 각각 필요합니다. `Name` 및 `format`은 `[PARSER]`에 각각 필요합니다. 태그는 대/소문자를 구분합니다.
   + `${ENV_VAR}`과 같은 환경 변수는 `ConfigMap`에서 허용되지 않습니다.
   + 들여쓰기는 각 `filters.conf`, `output.conf`, `parsers.conf` 내의 지시문 또는 키 값 페어에 대해 동일해야합니다. 키 값 페어는 지시문보다 들여 써야 합니다.
   + Fargate는 `grep`, `parser`, `record_modifier`, `rewrite_tag`, `throttle`, `nest`, `modify`, `kubernetes` 등의 지원 필터에 대해 검증을 실시합니다.
   + Fargate는 다음과 같은 지원되는 출력에 대해 검증합니다. `es`, `firehose`, `kinesis_firehose`, `cloudwatch`, `cloudwatch_logs` 및 `kinesis`.
   + 로깅을 사용 설정하려면 `ConfigMap`에서 지원되는 `Output` 플러그 인이 1개 이상 제공되어야 합니다. `Filter` 및 `Parser`는 로깅을 사용 설정하는 데 필요하지 않습니다.

     검증에서 발생하는 문제를 해결하기 위해 원하는 구성을 사용하여 Amazon EC2 Fluent Bit를 실행할 수 있습니다. 다음 예 중 하나를 사용하여 `ConfigMap`을 생성합니다.
**중요**  
Amazon EKS Fargate 로깅은 `ConfigMap`의 동적 구성을 지원하지 않습니다. `ConfigMap`에 대한 모든 변경 사항은 새 포드에만 적용됩니다. 기존 포드에는 변경 사항이 적용되지 않습니다.

     원하는 로그 대상에 대한 예제를 사용하여 `ConfigMap`을 생성합니다.
**참고**  
로그 대상에 Amazon Kinesis Data Streams를 사용할 수도 있습니다. Kinesis Data Streams를 사용하는 경우 포드 실행 역할에 `kinesis:PutRecords` 권한이 부여되었는지 확인하세요. 자세한 내용은 *Fluent Bit: 공식 설명서*의 Amazon Kinesis Data Streams [권한](https://docs.fluentbit.io/manual/pipeline/outputs/kinesis#permissions)을 참조하세요.  
**Example**  

------
#### [ CloudWatch ]

   CloudWatch를 사용할 때는 다음 두 가지 출력 옵션이 있습니다.
   +  [C로 작성된 출력 플러그 인](https://docs.fluentbit.io/manual/v/1.5/pipeline/outputs/cloudwatch) 
   +  [Golang으로 작성된 출력 플러그 인](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit) 

   다음 예에서는 `cloudwatch_logs` 플러그 인을 사용하여 CloudWatch로 로그를 전송하는 방법을 보여줍니다.

   1. 다음 콘텐츠를 `aws-logging-cloudwatch-configmap.yaml`이라는 파일에 저장합니다. {{region-code}}를 클러스터가 있는 AWS 리전으로 바꿉니다. `[OUTPUT]` 아래의 파라미터는 필수입니다.

      ```
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: aws-logging
        namespace: aws-observability
      data:
        flb_log_cw: "false"  # Set to true to ship Fluent Bit process logs to CloudWatch.
        filters.conf: |
          [FILTER]
              Name parser
              Match *
              Key_name log
              Parser crio
          [FILTER]
              Name kubernetes
              Match kube.*
              Merge_Log On
              Keep_Log Off
              Buffer_Size 0
              Kube_Meta_Cache_TTL 300s
        output.conf: |
          [OUTPUT]
              Name cloudwatch_logs
              Match   kube.*
              region region-code
              log_group_name my-logs
              log_stream_prefix from-fluent-bit-
              log_retention_days 60
              auto_create_group true
        parsers.conf: |
          [PARSER]
              Name crio
              Format Regex
              Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>P|F) (?<log>.*)$
              Time_Key    time
              Time_Format %Y-%m-%dT%H:%M:%S.%L%z
      ```

   1. 매니페스트를 클러스터에 적용합니다.

      ```
      kubectl apply -f aws-logging-cloudwatch-configmap.yaml
      ```

------
#### [ Amazon OpenSearch Service ]

   Amazon OpenSearch Service에 로그를 전송하려면 C로 작성된 플러그인인 [es](https://docs.fluentbit.io/manual/v/1.5/pipeline/outputs/elasticsearch) 출력을 사용할 수 있습니다. 다음 예제에서는 이 플러그인을 사용하여 OpenSearch로 로그를 전송하는 방법을 보여줍니다.

   1. 다음 콘텐츠를 `aws-logging-opensearch-configmap.yaml`이라는 파일에 저장합니다. 모든 {{예제 값}}을 자신의 값으로 바꾸세요.

      ```
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: aws-logging
        namespace: aws-observability
      data:
        output.conf: |
          [OUTPUT]
            Name  es
            Match *
            Host  {{search-example-gjxdcilagiprbglqn42jsty66y}}.{{region-code}}.es.amazonaws.com
            Port  443
            Index {{example}}
            Type  {{example_type}}
            AWS_Auth On
            AWS_Region {{region-code}}
            tls   On
      ```

   1. 매니페스트를 클러스터에 적용합니다.

      ```
      kubectl apply -f aws-logging-opensearch-configmap.yaml
      ```

------
#### [ Firehose ]

   Firehose로 로그를 전송할 때는 다음과 같은 두 가지 출력 옵션이 있습니다.
   +  [kinesis\_firehose](https://docs.fluentbit.io/manual/pipeline/outputs/firehose) – C로 작성된 출력 플러그인입니다.
   +  [firehose](https://github.com/aws/amazon-kinesis-firehose-for-fluent-bit) - Golang으로 작성된 출력 플러그인

     다음 예에서는 `kinesis_firehose` 플러그 인을 사용하여 Firehose로 로그를 전송하는 방법을 보여줍니다.

     1. 다음 콘텐츠를 `aws-logging-firehose-configmap.yaml`이라는 파일에 저장합니다. {{region-code}}를 클러스터가 있는 AWS 리전으로 바꿉니다.

        ```
        kind: ConfigMap
        apiVersion: v1
        metadata:
          name: aws-logging
          namespace: aws-observability
        data:
          output.conf: |
            [OUTPUT]
             Name  kinesis_firehose
             Match *
             region {{region-code}}
             delivery_stream my-stream-firehose
        ```

     1. 매니페스트를 클러스터에 적용합니다.

        ```
        kubectl apply -f aws-logging-firehose-configmap.yaml
        ```

------

1. Fargate Pod 실행 역할에 대한 권한을 설정하여 대상에 로그를 전송합니다.

   1. 대상의 IAM 정책을 컴퓨터에 다운로드합니다.  
**Example**  

------
#### [ CloudWatch ]

      CloudWatch IAM 정책을 컴퓨터에 다운로드합니다. GitHub에서 [정책](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json)을 볼 수도 있습니다.

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
      ```

------
#### [ Amazon OpenSearch Service ]

      OpenSearch IAM 정책을 컴퓨터에 다운로드합니다. GitHub에서 [정책](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json)을 볼 수도 있습니다.

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json
      ```

      OpenSearch Dashboard의 액세스 컨트롤이 제대로 구성되어 있는지 확인합니다. OpenSearch Dashboard의 `all_access role`에는 Fargate 포드 실행 역할과 IAM 역할이 매핑되어야 합니다. `security_manager` 역할에 대해서도 동일한 매핑이 수행되어야 합니다. 이전 매핑을 추가하려면 `Menu`, `Security`, `Roles`를 차례로 선택한 다음 해당 역할을 선택합니다. 자세한 내용은 [CloudWatch Logs가 내 Amazon ES 도메인으로 스트리밍되도록 문제를 해결하려면 어떻게 해야 하나요?](https://aws.amazon.com/tr/premiumsupport/knowledge-center/es-troubleshoot-cloudwatch-logs/) 부분을 참조하세요.

------
#### [ Firehose ]

      Firehose IAM 정책을 컴퓨터에 다운로드합니다. GitHub에서 [정책](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json)을 볼 수도 있습니다.

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
      ```

------

   1. 다운로드한 정책 파일에서 IAM 정책을 생성합니다.

      ```
      aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
      ```

   1. 다음 명령을 사용하여 Fargate 프로필에 대해 지정된 포드 실행 역할에 IAM 정책을 연결합니다. {{111122223333}}을 계정 ID로 바꿉니다. {{AmazonEKSFargatePodExecutionRole}}을 포드 실행 역할로 바꿉니다(자세한 내용은 [2단계: Fargate 포드 실행 역할 생성](fargate-getting-started.md#fargate-sg-pod-execution-role) 참조).

      ```
      aws iam attach-role-policy \
        --policy-arn arn:aws:iam::{{111122223333}}:policy/eks-fargate-logging-policy \
        --role-name {{AmazonEKSFargatePodExecutionRole}}
      ```

### Kubernetes 필터 지원
<a name="fargate-logging-kubernetes-filter"></a>

Fluent Bit Kubernetes 필터를 사용하면 로그 파일에 Kubernetes 메타데이터를 추가할 수 있습니다. 필터에 대한 자세한 내용은 Fluent Bit 설명서의 [Kubernetes](https://docs.fluentbit.io/manual/pipeline/filters/kubernetes)를 참조하세요. API 서버 엔드포인트를 사용하여 필터를 적용할 수 있습니다.

```
filters.conf: |
    [FILTER]
        Name             kubernetes
        Match            kube.*
        Merge_Log           On
        Buffer_Size         0
        Kube_Meta_Cache_TTL {{300}}s
```

**중요**  
 `Kube_URL`, `Kube_CA_File`, `Kube_Token_Command` 및 `Kube_Token_File`은 서비스 소유 구성 파라미터이므로 지정하면 안 됩니다. Amazon EKS Fargate가 이러한 값을 채웁니다.
 `Kube_Meta_Cache_TTL`은 Fluent Bit가 최신 메타데이터에 대해 API 서버와 통신할 때까지 대기하는 시간입니다. `Kube_Meta_Cache_TTL`을 지정하지 않으면 Amazon EKS Fargate는 API 서버의 로드를 줄이기 위해 기본값 30분을 추가합니다.

### 계정에 Fluent-bit 프로세스 로그 전송
<a name="ship-fluent-bit-process-logs"></a>

원하는 경우 다음 `ConfigMap`을 사용하여 Fluent Bit 프로세스 로그를 Amazon CloudWatch로 전송할 수 있습니다. Fluent Bit 프로세스 로그를 CloudWatch로 전송하려면 추가 로그 수집 및 스토리지 비용이 필요합니다. {{region-code}}를 클러스터가 있는 AWS 리전으로 바꿉니다.

```
kind: ConfigMap
apiVersion: v1
metadata:
  name: aws-logging
  namespace: aws-observability
  labels:
data:
  # Configuration files: server, input, filters and output
  # ======================================================
  flb_log_cw: "true"  # Ships Fluent Bit process logs to CloudWatch.

  output.conf: |
    [OUTPUT]
        Name cloudwatch
        Match kube.*
        region {{region-code}}
        log_group_name fluent-bit-cloudwatch
        log_stream_prefix from-fluent-bit-
        auto_create_group true
```

로그는 클러스터와 동일한 AWS 리전의 CloudWatch에 있습니다. 로그 그룹 이름은 ` {{my-cluster}}-fluent-bit-logs`이고 Fluent Bit 로그스트림 이름은 `fluent-bit-{{podname}}-{{pod-namespace}} `입니다.

**참고**  
프로세스 로그는 Fluent Bit 프로세스가 성공적으로 시작된 경우에만 전송됩니다. Fluent Bit를 시작하는 동안 오류가 발생하면 프로세스 로그가 누락됩니다. CloudWatch에는 프로세스 로그만 전송할 수 있습니다.
계정으로 프로세스 로그 전송을 디버깅하려면 이전 `ConfigMap`을 적용하여 프로세스 로그를 얻습니다. Fluent Bit 시작에 실패하는 이유는 일반적으로 시작하는 동안 Fluent Bit에서 `ConfigMap`을 구문 분석하거나 수락하지 않기 때문입니다.

### Fluent Bit 프로세스 로그 전송 중지
<a name="stop-fluent-bit-process-logs"></a>

Fluent Bit 프로세스 로그를 CloudWatch로 전송하려면 추가 로그 수집 및 스토리지 비용이 필요합니다. 기존 `ConfigMap` 설정에서 프로세스 로그를 제외하려면 다음 단계를 수행하세요.

1. Fargate 로깅을 활성화한 후 Amazon EKS 클러스터의 Fluent Bit 프로세스 로그에 대해 자동으로 생성된 CloudWatch 로그 그룹을 찾습니다. 형식 ` {{my-cluster}}-fluent-bit-logs`을 따릅니다.

1. CloudWatch 로그 그룹에서 각 포드의 프로세스 로그에 대해 생성된 기존 CloudWatch 로그 스트림을 삭제합니다.

1. `ConfigMap`을 편집하고 `flb_log_cw: "false"`를 설정합니다.

1. 클러스터의 모든 포드를 클러스터의 포드에 대한 재시작합니다.

## 애플리케이션 테스트
<a name="fargate-logging-test-application"></a>

1. 샘플 포드를 배포합니다.

   1. 다음 콘텐츠를 컴퓨터에 `sample-app.yaml`이라는 파일에 저장합니다.

      ```
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sample-app
        namespace: {{same-namespace-as-your-fargate-profile}}
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
              - name: nginx
                image: nginx:latest
                ports:
                  - name: http
                    containerPort: 80
      ```

   1. 매니페스트를 클러스터에 적용합니다.

      ```
      kubectl apply -f sample-app.yaml
      ```

1. `ConfigMap`에서 구성한 대상을 사용하여 NGINX 로그를 봅니다.

## 크기 조정 고려 사항
<a name="fargate-logging-size-considerations"></a>

로그 라우터에 대해 최대 50MB의 메모리를 계획하는 것이 좋습니다. 애플리케이션에서 매우 높은 처리량으로 로그를 생성할 것으로 예상되는 경우 최대 100MB까지 계획해야 합니다.

## 문제 해결
<a name="fargate-logging-troubleshooting"></a>

잘못된 `ConfigMap`과 같은 원인으로 로깅 기능이 사용 또는 사용 중지되었는지 여부와 잘못된 이유를 확인하려면 `kubectl describe pod {{pod-name}} `을 사용하여 포드 이벤트를 살펴봅니다. 출력에는 다음 예제 출력과 같이 로깅의 사용 여부를 명확히 하는 포드 이벤트가 포함될 수 있습니다.

```
[...]
Annotations:          CapacityProvisioned: 0.25vCPU 0.5GB
                      Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND
[...]
Events:
  Type     Reason           Age        From                                                           Message
  ----     ------           ----       ----                                                           -------
  Warning  LoggingDisabled  <unknown>  fargate-scheduler                                              Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found
```

포드 이벤트는 설정에 따라 기간이 정해진 일시적인 이벤트입니다. 또한 `kubectl describe pod {{pod-name}} `을 사용하여 포드의 주석을 볼 수 있습니다. 포드 주석에는 로깅 기능이 사용 또는 사용 중지되었는지 여부와 이유에 대한 정보가 있습니다.