대기업 IT현직자와 함께 클라우드 AWS 구축부터 운영까지 실무 AtoZ 리뷰 (4주차) (마지막)
4주차의 핵심목표는
CloudWatch → Slack 알람을 전송하는 것 입니다.
상세히 설명하면
CloudWatch에서 알람 발생 → SNS 푸시 서비스 호출 → Lambda 함수 트리거 → 연동된 Slack 채널로 알람 전송
1. Slack - 채널 기반 메시징 플랫폼입니다.
2. CloudWatch - AWS 리소스 및 실시간 실행중인 어플리케이션 모니터링 서비스.
3. SNS - (Publisher ↔ Subscriber) 간 통신 채널. 지원되는 프로토콜을 이용해 클라이언트에 메시지 발송합니다.
4. Lambda – (서버리스 컴퓨팅 서비스).
AWS Lambda는 서버를 프로비저닝 또는 관리하지 않고도 실제로 모든 유형의 애플리케이션 또는 백엔드 서비스에 대한 코드를 실행할 수 있는 이벤트 중심의 서버리스 컴퓨팅 서비스입니다
5. KMS - 데이터 암호화에서 사용되는 암호화 키. 인터넷 전송 시 암호화 통신에 사용합니다.
Web hook에 대해서 미리 위키설명을 대신 전달해드리면
(
웹훅은 웹 개발에서 사용자 정의 콜백을 사용하여 웹 페이지 또는 웹 애플리케이션의 동작을 강화하거나 변경하는 방법이다. 이러한 콜백은 원래 웹사이트나 애플리케이션과 반드시 관련이 없을 수도 있는 제3자 사용자 및 개발자에 의해 유지, 수정 및 관리될 수 있다. 위키백과)
슬랙은 개발자 분들이면 많이 사용하셨을거라 생각합니다.
저또한 서울42 라피신을 진행하면서 사용하였는데요.
과제에서는 프리 요금제로 채널을 개설하여 실습하였습니다.
-
슬랙 채널을 개설후 - 앱에서 수신 Web hook을 채널에 추가해주었습니다.
웹후크 url 복사 해주시고 보관해주세요! (키 암호화에 사용합니다)
.cURL 복사해서 인스턴스 세션에 복붙하셔서 슬랙 메세지를 수신 확인해주세요 .
이제 수신을 위해
SNS 토픽 생성을 하겠습니다.
SNS > 주제 > 주제 생성
바로 Lambda함수를 생성 해주겠습니다.
1. lambda > 함수생성
2. 블루프린트 사용 > slack 검색 > Cloudwatch-alarm-to-slack-python 선택
코딩/프로그래밍 부트캠프가 아니기 때문에 블루프린트 에서 샘플코드를 사용합니다.
SNS 트리거 - 만든 sns 선택 - 트리거 활성화
- slackChannel : (Slack 워크스페이스의 채널명으로 설정해주세요)
- kmsEncryptedHookUrl : (KMS 키 암호화 전이므로 임의의 문자열)
KMS
( 데이터를 암호화하는 데 사용되는 암호화 키인 고객 마스터 키 관리)
Lambda 함수 트리거 → 연동된 Slack 채널로 알람 전송
에서 Lambda함수에서 Slack으로 메시지 전송할 때 KMS로 web hook을 암호화 합니다.
1. KMS 키를 생성 해줍니다.
aws kms create-key --region (지역)
2. KMS > 고객 관리형 키 > 키 생성 확인
이어서
1. 키 별칭을 생성 해줍니다.
aws kms create-alias --alias-name alias/(키별칭) --target-key-id (키id) --region(지역)
2. KMS > 고객 관리형 키 > 키 별칭 생성 확인
KMS 키를 암호화 해줍니다.
AWS CLI version 마다 명령어가 다르니 AWS CLI version을 확인해줍니다.
Lambda 함수 환경 변수 추가를 해줍니다.
Lambda함수 > mission-lambda > 구성> 환경변수 > 편집
- 암호화 구성 : 고객 마스터키를 사용합니다
- 고객 마스터 키 : (생성한 KMS 키를 사용 합니다)
. Lambda 함수 생성하면서 기본 생성된 Role은 AWSLambdaBasicExecutionRole 정책만 존재하기 때문에
kmsEncryptedHookUrl Decrypt를 위해 IAM Role에 kms:Decrypt Policy 추가합니다.
1. IAM > 정책 > 정책 생성
2. JSON > Policy 복사 > KMS key ARN 추가
3. 정책 이름 >정책 검토
4. Lambda > (생성한 Lambda ) > 구성 > 권한 > 역할 이름 클릭
5. 정책 연결 > (생성한 정책)선택 > 정책 연결 과정입니다.
준비가 다 되었으니
Lambda 함수 실행 테스트 케이스를 작성하여 Slack 메신저 수신 확인해보겠습니다.
테스트 케이스 코드입니다.
aws-lambda/cloudwatch-alarm-to-slack/test-event.json at master · blueimp/aws-lambda · GitHub
aws-lambda/cloudwatch-alarm-to-slack/test-event.json at master · blueimp/aws-lambda
Collection of functions for AWS Lambda. Contribute to blueimp/aws-lambda development by creating an account on GitHub.
github.com
{
"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": {}
}
}
]
}
저같은 경우엔 테스트를 진행하였을때 작업시간이 초과되는 에러가 발생해 작업시간을 늘려주는 설정을 추가로 하였습니다.
테스트 메신저가 채널에 잘 수신되었습니다.
마지막으로 CloudWatch 알람 설정과 CPU 부하 테스트를 하였습니다.
CloudWatch CPU 임계치 50%인 알람을 생성하겠습니다.
CloudWatch > 경보 > 경보 생성 > 지표 선택 > EC2 > 인스턴스별 지표 > CPU Utilization,(생성한) 인스턴스 선택
지표 및 조건 지정 [지표] - 통계 : Average - 기간 : 1분 [조건] - 임계값 : 50
작업 구성 [알림] - 경보 상태 - SNS 주제 선택 : 기존 SNS 주제 선택(생성한 sns 주제 선택)
이름 및 설명 추가
생성하였던 bastion 인스턴스에
sudo yum install -y stress // 명령어를 통해 stress 설치한 후
stress –cpu 1 –timeout 300 // 명령어를 통해 5분 동안 cpu 99.9% 사용하였습니다.
알람 발생 확인 CloudWatch > 경보 > (생성한 알람) > Slack 메신저 수신 확인
채널에 알람이 잘 수신되었습니다.
KMS 키는 보관 비용 발생하기 때문에 방지를 위해 키 비활성화 및 삭제를 진행하였습니다.
KMS > 고객 관리형 키 > mission-kms-key 선택 >키 작업 > 키 삭제 예약
대기시간은 최소시간인 7일로 설정해주었습니다.
이상으로 모든 실습과제가 끝났습니다.
전체적인 소감은 1주차때 다 말해 따로 말할것이 많지는 않지만
여러 기능을 사용하고 통신구조와 전체적인 설계를 해보는데 많은 도움이 되었습니다.
다음엔 AWS SCS C02 취득을 위한 보안공부와
개인프로젝트 진행으로 찾아뵙겠습니다.