회사에서는 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 가 동작하지 않으니 빼고 하자.. )

이렇게 완성할 수 있다!!
'IT' 카테고리의 다른 글
[단축 URL] Recut 사용해보기 (0) | 2023.08.30 |
---|---|
[도커] 윈도우 설치 시 만나던 WSL2 incomplete (0) | 2022.10.20 |
[AWS/EC2] aws ec2 linux puppeteer 설치 및 한글 폰트 적용하기 (0) | 2021.09.03 |