과제4. cloudwatch에서 slack으로 알람 전송
과제4. cloudwatch에서 slack으로 알람 전송
실습과제
- 주제: CloudWatch -> Slack 알람 전송
- CloudWatch를 통해 실시간으로 AWS 자원을 모니터링합니다.
- CloudWatch에서 설정한 알람이 “정상 -> 경보” 상태로 변경되면 연결된 Slack 채널로 알람이 전송되어 24*365 관제할 수 있습니다.
1)CloudWatch 알람 전송
2)Slack으로 알람 전송
1. 시스템 구성
CloudWatch -> Slack 알람 전송
- CloudWatch를 통해 실시간으로 AWS 자원을 모니터링합니다.
- CloudWatch에서 설정한 알람이 “정상 -> 경보” 상태로 변경되면 연결된 Slack 채널로 알람이 전송되어 24*365 관제할 수 있습니다.
시스템 구성
CloudWatch에서 알람 발생 -> SNS 푸시 서비스 호출 -> Lambda 함수 트리거 -> 연동된 Slack 채널로 알람 전송
- Slack - 채널 기반 메시징 플랫폼. Channel 고유의 WebHook url을 통해 알람 수신
- CloudWatch - Aws 리소스 및 실행중인 어플리케이션 모니터링
- SNS - Publisher <-> Subscriber 간 통신 채널. 지원되는 프로토콜을 이용해 클라이언트에 메시지 발송
- Lambda - 서버리스 컴퓨팅 서비스. 서버를 관리하지 않아도 코드를 실행할 수 있게 하는 컴퓨팅 서비스
- KMS - 데이터 암호화에서 사용되는 암호화 키. 인터넷 전송 시 암호화 통신에 이용
2. Slack 설정
Slack 이란?
- 협업 메신저 툴
- 채널 기반 메시징 플랫폼
- 최초 회원가입 없이 WorkSpace 별 계정 사용
- Workspace 내에 Project 채널생성 -> Webhook을 이용해 CloudWatch 알람 수신
- 채널 - Workspace 내의 채팅 방. 채널 별로 계정 view 권한 제한 가능
Web hook 이란?
- 서버에서 이벤트가 발생했을 때 클라이언트를 호출하는 메커니즘 제공
- 외부 시스템에서 Slack으로 post message 발송
- 외부 시스템에서 이벤트 발생 -> 클라이언트에서 제공하는 webhook Trigger -> Action 수행(슬랙 채널에 메세지 발송) Webhook 내부에서 슬랙의 Webhook endpoint로 post 요청
로그인 & 워크스페이스 생성
Web hook 설정
- 워크스페이스 > 설정 및 관리 > 앱 관리 > 앱
- web hook 검색 > 수신 웹후크 slack 추가
3. SNS 토픽 생성
SNS란?
- 메시지 브로커
- 구독 중인 클라이언트에 메시지 전달을 조정 및 관리
- Publisher - 게시자. 이벤트 생산 (여기선 CloudWatch)
- Subscriber - 구독자. 이벤트 구독(ex. Lambda, SQS, Http/s, Email, SMS)
- CloudWatch에서 알람 발생 -> SNS 푸시 서비스 호출 -> Lambda 함수 트리거 -> 연동된 Slack 채널로 알람 전송
SNS 토픽 생성
- SNS > 주제 > 주제 생성
- 주제 이름 - mission-sns > 주제 생성
4. Lambda 함수 생성
Lambda란?
- 서버리스 컴퓨팅 서비스
- 애플리케이션을 실행하기 위한 별도의 서버 셋업 없이 곧바로 코드를 실행해주는 서비스
- 고정 비용 없이 사용 시간에 대해서만 비용
- CloudWatch에서 알람 발생 -> SNS 푸시 서비스 호출 -> Lambda 함수 트리거 -> 연동된 Slack 채널로 알람 전송
Lambda 함수 생성
! 블루프린트를 이용해 람다함수 생성
- Lambda > 함수 생성
- 블루프린트 사용 > Slack 검색 > CloudWatch-alarm-to-slack-python 선택
- 기본 정보
- 함수 이름: mission-lambda
- 실행 역할: 기본 Lambda 권한을 가진 역할 생성
- SNS 트리거
- mission-sns 선택
- 트리거 활성화
- 환경 변수
- slackChannel: project(Slack 워크스페이스의 채널명)
- kmsEncryptedHookUrl: test(KMS 키 암호화 전이므로 임의의 문자열)
5. KMS 키 설정
KMS(Key Management Service)란?
- 데이터를 암호화하는데 사용되는 암호화 키인 고객 마스터 키(CMKs)관리
- lambda함수에서 Slack으로 메시지 전송할 때 web hook 암호화
- CloudWatch에서 알람 발생 -> SNS 푸시 서비스 호출 -> Lambda 함수 트리거 —(KMS로 web hook 암호화) –> 연동된 Slack 채널로 알람 전송
KMS 키 생성
- KMS 키 생성
- KMS > 고객 관리형 키 > 키 생성 확인
1
aws kms create-key --region ap-northeast-2
KMS 키 별칭 생성
- 키 별칭 생성
- KMS > 고객 관리형 키 > 키 별칭 생성 확인
1
aws kms create-alias --alias-name alias/mission-kms-key --target-key-id fcb1da54-8f63-4339-b697-0c67fc9fe5f6 --region ap-northeast-2
키 암호화
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 옵션 필요
- 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
- Lambda 함수 > mission-lamda > 구성 > 환경변수 > 편집
- kmsEncryptedHookUrl: KMS 키 암호화 후 CiphertextBlob 값
- 암호화 구성: 고객 마스터키 사용
- 고객 마스터 키: mission-kms-key(생성한 KMS 키 사용)
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.”
- IMA > 정책 > 정책 생성
- 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>"
]
}
]
}
정책 이름 - AwsLambdaKmsExcutionPolicy > 정책 검토
- Lambda > mission-lambda > 구성 > 권한 > 역할 이름 클릭
- 정책 연결 > AwsLambdaKmsExcutionPolicy 선택 > 정책 연결
7. 테스트
Test Event로 Slack 연동 확인
Lambda 함수 실행 테스트 케이스 작성하여 Slack 메신저 수신 확인
- 테스트 이벤트 작성:
테스트 > 새 이벤트 > 이벤트 이름: 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": {}
}
}
]
}
- 호출 > Slack 테스트 메신저 수신 확인(Slack 메신저)
8. Cloudwatch 알람 생성
CloudWatch 란?
- AWS 리소스 모니터링 서비스
- 알림 기능
- 자원 사용량 임계치 초과했을 때 알람 발생
ex) EC2, RDS, ElastiCache, EBS 등 자원의 사용량 모니터링
- 자원 사용량 임계치 초과했을 때 알람 발생
- 로그 수집 기능
- 자원에서 발생하는 로그 수집(VPC Flowslog 등)
- 로그 분석과 시각화
- 대시보드 기능
- Metric를 생성하여 대시보드 생성 가능
ex) CPU Utilization, StatusCheckFail, DiskWriteIOPS 등
- Metric를 생성하여 대시보드 생성 가능
CloudWatch 알람 설정과 CPU 부하 테스트
- CPU 임계치 50%인 알람 생성
- CPU 부하 테스트로 알람 발생 유도
- Slack 메신저 수신 확인
CloudWatch CPU 임계치 50%인 알람 생성
1분 동안 bastion instance의 CPU 사용률 50% 1회 이상 발생하면 알람 발생하는 알람 생성
- CloudWatch > 경보 > 경보 생성
- 지표 선택 > EC2 > 인스턴스별 지표 > CPU Utilization, bastion 인스턴스 선택
- 지표 및 조건 지정
- 지표
- 통계: Average
- 기간: 1분
- 조건
- 임계값: 50
- 지표
- 작업 구성
- 알림
- 경보 상태
- SNS 주체 선택: 기존 SNS 주제 선택(mission-sns)
- 알림
- 이름 및 설명 추가
- 이름: mission-cpu-alarm
CPU 부하 테스트로 알람 발생 유도
- bastion instance에 stress 설치
- stress 실행 - 5분 동안 cpu 99.9% 사용
1
2
sudo yum install -y stress
stress --cpu 2 --timeout 300 # CPU 코어 2개를 5분 동안 계속 태운다
Slack 메신저 수신 확인
- 알람 발생 확인: CloudWatch > 경보 > mission-cpu-alarm
- Slack 메신저 수신 확인
9. KMS 키 삭제
KMS 키 보관 비용 발생 방지 위해 키 비활성화 및 삭제
- KMS > 고객 관리형 키 > mission-kms-key 선택 > 키 작업 > 키 삭제 예약
- 대기 시간: 7 > ‘7일의 대기 기간 이후에 이러한 키의 삭제를 예약할 것인지 확인합니다’에 체크 > 삭제 예약
This post is licensed under CC BY 4.0 by the author.





















