본문으로 바로가기

AWS 에서 EFK스택 구축하기

category IT/DevOps 2021. 5. 27. 11:09
반응형

Topic

  • AWS EKS 환경에서 EFK스택 구성
  • AWS EKS, AWS Elasticsearch Service, Fluentd데몬셋 설치, AWS Cloudwatch Logs활용

EFK란?

  • E (Elasticsearch란) : Apache Lucene기반의 java 오픈소스 분산 검색 엔진. 방대한 양의 데이터를 신속하게 저장,검색,분석 할 수 있음
  • F (Fluentd) : 오픈소스 데이터 수집기 중 하나이며 비정형 데이터를 수집함
  • K (kibana) : Elasticsearch 에서 색이된 데이터를 검색하여 분석 및 시각화를 해주는 플랫폼
  • 컨테이너는 특성상 컨테이너 단위의 가상서버가 생성/삭제가 빈번하므로 별도의 로그 수집이 필요 함
  • 이러한 log를 수집/모니터링 하기 위해 EFK스택을 사용 함

EFK구조도

  • 컨테이너에서 생성되는 로그를 Fluentd가 AWS Cloudwatch로 전달
  • AWS Cloudwatch의 LogStream기능을 사용하여 AWS Elasticsearch Service로 로그를 전달
  • AWS Elasticsearch Service

작업리스트

  • Amazon Elasticsearch Service 구축
  • Kubernetes에 Fluentd를 데몬셋으로 설치
  • Cloudwatch Logs 확인
  • Cloudwatch Logs를 ES로 전송
  • Kibana 설정 및 대시보드확인

Amazon Elasticsearch Service 구축

  • Amazone Elasticsearch Service는 외부에서 접근이 가능한 형태로 생성

Fluentd 설치

  • configmap생성

    kubectl create ns amazon-cloudwatch kubectl create configmap cluster-info --from-literal=cluster.name=<MY_CLUSTER_NAME> --from-literal=logs.region=<MY-AWS-REGION> -n amazon-cloudwatch
  • Fluentd.yaml 다운로드

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluentd/fluentd.yaml
  • 권장사항1 : 아래 fluentd-containers 애플리케이션 로그와 kuberentes_metadata 삭제

    ..
    ...
    <source>
      @type tail
      @id in_tail_fluentd_logs
      @label @fluentdlogs
      path /var/log/containers/fluentd*
      pos_file /var/log/fluentd.log.pos
      tag *
      read_from_head true
      <parse>
        @type json
        time_format %Y-%m-%dT%H:%M:%S.%NZ
      </parse>
    </source>
    
    <label @fluentdlogs>
      <filter **>
        @type kubernetes_metadata
        @id filter_kube_metadata_fluentd
      </filter>
    
      <filter **>
        @type record_transformer
        @id filter_fluentd_stream_transformer
        <record>
          stream_name ${tag_parts[3]}
        </record>
      </filter>
    
      <match **>
        @type relabel
        @label @NORMAL
      </match>
    </label>
    ...
    ...
  • 권장사항2 : 아래 코드 추가

    ..
    ...
      <filter **>
        @type record_transformer
        remove_keys $.kubernetes.pod_id, $.kubernetes.master_url, $.kubernetes.container_image_id, $.kubernetes.namespace_id
        @id filter_containers_stream_transformer
        <record>
          stream_name ${tag_parts[3]}
        </record>
      </filter>
    ...
    ...
    <filter **>
        @type record_transformer
        remove_keys $.kubernetes.pod_id, $.kubernetes.master_url, $.kubernetes.container_image_id, $.kubernetes.namespace_id
        @id filter_cwagent_stream_transformer
        <record>
          stream_name ${tag_parts[3]}
        </record>
      </filter>
    ...
    ...
    <filter **>
        @type record_transformer
        remove_keys $.kubernetes.pod_id, $.kubernetes.master_url, $.kubernetes.container_image_id, $.kubernetes.namespace_id
        @id filter_systemd_stream_transformer
        <record>
          stream_name ${tag}-${record["hostname"]}
        </record>
      </filter>
    ...
    ...
    <filter **>
        @type record_transformer
        remove_keys $.kubernetes.pod_id, $.kubernetes.master_url, $.kubernetes.container_image_id, $.kubernetes.namespace_id
        @id filter_containers_stream_transformer_host
        <record>
          stream_name ${tag}-${record["host"]}
        </record>
      </filter>
    ...
    ...

설치 확인

  1. kubect get pod -n amazon-cloudwatch
  2. AWS 콘솔에서 cloudwatch logs 에 로그 쌓이는 지 확인




### Cloucwatch logs 를 ES로 전송하기

- es전송용 policy 및 lambda용 role생성
- policy 규칙

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "es:*"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:es:ap-northeast-2:104818303680:domain/es-nrson-eks-log/*"
        }
    ]
}
  • Lambda 용 Role 을 생성하여 위 policy를 attach 해줌
  • cloudwatch logs 에서 해당 로그 선택 action - subscription filters - create elasticsearch subscription filter
  • 해당 ES랑 위에서만든 Role 선택 하여 생성*
  • 여기서 fillter pattern 을 주면 특정 필터에 걸려서 로그 스트리밍이 안될 수 있음*

kibana에서 로그 잘 들어오는지 확인

  • kibana접속

  • 왼쪽 카테고리 메뉴에서 security 선택

  • all_access - Backend roles - Add Backend Role - 앞에서 만들었던 lambda role의 ARN 정보 입력

  • kibana dashboard home - Use Elasticsearch data - Create index pattern (cwl-* 입력 > @timestamp > Create index pattern 선택)

반응형