Post

과제4. cloudwatch에서 slack으로 알람 전송

과제4. cloudwatch에서 slack으로 알람 전송

실습과제

  • 주제: CloudWatch -> Slack 알람 전송
    1. CloudWatch를 통해 실시간으로 AWS 자원을 모니터링합니다.
    2. CloudWatch에서 설정한 알람이 “정상 -> 경보” 상태로 변경되면 연결된 Slack 채널로 알람이 전송되어 24*365 관제할 수 있습니다.
      1)CloudWatch 알람 전송
      2)Slack으로 알람 전송

1. 시스템 구성

CloudWatch -> Slack 알람 전송

  1. CloudWatch를 통해 실시간으로 AWS 자원을 모니터링합니다.
  2. CloudWatch에서 설정한 알람이 “정상 -> 경보” 상태로 변경되면 연결된 Slack 채널로 알람이 전송되어 24*365 관제할 수 있습니다.

시스템 구성

alt text

CloudWatch에서 알람 발생 -> SNS 푸시 서비스 호출 -> Lambda 함수 트리거 -> 연동된 Slack 채널로 알람 전송

  1. Slack - 채널 기반 메시징 플랫폼. Channel 고유의 WebHook url을 통해 알람 수신
  2. CloudWatch - Aws 리소스 및 실행중인 어플리케이션 모니터링
  3. SNS - Publisher <-> Subscriber 간 통신 채널. 지원되는 프로토콜을 이용해 클라이언트에 메시지 발송
  4. Lambda - 서버리스 컴퓨팅 서비스. 서버를 관리하지 않아도 코드를 실행할 수 있게 하는 컴퓨팅 서비스
  5. KMS - 데이터 암호화에서 사용되는 암호화 키. 인터넷 전송 시 암호화 통신에 이용

2. Slack 설정

Slack 이란?

  1. 협업 메신저 툴
  2. 채널 기반 메시징 플랫폼
  3. 최초 회원가입 없이 WorkSpace 별 계정 사용
  4. Workspace 내에 Project 채널생성 -> Webhook을 이용해 CloudWatch 알람 수신
  5. 채널 - Workspace 내의 채팅 방. 채널 별로 계정 view 권한 제한 가능

    Web hook 이란?

  6. 서버에서 이벤트가 발생했을 때 클라이언트를 호출하는 메커니즘 제공
  7. 외부 시스템에서 Slack으로 post message 발송
  8. 외부 시스템에서 이벤트 발생 -> 클라이언트에서 제공하는 webhook Trigger -> Action 수행(슬랙 채널에 메세지 발송) Webhook 내부에서 슬랙의 Webhook endpoint로 post 요청

로그인 & 워크스페이스 생성

alt text

Web hook 설정

  1. 워크스페이스 > 설정 및 관리 > 앱 관리 > 앱

alt text

  1. web hook 검색 > 수신 웹후크 slack 추가

alt text alt text

  1. 설정 저장 > 웹후크 복사(키 암호화에 이용)
  2. cURL 복사 > EC2 인스턴스에 붙여넣기 > Slack 메시지 수신 확인 alt text

3. SNS 토픽 생성

SNS란?

  1. 메시지 브로커
  2. 구독 중인 클라이언트에 메시지 전달을 조정 및 관리
  3. Publisher - 게시자. 이벤트 생산 (여기선 CloudWatch)
  4. Subscriber - 구독자. 이벤트 구독(ex. Lambda, SQS, Http/s, Email, SMS)
  5. CloudWatch에서 알람 발생 -> SNS 푸시 서비스 호출 -> Lambda 함수 트리거 -> 연동된 Slack 채널로 알람 전송

SNS 토픽 생성

  1. SNS > 주제 > 주제 생성
  2. 주제 이름 - mission-sns > 주제 생성

alt text alt text

4. Lambda 함수 생성

Lambda란?

  1. 서버리스 컴퓨팅 서비스
  2. 애플리케이션을 실행하기 위한 별도의 서버 셋업 없이 곧바로 코드를 실행해주는 서비스
  3. 고정 비용 없이 사용 시간에 대해서만 비용
  4. CloudWatch에서 알람 발생 -> SNS 푸시 서비스 호출 -> Lambda 함수 트리거 -> 연동된 Slack 채널로 알람 전송

Lambda 함수 생성

! 블루프린트를 이용해 람다함수 생성

  1. Lambda > 함수 생성
  2. 블루프린트 사용 > Slack 검색 > CloudWatch-alarm-to-slack-python 선택
  3. 기본 정보
    • 함수 이름: mission-lambda
    • 실행 역할: 기본 Lambda 권한을 가진 역할 생성

alt text

  1. SNS 트리거
    • mission-sns 선택
    • 트리거 활성화

alt text

  1. 환경 변수
    • slackChannel: project(Slack 워크스페이스의 채널명)
    • kmsEncryptedHookUrl: test(KMS 키 암호화 전이므로 임의의 문자열)

alt text

5. KMS 키 설정

KMS(Key Management Service)란?

  1. 데이터를 암호화하는데 사용되는 암호화 키인 고객 마스터 키(CMKs)관리
  2. lambda함수에서 Slack으로 메시지 전송할 때 web hook 암호화
  3. CloudWatch에서 알람 발생 -> SNS 푸시 서비스 호출 -> Lambda 함수 트리거 —(KMS로 web hook 암호화) –> 연동된 Slack 채널로 알람 전송

KMS 키 생성

  1. KMS 키 생성
  2. KMS > 고객 관리형 키 > 키 생성 확인
1
aws kms create-key --region ap-northeast-2

KMS 키 별칭 생성

  1. 키 별칭 생성
  2. KMS > 고객 관리형 키 > 키 별칭 생성 확인
    1
    
    aws kms create-alias --alias-name alias/mission-kms-key --target-key-id fcb1da54-8f63-4339-b697-0c67fc9fe5f6 --region ap-northeast-2
    

    alt text

키 암호화

1
2
3
4
5
6
7
HOOK_URL = "https://" + boto3.client('kms').decrypt(
    CiphertextBlob=b64decode(ENCRYPTED_HOOK_URL),
    EncryptionContext={'LambdaFunctionName': os.environ['AWS_LAMBDA_FUNCTION_NAME']}
)['Plaintext'].decode('utf-8')

# lambda 함수 중 hook url decryption code
# lambdafunctionname -> 아무 함수에서나 복호화X
  • EncryptionContext는 boto3(python용 Aws SDK) kms decrypt의 Option 중 하나로, 해당 옵션을 decrypt에 추가 하려면 키 encrypt 시 람다 함수 이름 적용 필요(보안 강화). 그렇지 않을 경우 decrypt 시 아래의 에러 발생
    -> “The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access”

  • Hook url Encrypt 시 –encrypt-context 옵션 필요

  1. KMS 키 암호화. AWS CLI version 확인하여 명령어 수행 > CiphertextBlob 복사 (Lambda 함수 환경변수 KmsEncryptedHookUrl 값에 복사)
1
2
3
4
5
6
7
aws --vesion 

aws kms encrypt \
  --key-id alias/mission-kms-key \
  --plaintext fileb://<(echo -n "hooks.slack.com/services/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") \
  --region ap-northeast-2 \
  --encryption-context LambdaFunctionName=mission-lambda

-> 다 하고, CiphertextBlob 복사 해놓기.

6. Lambda 함수 설정

Lambda 함수 환경 변수 추가 - kmsEncryptedHookUrl

  1. Lambda 함수 > mission-lamda > 구성 > 환경변수 > 편집
    • kmsEncryptedHookUrl: KMS 키 암호화 후 CiphertextBlob 값
    • 암호화 구성: 고객 마스터키 사용
    • 고객 마스터 키: mission-kms-key(생성한 KMS 키 사용)

alt text

Lambda Role 정책 추가 - KMS Decrypt Policy

  • Lambda 함수 생성하면서 기본 생성된 Role은 AWSLambdaBasicExecutionRole 정책만 존재. AWSLambdaBasicExecutionRole: 로그 파일과 관련된 역할
  • kmsEncryptedHookUrl Decrypt를 위해 IAM Role에 kms:Decrypt Policy 추가. KMS 키로 암호화 된 web hook url을 lambda 함수에서 decrypt하기 위해 KMS decrypt 정책 필요. 그렇지 않으면 아래의 에러 발생
    -> “The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you ar not allowed to access.”
  1. IMA > 정책 > 정책 생성
  2. JSON > Policy 복사 > KMS key ARN 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1443036478000",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt"
      ],
      "Resource": [
        "<your KMS key ARN>"
      ]
    }
  ]
}

alt text

  1. 정책 이름 - AwsLambdaKmsExcutionPolicy > 정책 검토

  2. Lambda > mission-lambda > 구성 > 권한 > 역할 이름 클릭
  3. 정책 연결 > AwsLambdaKmsExcutionPolicy 선택 > 정책 연결

alt text alt text

7. 테스트

Test Event로 Slack 연동 확인

Lambda 함수 실행 테스트 케이스 작성하여 Slack 메신저 수신 확인

  1. 테스트 이벤트 작성:
    테스트 > 새 이벤트 > 이벤트 이름: MissionSlackTest > 다음 페이지의 테스트 케이스 코드 > 변경 사항 저장
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "Records": [
    {
      "EventSource": "aws:sns",
      "EventVersion": "1.0",
      "EventSubscriptionArn": "arn:aws:sns:eu-west-1:000000000000:cloudwatch-alarms:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "Sns": {
        "Type": "Notification",
        "MessageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "TopicArn": "arn:aws:sns:eu-west-1:000000000000:cloudwatch-alarms",
        "Subject": "ALARM: \"Example alarm name\" in EU - Ireland",
        "Message": "{\"AlarmName\":\"Example alarm name\",\"AlarmDescription\":\"Example alarm description.\",\"AWSAccountId\":\"000000000000\",\"NewStateValue\":\"ALARM\",\"NewStateReason\":\"Threshold Crossed: 1 datapoint (10.0) was greater than or equal to the threshold (1.0).\",\"StateChangeTime\":\"2017-01-12T16:30:42.236+0000\",\"Region\":\"EU - Ireland\",\"OldStateValue\":\"OK\",\"Trigger\":{\"MetricName\":\"DeliveryErrors\",\"Namespace\":\"ExampleNamespace\",\"Statistic\":\"SUM\",\"Unit\":null,\"Dimensions\":[],\"Period\":300,\"EvaluationPeriods\":1,\"ComparisonOperator\":\"GreaterThanOrEqualToThreshold\",\"Threshold\":1.0}}",
        "Timestamp": "2017-01-12T16:30:42.318Z",
        "SignatureVersion": "1",
        "Signature": "Cg==",
        "SigningCertUrl": "https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pem",
        "UnsubscribeUrl": "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:000000000000:cloudwatch-alarms:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "MessageAttributes": {}
      }
    }
  ]
}

alt text

  1. 호출 > Slack 테스트 메신저 수신 확인(Slack 메신저)

alt text alt text

8. Cloudwatch 알람 생성

CloudWatch 란?

  1. AWS 리소스 모니터링 서비스
  2. 알림 기능
    • 자원 사용량 임계치 초과했을 때 알람 발생
      ex) EC2, RDS, ElastiCache, EBS 등 자원의 사용량 모니터링
  3. 로그 수집 기능
    • 자원에서 발생하는 로그 수집(VPC Flowslog 등)
    • 로그 분석과 시각화
  4. 대시보드 기능
    • Metric를 생성하여 대시보드 생성 가능
      ex) CPU Utilization, StatusCheckFail, DiskWriteIOPS 등

CloudWatch 알람 설정과 CPU 부하 테스트

  1. CPU 임계치 50%인 알람 생성
  2. CPU 부하 테스트로 알람 발생 유도
  3. Slack 메신저 수신 확인

CloudWatch CPU 임계치 50%인 알람 생성

1분 동안 bastion instance의 CPU 사용률 50% 1회 이상 발생하면 알람 발생하는 알람 생성

  1. CloudWatch > 경보 > 경보 생성
  2. 지표 선택 > EC2 > 인스턴스별 지표 > CPU Utilization, bastion 인스턴스 선택

alt text

  1. 지표 및 조건 지정
    • 지표
      • 통계: Average
      • 기간: 1분
    • 조건
      • 임계값: 50
  2. 작업 구성
    • 알림
      • 경보 상태
      • SNS 주체 선택: 기존 SNS 주제 선택(mission-sns)
  3. 이름 및 설명 추가
    • 이름: mission-cpu-alarm

CPU 부하 테스트로 알람 발생 유도

  1. bastion instance에 stress 설치
  2. stress 실행 - 5분 동안 cpu 99.9% 사용
1
2
sudo yum install -y stress
stress --cpu 2 --timeout 300 # CPU 코어 2개를 5분 동안 계속 태운다

Slack 메신저 수신 확인

  1. 알람 발생 확인: CloudWatch > 경보 > mission-cpu-alarm

alt text

  1. Slack 메신저 수신 확인

alt text

9. KMS 키 삭제

KMS 키 보관 비용 발생 방지 위해 키 비활성화 및 삭제

  1. KMS > 고객 관리형 키 > mission-kms-key 선택 > 키 작업 > 키 삭제 예약
  2. 대기 시간: 7 > ‘7일의 대기 기간 이후에 이러한 키의 삭제를 예약할 것인지 확인합니다’에 체크 > 삭제 예약
This post is licensed under CC BY 4.0 by the author.