Teams 로 AWS DB 모니터링 메세지 받기

장크리수탉·2022년 12월 16일
3

AWS

목록 보기
3/4
post-thumbnail

1) Teams Webhook 발급

알림을 받고자 하는 채널의 webhook URL이 필요.

1. 알림을 받고싶은 채널의 더보기(...) > 커넥터

2. Incoming Webhook 검색 > 설정

노란색 네모는 아래에서 설명하겠음.

3. 알림 받고자 하는 이름 설정후 확인

이름 설정후 확인을 하면 사진의 가장 아래처럼, webhook URL이 발급된다.
이 URL을 저장. 혹시 까먹거나, 나중에 다시 보고 싶다면 2번에 노란색 네모를 누르면 나옴.

4. 확인

2) AWS SNS 주제 생성

어떤 정보를 받아 올건지 주제를 생성해야 함.

1. Amazon SNS > 주제 > 주제생성

2. 세부정보 설정

  • 유형 : 표준
  • 이름 : 받아올 데이터에 대한 명확한 설명이 담긴 이름이 좋음.

3. 완료

다른것은 따로 설정하지 않고 주제 생성.

3) AWS Lambda 함수 생성

위에서 설정한 주제에 대해서, 어떻게 받아올건지 이후에 설정을 할 것인데 우리는 Teams로 메세지를 쏘는 기능을 만들 것이므로, AWS Lambda를 이용할 것이다.

1. AWS Lambda > 함수 > 함수생성

2. 기본정보 입력 > 생성

  • 함수이름
  • 런타임 : Python

이후 다른 설정은 따로 안바꾸고 생성함. 완료되면 아래와 같이 나옴.
아래 함수 ARN 을 저장해 놓아야 함.

3. 환경변수 설정

  • key는 각자 원하는 이름으로 설정
  • 값은 Teams WebhookURL 설정

4. 코드작성 및 저장> Deploy

아래 코드에서 url을 바꾼 후 lambda_function.py에 붙여넣고 저장 후 Deploy를 한다.
url 은 처음에 발급받은 Teams webhookURL을 넣는다.

예시) url = os.environ['scouter911hook']

import urllib3 
import json
import os

http = urllib3.PoolManager()

def lambda_handler(event, context): 
    url = os.environ['환경변수 Key'] 
    message = json.loads(event['Records'][0]['Sns']['Message'])

    alarm_name = message['AlarmName']
    new_state = message['NewStateValue']
    reason = message['NewStateReason']

    msg = {
        'text': "%s: %s CPU가 85프로 이상 입니다.  Info: %s" % (new_state, alarm_name, reason)
    }

    encoded_msg = json.dumps(msg).encode('utf-8')
    resp = http.request('POST',url, body=encoded_msg)
    return (json.loads(encoded_msg))

코드는 보면 바로 이해할 내용인지라, 한가지만 짚고 넘어가겠다.

message = json.loads(event['Records'][0]['Sns']['Message'])

event['Records'][0]['Sns']['Message']에 담겨오는 정보는 아래와 같다.

따라서, 이중 나는 AlarmNams, NewStateValue, NewStateReason만 메세지로 받고자 하여 위와같은 코드를 작성하였다.

5. TEST

아래의 테스트 코드를 넣고 JSON 형식 지정을 누른 후 저장 버튼 클릭.

{
  "Records": [
    {
      "EventSource": "aws:sns",
      "EventVersion": "1.0",
      "EventSubscriptionArn": "arn:aws:sns:ap-northeast-2:046394151411:DEV_RDS_CPUUtilization",
      "Sns": {
        "Type": "Notification",
        "MessageId": "test",
        "TopicArn": "arn:aws:sns:ap-northeast-2:046394151411:DEV_RDS_CPUUtilization",
        "Subject": "ALARM: \"RDS-CPUUtilization-high\" in Asia Pacific (Seoul)",
        "Message": "{\"AlarmName\":\"RDS-CPUUtilization-high\",\"AlarmDescription\":\"RDS CPUUtilization HIGH\",\"AWSAccountId\":\"test\",\"NewStateValue\":\"ALARM\",\"NewStateReason\":\"Thresholds Crossed: 1 out of the last 1 datapoints [3.357642633941475 (14/12/22 07:05:00)] was greater than the threshold (1.0) (minimum 1 datapoint for OK -> ALARM transition).\",\"StateChangeTime\":\"2021-06-07T11:31:17.332+0000\",\"Region\":\"Asia Pacific (Seoul)\",\"AlarmArn\":\"arn:aws:cloudwatch:ap-northeast-2:123123123:alarm:RDS-CPUUtilization-high\",\"OldStateValue\":\"OK\",\"Trigger\":{\"Period\":60,\"EvaluationPeriods\":10,\"ComparisonOperator\":\"GreaterThanUpperThreshold\",\"ThresholdMetricId\":\"ad1\",\"TreatMissingData\":\"- TreatMissingData:                    missing\",\"EvaluateLowSampleCountPercentile\":\"\",\"Metrics\":[{\"Id\":\"m1\",\"MetricStat\":{\"Metric\":{\"Dimensions\":[{\"value\":\"ant-man-rdb-live\",\"name\":\"DBInstanceIdentifier\"}],\"MetricName\":\"CPUUtilization\",\"Namespace\":\"AWS/RDS\"},\"Period\":60,\"Stat\":\"Average\"},\"ReturnData\":true},{\"Expression\":\"ANOMALY_DETECTION_BAND(m1, 3)\",\"Id\":\"ad1\",\"Label\":\"CPUUtilization (expected)\",\"ReturnData\":true}]}}",
        "Timestamp": "2021-06-07T11:31:17.380Z",
        "SignatureVersion": "1",
        "MessageAttributes": {}
      }
    }
  ]
}

그리고 Test 버튼을 누르고 status success가 나오면 됨.

4) AWS SNS 구독 생성

받아온 정보는 주제로 전달이 되는데, 이 전달된 내용을 최종적으로 어디서 볼 것인지 구독을 생성해야 함.

1. Amazon SNS > 구독 > 구독생성

참고로 한가지 주제로 여러 구독이 가능함.
예를들어 CPU 사용량 이라는 한가지 주제를 이메일로도 받고 문자로도 받는 것 처럼 여러가지 수단(구독)으로 받을 수 있음.

2. 세부정보 설정

  • 주제 ARN : 버튼을 클릭하면 자동으로 설정한 주제 목록이 나옴. 위에서 생성한 주제 클릭.

  • 프로토콜 : 구독할 엔드포인트 유형 선택. 클릭하면 아래와 같이 엔드포인트 유형이 나옴.
    AWS Lambda를 이용하여 Teams로 메세지를 쏠 거기 때문에 이걸 선택.

  • 엔드포인트 : 아까 Lambda 생성할 때 저장해 둔, 함수 ARN을 붙여넣으면 아래 사진처럼 Use 하고 ARN이 뜨는데, 그걸 클릭.

3. 구독생성

완료되면 아래와 같이 나옴.


📌 여기까지, 구조는 아래와 같음.

이제 어떤 구독 내용물을 전달할거냐! 설정만 남아있음.
우리는 AWS RDS의 CPU 사용량에 대한 정보를 전달받고자 하니, Cloudwatch를 통하여 정보를 받을 것.

5) AWS Cloudwatch 경보설정

클라우드 워치는 리소스 및 애플리케이션을 모니터링 하는 서비스임.

1. Cloudwatch > 모든경보 > 경보생성

2. 지표선택 > RDS검색 > 데이터베이스 별 지표 > CPUUtilzaion 체크 > 지표선택




3. 조건 지정

자세한 내용은 cloudwatch를 공부하면 좋을 것.
나는 1분의 기간동안 CPU사용률이 최소 85% 이상이 되면 알림을 받고자 하여 아래 사진처럼 설정함.

4. 알림 작업 구성

  • 경보상태
  • 기존 SNS 주제선택 : 아까 2)에서 만든 주제가 나타남. 그걸 클릭.
  • 그 외에는 변경 없이 다음.

5. 이름 및 설명 추가 > 생성

여기서 정한 이름이 메세지에도 옴. 아래사진 참조하여 잘 정하기.
그 이외거 건들이지 않고 다음을 누르면 미리보기 및 생성이 나옴.
그대로 경보 생성.

6. 확인

바로 만들면 상태가 데이터 부족으로 나옴.
조금 기다리면 정상적으로 작동함.
아마 1분당 CPU가 몇인지 필요한데, 만들자 마자는 바로 조회를 안하니까 조금 기다려야 하는 것 같음.

6) 테스트 및 완성

위 과정에서 문제가 없다면, Cloudwatch 에서 경보 발생시 SNS 주제에 데이터를 전달하고, 그 주제를 각 구독 대상에게 전달한다. 우리는 람다로 설정했으므로 람다가 받을 것. 그것을 람다에서 팀즈로 보내주는 것.

완료하면 아래처럼 나온다. 아래는 테스트겸 CPU 설정을 20으로 해놓은 것! 헷갈리지 마세요!
Cloudwatch 에서 정한 이름이 나옴.

7) 응용

profile
4차 산업시대 핵심인재로 매일 반보씩 걷는 장크리수탉의 Dictionary

4개의 댓글

comment-user-thumbnail
2024년 1월 5일

자세하게 글 써주셔서 감사합니다 도움많이 됐어요1!
혹시 7번 응용보면 개발DB는 타이틀같이 되어있고 밑에 본문도있는것같은데.. 람다에서 보낼때 msg = {
'text': ""
}

이 부분 혹시 어떻게 하셨는지 코드 알려주실 수 있을까요??? 잘안되네요ㅠ

1개의 답글