AWS

대기업 IT현직자와 함께 클라우드 AWS 구축부터 운영까지 실무 AtoZ 리뷰 (4주차) (마지막)

PD i 2024. 5. 11. 12:15

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 취득을 위한 보안공부와 

개인프로젝트 진행으로 찾아뵙겠습니다.