IT

[AWS/Slack] slack 알림으로 주기적인 서버 모니터링 하기

홀롤록 2021. 8. 25. 17:34
반응형

회사에서는 AWS 서버에 빈즈톡을 사용하여 서비스를 하고 있다. 약 2년 전에 새로 만든 앱 서비스를 제공하는 서버에 트래픽이 예상치 못하게 늘어 장애로 인해 죽는 경우가 발생했었고, 이에 대해 미리 헬스체크를 계속적으로 했다면 조금 더 빠르게 대응할 수 있지 않았을까 라는 생각에 헬스체크를 위한 로직을 추가했다.

 

사용된 어플리케이션은 슬랙 웹 훅 + aws-sdk (node module) 이다.

회사에서 slack 으로 업무적 의사소통을 진행하고 있고, 메인 언어가 Node이기 때문에 이러한 스펙으로 진행했다.

 

사용한 슬랙 API 내에 있는 내용은 https://api.slack.com/reference/block-kit/blocks 이 곳에 있는 내용 + 자잘한 것들

의 내용이기에 참고하였으면 좋겠다. 슬랙 웹 훅 관련한 API 문서를 보면 다 할 수 있지만, 귀찮은건 사실인걸... 찾다보니 최신(?) 이라고 올라와있는 글도 많았고 여러 글을 보면서 이건 왜 안되지 하던 경험이 많았기에 누군가에게 도움이 됐으면 좋겠다...!!

 

1. Elastic Beanstalk 의 상태를 알아오자!!

이를 위해 aws-sdk ( node 모듈 ) 을 설치한다. 

npm install aws-sdk

위 라이브러리를 설치하고, AWS config 설정을 진행한다. ( AccessKey, SecrectKey 등 )

const aws = require('aws-sdk');

aws.config.update({
	...설정
});

// Elastic beanstalk 선언
exports.EB = new AWS.ElasticBeanstalk();

세팅을 마치고 파일을 하나 생성해서 작업해보자!!

2. slack webhook 으로 EB의 상태를 전달해보자

사용된 라이브러리는 @slack/webhook 이므로 설치를 진행한다.

npm install @slack/webhook

이후 생성한 파일에 가서 require 를 진행하고 기본 웹 훅을 설정한다.

const { IncomingWebhook } = require('@slack/webhook');

const webhook = new IncomingWebhook(웹 훅 URL)

이렇게 하면 웹 훅의 기본 설정이 끝난다. 너무 간단하다!!

혹시나 웹 훅을 모를 수 있으니 참고할만한 링크를 남겨둔다.

공식문서

 

Slack용 수신 웹후크

수신 웹후크는 외부 소스에서 워크스페이스로 정보를 공유할 수 있는 간단한 방식입니다.   이용 방법 선택한 채널로 데이터를 보냅니다. 채널의 BAD+2CB...

slack.com

그리고 유명한 개발자이시자 블로거이신 향로님의 블로그에도 글이 있어 링크를 남겨둔다.

 

3. 본격적으로 빈즈톡으로 띄워둔 인스턴스 상태를 가져오자

위 1번 사항을 통해 Elastic beanstalk 을 선언하여 다른 파일에서 가져올 수 있도록 해뒀으니 만들어진 새 파일에서 작업하자.

작업하면서 봤던 AWS API 문서도 남겨둔다.

const serverStatus = await EB.describeInstancesHealth({
	AttributeNames: ['HealthStatus', 'System', 'Color'],
    EnvironmentId: 사용하는 환경 ID ( 빈즈톡 태그를 보면 알 수 있습니다. ),
    EnvironmentName: 사용하는 환경이름 ( 빈즈톡 태그를 보면 알 수 있습니다. )
}).promise();

위 코드를 실행하면 instance 리스트와 정보가 나오는데 정보는 System만 나오게 된다. 더 많은 정보를 얻고 싶다면 위 API 링크에서 AttributeNames 배열에 들어간 값들을 확인하고 수정하자.

 

4. 상태를 가져왔으니 slack 으로 보내자!!

위 내용들을 모두 합한 내용이다. 소스를 보는 것이 가장 빠르므로 소스를 먼저 작성한다. 

const { IncomingWebhook } = require('@slack/webhook');
const EB = require('선언 위치');

const webhook = new IncomingWebhook(웹 훅 URL)

const EnvironmentId = 사용하는 환경 ID ( 빈즈톡 태그를 보면 알 수 있습니다. )
const EnvironmentName = 사용하는 환경이름 ( 빈즈톡 태그를 보면 알 수 있습니다. )

const serverStatus = await EB.describeInstancesHealth({
	AttributeNames: ['HealthStatus', 'System', 'Color'],
    EnvironmentId,
    EnvironmentName,
}).promise();

const { InstanceHealthList } = serverStatus;

const message ={
	"attachments": [
		{
			"text": " 서버 상태 체크 알림 ",
			"color": "good"
		}
	],
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": "환경이름"
			}
		},
		{
			"type": "section",
			"fields": [
				{
					"type": "plain_text",
					"text": "인스턴스 id"
				},
				{
					"type": "plain_text",
					"text": "인스턴스 상태"
				}
			]
		},
		{
			"type": "section",
			"block_id": "임의의 값(사용자 맘대로) 대신 같은 메세지에서 겹치면 안됨...",
			"fields": [
				{
					"type": "plain_text",
					"text": "instanceId"
				},
				{
					"type": "mrkdwn",
					"text": "Color=*good*\nStatus=*Ok*"
				}
			]
		}
	]
};

webhook.send(message)

데이터를 만들고, webhook 으로 쏘면 끝!!!
결과물!!  ( slack Block Kit 을 통해 실행했고, 블록킷에서는 왜인지 모르게 attachments 가 동작하지 않으니 빼고 하자.. )

이렇게 완성할 수 있다!!

반응형