본문 바로가기
[AWS]/ROG

[AWS] [활용] CloudWatch & SNS & Chatbot & 슬랙(Slack) 연동

by SAMSUNG CLOUD-OKY 2022. 3. 18.
반응형

 

## 연동구조

Cloudwatch --> SNS --> Chatbot --> Slack 

 

 

 

AWS Chatbot은 Amazon Chime, 슬랙과 연동하여 업무 자동화를 구현할 수 있는 서비스이며 최근에 GA(General Available) 되었습니다. 슬랙이 지원하는 Webhook API를 람다(Lambda) 등을 사용하여 구현하는 것보다 훨씬 쉽고 간단하게 슬랙과 연동할 수 있습니다.

슬랙(Slack)은 Microsoft Teams와 더불어 협업 메시징 도구로 가장 많이 사용하는 소프트웨어입니다. 비단 채팅뿐만 아니라 오디오/비디오 대화, 파일 전송, 다양한 채널을 통한 인터랙션 등이 장점입니다.

사람과 사람 간의 통신뿐만 아니라 API를 제공하는 다양한 도구에 접근할 수 있습니다. 즉 슬랙과 같은 협업 메시징 도구 자체가 API 클라이언트가 되어 사람과 대화하듯 원하는 명령을 채팅으로 수행하고 그 결과를 받아볼 수 있습니다. 단순 API뿐만 아니라 시스템의 증설과 업데이트, 운영 관리 등을 챗을 통해 수행하는 것을 Chat을 통한 운영(operation)이라는 뜻에서 ChatOps라 부릅니다. 슬랙이 기업의 메시징 시장에서 각광 봤다 보니 많은 클라우드, SaaS 서비스들이 슬랙을 ChatOps 도구로서 지원하고 있습니다.

이번 글에서는 AWS Chatbot을 슬랙과 연결하여 AWS CLI 명령문을 슬랙에서 실행하면서 AWS 인스턴스 상태 확인 및 람다(Lambda) 함수를 실행하고 경보(Alarm)도 슬랙으로 받아볼 수 있는 기능을 설정해보도록 하겠습니다. 전체적은 서비스 흐름은 아래와 같이 심플합니다.

<AWS Chatbot을 통한 슬랙과 AWS 서비스의 연결, Pic. from https://aws.amazon.com/ko/chatbot/>

먼저 AWS 관리 콘솔로 로그인하여 AWS Chatbot 서비스를 선택합니다.

<AWS Chatbot 선택>

새 클라이언트 구성에서 Slack을 선택합니다. Amazon Chime은 Amazon에서 만든 메시징 서비스입니다.

<AWS Chatbot 클라이언트 선택>

AWS 관리 콘솔은 OAuth 2.0 방식으로 현재 브라우저 사용자의 슬랙 계정을 액세스합니다. 아래 이미지 상단 우측에 AWS Chatbot과 연결할 기존의 슬랙 Workspace를 선택하고(예제에선 "Techtrip"), 해당 워크 스페이스에 대한 AWS의 접속 권한을 승인합니다.

<OAuth2.0을 사용하여 슬랙 계정에 접근>

AWS Chatbot 클라이언트가 구성되었습니다. 이제 슬랙에서 알림을 보내려면 먼저 AWS Chatbot이 사용할 슬랙의 채널(Channel)을 구성해야 합니다. 채널이란 카톡의 단체 대화방처럼 슬랙에서 대화를 원하는 사용자끼리 모인 공간을 의미합니다. "구성된 채널"에서 "새 채널 구성"을 선택합니다.

<구성된 클라이언트 확인>

"aws-chat"이라는 이름으로 구성(configuration) 이름을 만들고, 모든 로그는 Amazon CloudWatch Logs에 기록하도록 설정합니다. Chatbot과 연동할 기존의 슬랙 채널을 선택합니다. 만약 채널이 프라이빗이라면 해당 채널의 ID 혹은 URL 주소를 입력해야 합니다.

<AWS Chatbot을 사용할 슬랙 채널 구성하기>

AWS Chatbot이 사용자의 명령문을 실행하려면 AWS 리소스에 접근을 해야 하니, 이에 대한 IAM 역할을 만들 차례입니다. awschat-role이라는 이름으로 역할을 만들고 정책 템플릿을 사용합니다. 하나 이상의 정책 템플릿을 선택하면 AWS Chatbot이 자동으로 역할을 생성합니다. 예제에서는 현재 Chatbot이 지원하는 4개의 정책을 모두 선택하였습니다.

<IAM 설정>

다음은 알림 선택 사항입니다. Amazon SNS(Simple Notification Service)는 알림(Notification)을 이메일, SMS, Push notification 등으로 전달해 주는 서비스인데 기존에 설정한 SNS가 있다면 선택합니다. SNS가 실행되면 해당 메시지를 슬랙을 통해 받을 수 있습니다.

<SNS 토픽으로 알림 설정>

이제 모든 슬랙 채널 구성이 AWS 관리 콘솔에서 완료되었습니다. 완료된 모습은 다음과 같습니다.

<구성이 완료된 채널 확인>


AWS가 아닌 슬랙에서 테스트할 내용입니다. 설정한 내용을 테스트하기 위해 슬랙으로 이동합니다.

/invite @aws 명령으로 AWS Chatbot을 채널에 초대합니다. 초대가 정상적으로 수행되면, 채널에 사용자가 1명 증가했음을 알 수 있습니다.

만약 이미 chatbot이 등록된 상태에서 또 다른 AWS 어카운트 Chatbot을 동일한 슬랙 채널에 입장시키려 하면, 두 개의 어카운트 중 기본 어카운트를 골라야 한다는 메시지를 보게 됩니다. 즉, 복수의 AWS 어카운트를 하나의 슬랙 채널에서 동시에 지원할 수 없습니다. 기본 어카운트를 선택하면 그 어카운트는 7일 동안 기본적으로 사용됩니다. 그렇지만 중도에 어카운트 교체는 @aws set default-account [어카운트 ID] 명령으로 언제든 가능합니다.

<기본 어카운트 선택 화면>

1. 기본적인 AWS 명령 수행하기

@aws help 명령으로 Chatbot이 어떤 기능을 할 수 있는지를 확인합니다. 슬랙에서 AWS Chatbot을 통한 명령 수행은 @aws로 시작하며, 마치 단체 대화방이나 소셜 네트워킹 서비스에서 특정 상대에게 대화하듯 메시지를 전달합니다.

간단한 명령으로 서울 리전의 가용 영역을 슬랙에서 확인해봅니다.

@aws ec2 describe-availability-zones --region ap-northeast-2

특정 리전에서 구동 중인 특정 EC2 인스턴스의 상태를 확인해봅니다. 리전 값 파라미터는 직전에 사용한 명령문의 리전 값과 같다면 생략 가능합니다.

@aws describe-instance-status --instance-ids [인스턴스 ID]

2. CloudWatch를 통한 경보 확인하기

CloudWatch 명령을 통해 혹시 발생한 경보(Alarm)이 있는지 확인합니다. 아직 AWS에서 경보를 설정하지 않은 상태라면, 아무런 내용이 조회되지 않습니다.

@aws cloudwatch describe-alarms

만약 알람 테스트를 하고 싶다면, 테스트를 위해 경보를 하나 생성합니다. 예제에선 "High CPU Utilization"라는 이름의 알람(경보)를, 계정이 보유한 EC2 인스턴스의 모니터링 메뉴에서 생성했습니다. 테스트를 위해 단순하게 CPU 사용률이 조금만 커도 경보를 발생하게 설정하였습니다.

<AWS 경보 생성하기>

다시 동일한 명령을 실행하면 경보 관련 내용을 보여줍니다. 좀 더 명확한 알람을 보고 싶다면 EC2 인스턴스에 부하를 좀 줘야 합니다.

<CloudWatch 명령으로 확인한 경보 내역-1>

설정한 알람 내역의 그래프도 슬랙 대화상에서 직접 제공됩니다. 아래 이미지에서 파란색의 링크를 클릭하면 확대된 그래프를 이미지로 볼 수 있습니다. URL를 보면, 이미지의 저장 위치는 AWS가 사전에 준비한 Chatbot 전용 S3 버킷으로 보입니다.

<CloudWatch 명령으로 확인한 경보 내역-2>

 

 

3. Amazon SNS(Simple Notification Service) 알림을 슬랙으로 받기

경보가 발생하고 그 경보 설정 시에 설정한 SNS가 AWS 콘솔에서 슬랙 채널 생성 시 옵션으로 설정한 "매핑된 SNS 주제"에 속한다면 슬랙에서 알림을 받을 수 있습니다.

지금까지는 슬랙에서 먼저 AWS CLI 명령을 수행하고 결과를 받았지만, SNS의 경우 AWS Chatbot이 해당 주제의 내용을 보내줍니다. 상단의 링크를 클릭하면 AWS 콘솔 - CloudWatch로 연결되어 상세 내용을 확인할 수 있습니다.

DevOps 혹은 SRE 팀 채널 등, AWS 운영을 담당하는 팀원들이 같이 모여있는 채널에서 사용하면 유용하겠죠. (경험 상, Alarm이 너무 자주 오면 무뎌지니, 실질적인 임계치 설정이 필요합니다;;)

<Amazon SNS를 통해 전달받은 경보 내용>

 

 

 

 

4. 람다(Lambda) 함수 호출하기

이번에는 미리 AWS에 있는 람다(Lambda) 함수를 실행(invoke) 해봅니다. 람다 함수의 경우 Chatbot이 수행 여부를 확인 차원에서 Yes/No 값으로 한 번 더 물어봅니다. 다양한 기능을 람다에서 서버리스 애플리케이션으로 만들어두고, 슬랙에서 간단하게 수행하여 결괏값을 확인하는 것도 좋을 듯합니다.

@aws lambda invoke --function-name mySimpleFunction --payload {"key1": "value1", "key2": "value2", "key3": "value3"}

5. 지원 케이스(Support Case) 생성하기

AWS 사용 중에 문제가 있거나, 문의가 있어 지원 케이스를 여는 것을 슬랙에서 할 수 있습니다.

먼저, @aws support create-case 명령을 실행하면, 제목을 입력하라는 응답과 기타 옵션을 알려줍니다.

나머지 옵션까지 모두 넣고 실행하면 정말 케이스를 만들지를 Yes/No로 확인합니다. 실제로 케이스를 생성하려면 Support Subscription이 있어야 합니다.

6. 기타 Tip

아직까지 슬랙과 AWS Chatbot 연동을 사용한 명령은, 주로 "읽기" 관련 작업이고 AWS에 리소스를 만들거나 기존 리소스를 삭제, 수정하는 등의 "쓰기" 작업을 실행하면 해당 명령은 Enable 되어있지 않음을 알려줍니다.

만약 Chatbot이 해석하지 못하는, 등록되지 않은 명령을 실행하면 못 알아듣겠다는(?) 안내와 함께 실행 가능한 명령에 대해 리스트로 친절히 알려줍니다.

만약 정책에 없는 명령을 실행하고 싶다면 AWS Chatbot 대신, 슬랙과 AWS 중간에 직접 AWS API 혹은 CLI를 호출하는 에이전트 역할의 서비스를 만들면 가능하겠죠.

먼저 다양한 AWS 명령문을 AWS Chatbot으로 실행해본 후 별도의 에이전트를 구현해보면 어떨까요? 비단 AWS 명령뿐만 아니라, 운영 중인 사내 레거시 서비스 혹은 클라우드 기반의 서비스를 대상으로 ChatOps를 구현해보는 것도 재미있을 것 같네요.

이상으로 포스팅을 마칩니다.

참고한 원문: https://aws.amazon.com/ko/blogs/devops/running-aws-commands-from-slack-using-aws-chatbot/

AWS Chatbot https://aws.amazon.com/ko/chatbot/

AWS CLI for Slack 명령문: https://docs.aws.amazon.com/chatbot/latest/adminguide/chatbot-cli-commands.html

Slack Blog: https://slackhq.com/aws-chatbot-bring-aws-into-your-slack-channel

또 다른 방법:

WebHook을 사용한 AWS와 슬랙의 연동

Slack의 슬래시(/) 명령으로 AWS 람다 실행하기

 

 

 

 

출처 : 

https://blog.naver.com/sehyunfa/221924899955

반응형

댓글