반응형
목차
배경
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 이름이 완벽하게 일치해야 한다.
반응형
댓글