본문 바로가기
DevOps

EKS에 Fluent Bit 배포 중 발생한 오류 및 해결기 (Terraform + Helm + IRSA)

by Rainbound-IT 2025. 7. 28.
반응형

목차

     배경

    AWS EKS 클러스터에 Fluent Bit를 Helm과 Terraform으로 배포하여 CloudWatch Logs로 로그를 수집하려는 환경을 구성했습니다.
    Terraform으로 IRSA, Helm release, IAM Role을 관리했으며, 초기에는 공식 Helm chart (fluent/fluent-bit)를 사용했습니다.


     발생한 주요 오류

    1.  Fluent Bit가 Elasticsearch로 로그를 전송하려 함

    에러 로그:

    [ warn] [net] getaddrinfo(host='elasticsearch-master', err=4): Domain name not found
    [ warn] [engine] failed to flush chunk ... output=es.0

    원인:

    • Helm chart 기본 설정이 es output을 활성화하고 있어 CloudWatch 외에 Elasticsearch도 접근 시도함
    • enabled = false, host = "" 등으로 설정해도 chart 내 템플릿에 여전히 남아 있는 부분이 존재함

    2.  IRSA 인증 실패 (AccessDenied)

    WebIdentityErr: failed to retrieve credentials
    caused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity

    원인:

    • IAM Role의 Trust Policy에서 ServiceAccount 이름 또는 namespace가 Helm 차트의 실제 값과 불일치
    • 예: "system:serviceaccount:kube-system:fluentbit-sa" → 실제는 "system:serviceaccount:logging:fluent-bit"

    3.  ConfigMap에 Elasticsearch 설정이 여전히 존재

    [OUTPUT]
      Name es
      Host elasticsearch-master
     

    원인:

    • Helm 차트 내 default ConfigMap이 override되지 않거나 충돌
    • Terraform으로 아무리 설정을 무시하려 해도 Helm chart 자체 설정이 우선됨

     해결 과정 요약

     

    시도 결과
    elasticsearch.enabled = false 설정 실패 (Helm 내부 configmap 여전히 생성됨)
    helm_release 삭제 후 재배포 실패 (ConfigMap 캐시로 남음)
    Fluent Bit 버전 업그레이드 실패 (버전과 무관)
    ConfigMap 수동 확인 및 삭제 일부 성공, 그러나 helm 차트 재적용 시 복원됨
    IAM Trust Policy 수정 (sub 값 수정) IRSA 오류는 해결 가능
    공식 AWS Fluent Bit 배포 차트 사용 (GitHub 링크)  최종 해결
     

     최종 해결 방법

    AWS에서 공식 제공하는 Helm 차트인 aws/aws-for-fluent-bit를 사용하여 Fluent Bit를 배포.

    장점:

    • CloudWatch Logs, Firehose, Kinesis 등 AWS 서비스에 특화된 output 플러그인 사전 설정
    • IRSA 및 OIDC 인증 구조가 명확함
    • Helm values override가 직관적

     Terraform & Helm 구성 팁

    IAM Trust Policy 예시

    data "aws_iam_policy_document" "fluentbit_assume_role" {
      statement {
        actions = ["sts:AssumeRoleWithWebIdentity"]
        principals {
          type        = "Federated"
          identifiers = [aws_iam_openid_connect_provider.oidc_provider.arn]
        }
        condition {
          test     = "StringEquals"
          variable = "${replace(aws_iam_openid_connect_provider.oidc_provider.url, "https://", "")}:sub"
          values   = ["system:serviceaccount:logging:fluent-bit"]
        }
      }
    }

     마무리

    Terraform과 Helm을 조합하면 강력한 GitOps형 인프라를 만들 수 있지만, Helm chart의 default value 또는 ConfigMap 잔재가 문제를 일으킬 수 있습니다.

    교훈:
    → 복잡한 Helm chart를 쓸 경우, AWS 공식 제공 chart 또는 values.yaml을 먼저 확인하자.
    → IRSA 설정은 namespace와 serviceAccount 이름이 완벽하게 일치해야 한다.

    반응형

    댓글