서비스모니터링

Auto Scaling + CloudWatch를 이용한 알림(webhook & terraform)

Zero_To_One 2022. 5. 9. 12:05

1. 디스코드 웹훅 url 준비

2. 람다 설정 (런타임 : 파이썬 3.7) 및 SNS를 람다의 트리거로 설정

import boto3
import json
import logging
import os

from base64 import b64decode
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError

HOOK_URL = '웹훅 url 주소'

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def lambda_handler(event, context):
    logger.info("Event: " + str(event))
    message = json.loads(event['Records'][0]['Sns']['Message'])
    logger.info("Message: " + str(message))
    
    discord_message = {
        'username': '재혁 terraform',
        'avatar_url': 'https://dimg.donga.com/wps/NEWS/IMAGE/2019/04/25/95215551.1.jpg',
        'content': 'Test'
    }
    
    if 'AlarmName' in message:
        discord_message = {
            'username': '재혁 terraform',
            'avatar_url': 'https://dimg.donga.com/wps/NEWS/IMAGE/2019/04/25/95215551.1.jpg',
            'content': "AlarmName: %s \n OldStateValue: %s \n NewStateValue: %s " % (message['AlarmName'], message['OldStateValue'], message['NewStateValue'])
        }
    
    if 'Origin' in message:
        discord_message = {
            'username': '재혁 terraform',
            'avatar_url': 'https://dimg.donga.com/wps/NEWS/IMAGE/2019/04/25/95215551.1.jpg',
            'content': "Origin: %s \n Cause: %s \n Event: %s " % (message['Origin'], message['Cause'], message['Event'])
        }
    

    payload = json.dumps(discord_message).encode('utf-8')
    headers = {
        'Content-Type': 'application/json; charset=utf-8',
        'Content-Length': len(payload),
        'Host': 'discord.com',
        'user-agent': 'Mozilla/5.0'
    }
    req = Request(HOOK_URL, payload, headers)
    
    try:
        response = urlopen(req)
        response.read()
        logger.info("Message posted to discord")
    except HTTPError as e:
        logger.error("Request failed: %d %s", e.code, e.reason)
        logger.error(e.read())
    except URLError as e:
        logger.error("Server connection failed: %s", e.reason)

3. 시작 템플릿 구성

  • 그룹 정보
    • 원하는 용량: 1
    • 최소 용량: 1
    • 최대 용량: 3
  • 시작 템플릿은 다음 구성을 따릅니다.
    • Ubuntu Server (LTS)
    • t2.nano
    • 기존 혹은 신규 키 페어를 사용합니다
    • 보안 그룹: 인바운드 HTTP 및 SSH 허용
    • 사용자 데이터
      #!/bin/bash
      echo "Hello, World" > index.html
      sudo apt update
      sudo apt install stress
      nohup busybox httpd -f -p 80 &

CloudWatch와 조정 정책

  • CloudWatch를 통한 Auto Scaling 그룹 지표 수집 활성화 필요
  • Scale-in 조건: CPU 40% 이하
  • Scale-out 조건: CPU 50% 이상

 

 

4. git clone 

https://github.com/vnfmsqkek3/autoscaling-cloudwatch

 

GitHub - vnfmsqkek3/autoscaling-cloudwatch

Contribute to vnfmsqkek3/autoscaling-cloudwatch development by creating an account on GitHub.

github.com

ALB를 사용하고, EC2의 cpu 사용량이 50%이상일 때 scal-out이 되면서 알람이 온다.

EC2의 cpu 사용량이 40% 이하일 때 scal-in이 되면서 알람이 온다.

약 300초의 대기시간을 가짐.

 

EC2에 접속해서

stress -c 1

를 입력하면 cpu에 과부화를 주면서 scal-out이 되고, 끄면 scal-in이 된다.