이 시리즈는 AWS EKS & FastAPI 환경에서 로그를 적용하는 과정을 다루고 있습니다. 전체 시리즈는 다음과 같습니다.
- FastAPI log (1) - AWS EKS Fargate 환경에서 log 를 외부시스템에 보내기
- FastAPI log (2) -AWS EKS Fargate, 왜 Fluent Bit 인가?
기존 모놀리식 서비스를 마이크로서비스 아키텍처로 전환하면서 AWS EKS(Fargate) 기반으로 운영하는 방안을 선택했습니다. 이 과정에서 Java & Spring 기반 서비스를 Python & FastAPI로 변경하는 것뿐만 아니라, EKS Kubernetes 환경에서 운영하는 방법을 익히는 것도 중요한 과제였지요.
그중 하나가 로그 수집(logging) 이었는데요. Fargate 환경에서는 DaemonSet을 사용할 수 없기 때문에, 기존 방식대로 로그 수집을 설정할 수 없었다. 이에 따라 AWS가 제공하는 Fluent Bit 기반의 로그 수집 방식을 적용해야 했습니다.
AWS EKS Fargate의 로깅 구조
AWS EKS를 Fargate로 운영할 때, Dataplane 내부에는 이미 Fluent Bit 에이전트가 설치되어 있다. 이를 활용하면 추가적인 로그 수집용 에이전트 없이 AWS CloudWatch 또는 S3와 같은 외부 서비스로 로그를 보낼 수 있습니다.
EKS Fargate 환경에서는 aws-logging이라는 ConfigMap을 사용하여 로그를 관리합니다. 따라서, 로그를 수집하고 외부로 전송하려면 이 ConfigMap을 올바르게 설정해야 합니다.
AWS EKS Fargate 로깅 설정 방법
1. IAM role 정책 추가
EKS 운영에는 여러 IAM Role이 필요하지만, 로깅을 위해서는 Pod Execution Role에 다음과 같은 정책을 추가해야 합니다. 이 정책은 CloudWatch에 로그를 전송할 수 있도록 해줍니다.
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams"
],
"Resource": "*"
}
]
AWS CLI 또는 AWS Console을 사용하여 Pod Execution Role에 위 정책을 적용합니다.
2. EKS Namespace 및 ConfigMap 설정
AWS에서 제공하는 표준 스크립트를 사용하여 Fluent Bit을 설정할 수 있습니다. 이 설정을 통해 CloudWatch로 로그를 전송하며, 필요에 따라 S3 또는 외부 서비스로 변경할 수도 있습니다.
다음과 같이 aws-logging.yaml 파일을 생성합니다:
kind: Namespace
apiVersion: v1
metadata:
name: aws-observability # 이름 변경되면 안됨
labels:
aws-observability: enabled # 꼭 필요!
---
kind: ConfigMap
apiVersion: v1
metadata:
name: aws-logging # 이름 변경되면 안됨
namespace: aws-observability
data:
flb_log_cw: "true" # Fluent Bit 자체 생산 log
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 {aws_region}
log_group_name {log_group_name} # cloudwatch log group 이름
log_stream_prefix from-fluent-bit- # 로그 prefix
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
위 설정을 적용하려면 다음 명령을 실행합니다:
kubectl apply -f aws-logging.yaml
참고: AWS Fargate에서 제공하는 Fluent Bit은 [FILTER], [OUTPUT], [PARSER] 설정만 지원합니다. [SERVICE] 및 [INPUT] 설정은 사용할 수 없습니다.
3. 로그 수집 적용하기
아직 올라와있는 pod 이 없다면 이제부터 Deployment 를 올리고 pod 을 올리면 자동으로 logging 이 적용됩니다. 하지만 이미 pod 이 올라와 있다면 pod 을 재시작하는 방법을 통해 aws-logging config map 을 참조하게 할 수 있습니다.
kubectl rollout restart deployment -n <namespace>
참고자료
이제 AWS EKS Fargate 환경에서 로그 수집이 정상적으로 설정되었네요. 적용이 완료된 후, AWS CloudWatch 콘솔에서 로그 그룹을 확인하여 로그가 정상적으로 전송되고 있는지 검토할 수 있습니다.
- Fluent Bit 공식 문서: What is Fluent Bit?
- AWS EKS Fargate 로깅 매뉴얼: EKS Fargate Logging
'탐구 생활 > FastAPI Log' 카테고리의 다른 글
FastAPI log (4) - 개선하기 (0) | 2025.03.02 |
---|---|
FastAPI log (3) - 설계, 구현 (0) | 2025.01.30 |
FastAPI log (2) -AWS EKS Fargate, 왜 Fluent Bit 인가? (0) | 2025.01.30 |