- Application(Container)의 로그중 특정 로그의 내용을 Slack으로 알림을 받는 모델을 구축합니다.
- AWS EKS를 Terraform으로 구축 - github.com/eocis/container참고 및 추가
- Fluentd yaml 수정(stage/k8s/fluentd.yaml) - AWS github CloudWatch Agent(fluentd) 사용
- 로그 생성 Pod yaml 작성(stage/k8s/apply.yaml) - busybox image 사용
- Lambda Function 작성(stage/lambda/slack.py) - Bludprint(cloudwatch-alarm-to-slack-python)기반 코드 커스텀
- CloudWatch의 Log Group의 해당 로그 확인 및 Lambda 구독필터 설정 - 패턴필터링 설정(
{ $.log = "*error*" }
) - 1,2의 결과물 EKS Cluster에 Deploy
- Slack Alert 확인
https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html
# Log(JSON) 예시
{
"log":"492: logging update\n",
"stream":"stdout",
"docker":{
"container_id":"1664a08e2e555db58c8da287c9e94fe9567db40a6e0080bed5a573122e374fc4"
},
"kubernetes":{
"container_name":"example-log",
"namespace_name":"kube-example",
"pod_name":"example-web-app-68f99f459d-5mlqk",
"container_image":"busybox:latest",
"container_image_id":"docker-pullable://busybox@sha256:15e927f78df2cc772b70713543d6b651e3cd8370abf86b2ea4644a9fba21107f",
"pod_id":"349362ea-c5cb-43f7-a71d-90e9d005db48",
"host":"ip-10-0-2-109.ap-northeast-2.compute.internal",
"labels":{
"app":"example-web-app",
"pod-template-hash":"68f99f459d"
},
"master_url":"https://172.20.0.1:443/api",
"namespace_id":"0a07d5ef-7856-4ea0-9825-f227532a675a",
"namespace_labels":{
"kubernetes_io/metadata_name":"kube-example"
}
}
}
# Container_name이 example-log값 필터링
{ $.kubernetes.container_name = "example-log" }
# Log 내용 필터링
{ $.log = "491:*" } # 491: 로 시작하는 모든 로그 필터링
로그필터로 구독시 Event에 대한 Lambda 호출시에 event값은 바로 log 값이 전달되지는 않습니다.
CloudWatch Event에서 보내는 data값을 바이트코드로 변환하는 작업이 필요합니다.
# CloudWatch Log Event Value 예제
{
"awslogs": {
"data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwWQRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpLwivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQDQiMdxRQEAAA=="
}
}
https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html
AWS CLI 및 AWS SAM CLI가 필요합니다.
#AWS CLI를 통해 Lambda 코드를 배포하는 방법입니다.
aws lambda create-function --function-name my-function \
--zip-file fileb://function.zip --handler index.handler --runtime python3.x \
--role arn:aws:iam::123456789012:role/lambda-ex
- "stage/lambda/aws sam.yaml": Runtime, Handler, Memory Size, Timeout, Role, Variable 정의가 담겨있는 파일입니다.
- "stage/lambda/lambda deploy package.zip": Lambda Function 코드입니다.