Cloud Tech

테라폼 모듈을 활용한 CloudWatch Alarm 자동화

Hanhorang31 2024. 6. 22. 19:36
 

 

Overview

Cloudwatch 알람 자동화 구성을 위해 오픈소스 (CloudWatchAutoAlarms ) 를 참고하여 아키텍처를 개선하고, 배포 코드를 Cloudformation에서 Terraform으로 변환하겠습니다. 프로젝트는 필자의 깃허브를 참고해주세요.

작업한 모듈은 필자의 깃허브를 참고해주세요.

테라폼 모듈 구성 인프라 아키텍처

CloudWatchAutoAlarms

Cloudwatch 알람 자동화 필요성은 다음과 같습니다.

  • 동적 인프라 알람 : 변화하는 인프라에 맞춰 실시간으로 알람을 설정합니다.
  • 통일화된 모니터링 설정: 모든 서비스와 인프라를 하나의 모니터링 시스템으로 일원화하여 관리합니다.
  • 에포트 감소 : Cloudwatch 는 일괄 알람 설정 기능을 제공하지 않습니다. 서비스가 많은 경우 에포트가 늘어가고 휴먼 에러 가능성이 생깁니다.

기존의 모니터링 툴을 사용하고 있다면 고려대상이 아니지만, 서비스별로 사용하는 모니터링 툴이 다른 경우에는 위 측면에서 고려해 볼 가치가 있습니다.

 

CloudWatchAuoAlarm 소개

CloudWatchAutoAlarms AWS 서비스에 등록된 태그 기반으로 CloudWatch 알람세트를 자동으로 빠르게 생성해주는 도구입니다. 아키텍처는 간단합니다. AWS EventBridge(CloudWatch Events) 를 통해 자원 변동(생성, 삭제)을 체크하여 변동이 있는 경우 AWS 람다 함수를 실행하는 구조입니다. 람다 함수는 python boto3를 통해 태그를 식별하고 자원별 알람을 생성합니다.

CloudWatchAutoAlarm

오픈소스에서 제공하는 알람 세트는 다음의 표를 참고해주세요.

 
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 서비스 알람을 추가하겠습니다.