Overview
Cloudwatch 알람 자동화 구성을 위해 오픈소스 (CloudWatchAutoAlarms ) 를 참고하여 아키텍처를 개선하고, 배포 코드를 Cloudformation에서 Terraform으로 변환하겠습니다. 프로젝트는 필자의 깃허브를 참고해주세요.
작업한 모듈은 필자의 깃허브를 참고해주세요.
CloudWatchAutoAlarms
Cloudwatch 알람 자동화 필요성은 다음과 같습니다.
- 동적 인프라 알람 : 변화하는 인프라에 맞춰 실시간으로 알람을 설정합니다.
- 통일화된 모니터링 설정: 모든 서비스와 인프라를 하나의 모니터링 시스템으로 일원화하여 관리합니다.
- 에포트 감소 : Cloudwatch 는 일괄 알람 설정 기능을 제공하지 않습니다. 서비스가 많은 경우 에포트가 늘어가고 휴먼 에러 가능성이 생깁니다.
기존의 모니터링 툴을 사용하고 있다면 고려대상이 아니지만, 서비스별로 사용하는 모니터링 툴이 다른 경우에는 위 측면에서 고려해 볼 가치가 있습니다.
CloudWatchAuoAlarm 소개
CloudWatchAutoAlarms 는 AWS 서비스에 등록된 태그 기반으로 CloudWatch 알람세트를 자동으로 빠르게 생성해주는 도구입니다. 아키텍처는 간단합니다. AWS EventBridge(CloudWatch Events) 를 통해 자원 변동(생성, 삭제)을 체크하여 변동이 있는 경우 AWS 람다 함수를 실행하는 구조입니다. 람다 함수는 python boto3를 통해 태그를 식별하고 자원별 알람을 생성합니다.
오픈소스에서 제공하는 알람 세트는 다음의 표를 참고해주세요.
AWS 서비스
|
Metrics
|
Amazon EC2
|
CPU Utilization
|
Amazon EC2
|
CPU Credit Balance (For T Class instances)
|
Amazon EC2
|
Disk Space Used % (Amazon CloudWatch agent predefined basic metric)
|
Amazon EC2
|
Memory Used % (Amazon CloudWatch agent predefined basic metric)
|
AWS RDS
|
CPU Utilization
|
AWS RDS
|
Alarms are created for RDS clusters as well as RDS database instances
|
AWS Lambda
|
Errors
|
AWS Lambda
|
Throttles
|
구성
직접 테스트해보겠습니다.
# git clone
git clone https://github.com/aws-samples/amazon-cloudwatch-auto-alarms.git
cd amazon-cloudwatch-auto-alarm
# template 실행
aws cloudformation create-stack --stack-name amazon-cloudwatch-auto-alarms \
--template-body file://CloudWatchAutoAlarms.yaml \
--capabilities CAPABILITY_IAM \
--parameters ParameterKey=S3DeploymentKey,ParameterValue=amazon-cloudwatch-auto-alarms.zip \
ParameterKey=S3DeploymentBucket,ParameterValue="S3이름" \
ParameterKey=AlarmNotificationARN,ParameterValue="TOPIC-ARN" --region ap-northeast-2
- template 실행 인자 중 S3, SNS Topic 은 미리 생성해야 합니다. S3는 생성한 버킷 이름, SNS Topic은 arn으로 입력해주세요.
- S3 버킷은 람다 함수를 업로드하기 위해 사용됩니다. 다만, 코드 변경이 힘들다는 점에서 개선이 필요한 사항입니다.
배포를 완료하면 람다 함수에서 구성을 확인할 수 있습니다.
EC2 에서 임의의 자원 생성시 알람이 자동으로 생성됩니다.
❓ Cloudwatch 알람 생성이 안되는 경우
모니터링과 로그 기록을 확인하세요. 모니터링 지표는 람다 내 지표 탭을 클릭하시고, 로그는
Cloudwatch > 로그 그룹에서 확인할 수 있습니다.
테라폼 모듈로 전환
위 CloudWatchAutoAlarms 를 테라폼 모듈로 전환하겠습니다.
모듈로 전환하는 이유는 크게 두가지 입니다.
- 코드 관리 용이 : 오픈소스는 S3버킷에 업로드하여 람다함수를 구성하였지만, 테라폼에서는 local-path를 통해 코드를 배포하기에 코드 관리가 간편해집니다.
- 호환성 확대 : 테라폼 모듈 구성으로 다른 테라폼 프로젝트에서 사용할 수 있도록 구성하였습니다.
Cloudformation 템플릿을 테라폼으로 전환하기 위해 cf2tf 도구를 사용하였습니다.
변환 과정으로 해외 [Medium] 블로그를 참고하였습니다.
# cf2tf 설치
brew install cf2tf
# 변환
cf2tf CloudWatchAutoAlarms.yaml > CloudWatchAutoAlarms.tf
명령어 한 번으로 변환이 되면 좋겠지만, 버전 호환성과 일부 수정이 필요합니다.
모듈 변환 과정
1) 주석 제거
가독성을 위해 주석을 제거합니다.
2) “ 제거
일부 테라폼(event_pattern)에서는 입력 문구가 잘못되어 있습니다.
" 를 제거하고 fmt를 통해 파일 포맷을 맞춥니다.
[수정 전]
[수정 후]
3) 람다 함수 코드 업로드 디렉토리(local-path) 변경
람다 함수 코드 생성 경로는 S3가 아닌 local-path로 수정해야 합니다.
테라폼 내에서 로컬 폴더를 zip으로 생성하는 data 를 만들고, 람다 함수에서 입력받도록 수정합니다.
4) 모듈화
위 구성한 내용을 서비스로 나눠 파일로 구성하였습니다.
모듈화된 디렉토리 구조는 다음과 같습니다.
├── main.tf
├── modules
│ └── cloudwatch_auto_alarms
│ ├── cw-lambda-alerts.zip
│ ├── event.tf
│ ├── iam.tf
│ ├── lambda.tf
│ ├── output.tf
│ ├── src
│ │ ├── actions.py
│ │ ├── cw-lambda-alerts.zip
│ │ └── cw_auto_alarms.py
│ └── variables.tf
└── provider.tf
또한, 알람 SNS 설정 및 임계치를 변수화하여 main.tf를 다음과 같이 구성하였습니다.
module "cloudwatch_auto_alarms" {
source = "./modules/cloudwatch_auto_alarms"
memory = var.memory
event_state = var.event_state
alarm_notification_arn = var.alarm_notification_arn
alarm_identifier_prefix = var.alarm_identifier_prefix
}
# 변수 정의
variable "memory" {
description = "Memory to allocate to Lambda function"
type = number
default = 128
}
variable "event_state" {
description = "Create Cloudwatch event to trigger execution on instance start / terminate."
type = string
default = "ENABLED"
}
variable "alarm_notification_arn" {
description = "Enter the Amazon SNS Notification ARN for alarm notifications, leave blank to disable notifications."
type = string
default = ""
}
variable "alarm_identifier_prefix" {
description = "Enter the prefix that should be added to the beginning of each alarm created by the solution"
type = string
default = "AutoAlarm"
}
모듈화된 부분은 필자의 깃허브에서 확인 가능합니다.
테스트
테스트 전 AWS SNS Topic을 생성하여 arn을 테라폼 모듈 변수에 입력해야 합니다. 변수 입력 후 테라폼 명령어를 통해 인프라를 배포하겠습니다.
terraform init
terraform plan
terraform apply
구성 확인이 끝났으면 인스턴스 생성을 통해 알람이 정상적으로 붙는 지 확인하겠습니다.
- 변수에서 설정한 태그 값을 인스턴스 생성시 붙여줍니다. 기본 코드의 설정값은 ALARM_TAG = Create_Auto_Alarms 으로 인스턴스 키에Create_Auto_Alarms 값은 빈값으로 넣었습니다.
추가로
이 글에서는 CloudWatchAutoAlarms 를 테라폼 모듈로 변환한 내용만 다뤘습니다.
다음 글에서는 변환한 모듈을 확장하여 다른 모듈에서의 적용 그리고 다른 AWS 서비스 알람을 추가하겠습니다.
'Cloud Tech' 카테고리의 다른 글
EKS Karpenter로 부드럽게 Migration 하기 (2) | 2024.07.06 |
---|---|
테라폼 모듈을 활용한 Cloudwatch 알람 자동화(심화) (0) | 2024.06.29 |
Terraform 내부 로직 이해 (0) | 2024.06.15 |
SonarQube를 활용한 EKS CleanCode CI /CD 파이프라인 구축하기 (0) | 2024.04.20 |
쿠버네티스 오픈소스, Kyverno 이해하기 (0) | 2024.04.12 |