Spring Boot 프로젝트와 슬랙 알림 연동

Jung·2022년 1월 3일
1

TIL

목록 보기
73/77
post-thumbnail

슬랙 웹훅 URL

우선 채널을 생성한다.

생성했으면

채널의 세부정보 열기를 클릭한다.

Incoming WebHooks 보기 -> 구성 -> Slack에 추가

test 채널에 추가한다.

웹후크 URL을 확인할 수 있다.

채널에도 추가된 것을 확인할 수 있다.

POSTMAN에서 웹후크 URL로 POST 요청을 보내보자

Request Body에

{
    "text": "테스트입니다."
}

라는 테스트 JSON 데이터를 보내보자

그러면 Request Body에 적었던 텍스트가 슬랙 채널에 전송이 된 것을 확인할 수 있다.

Spring Boot 설정

build.gradle에

implementation 'com.github.maricn:logback-slack-appender:1.4.0'

slack-appender를 추가한다.

application.properties에 웹훅 URL은 배포 시 노출되면 안 되므로 환경변수로 설정한다.

logging.slack.webhook-uri: ${SLACK_WEBHOOK_URI}
logging.slack.config: classpath:logback-slack.xml

슬랙 설정에 대한 파일은 logback-slack.xml로 지정했으니 파일을 하나 생성하자

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <springProperty name="SLACK_WEBHOOK_URI" source="logging.slack.webhook-uri"/>
    <appender name="SLACK" class="com.github.maricn.logback.SlackAppender">
        <webhookUri>${SLACK_WEBHOOK_URI}</webhookUri>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %msg %n</pattern>
        </layout>
        <username>Cake-Server-log</username>
        <iconEmoji>:stuck_out_tongue_winking_eye:</iconEmoji>
        <colorCoding>true</colorCoding>
    </appender>


    <!-- Console appender 설정 -->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %green(%-5level) %logger{35}  %cyan(%logger{15}) -  %msg  %n</pattern>
        </encoder>
    </appender>

    <appender name="ASYNC_SLACK" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="SLACK"/>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <root level="INFO">
        <appender-ref ref="Console" />
        <appender-ref ref="ASYNC_SLACK"/>
    </root>
</configuration>

로그 레벨을 Error로 설정했다. 서버에 찍히는 Error 로그가 슬랙 채널에서도 알림이 오기 때문에 확인할 수 있다.

AWS EB에 배포가 되어 있다는 가정 하에 적으려고 한다.

해당 EB 환경에서 발생하는 중요한 이벤트에 대한 이메일 알림을 수신하고 싶다면 이곳에 이메일을 적는다.

여기에 적었다면 Amazon SNS - 주제에 추가된다.

그리고 logback-slack.xml에 넣었던 ${SLACK_WEBHOOK_URI}에 대한 환경 변수를 EB 구성 - 소프트웨어 - 환경 변수에 추가한다.

이제 AWS Lambda 함수를 생성해보자

블루프린트 사용 -> slack-echo-command-python 선택한다.

함수 이름을 정한다.

API 게이트웨이 트리거는 삭제한다.

API 게이트웨이는 클라이언트와 백엔드 서비스 컬렉션 사이에 위치하는 API 관리 툴이다.
API 게이트웨이는 모든 애플리케이션 프로그래밍 인터페이스(Application Programming Interface, API) 호출을 수락하고 호출 이행에 필요한 다양한 서비스를 집계하며 적절한 결과를 반환하는 리버스 프록시 역할을 한다.

환경 변수를 설정한다.

Lambda 함수의 코드를 변경한다.

import boto3
import json
import logging
import os

from base64 import b64decode
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError



SLACK_CHANNEL = os.environ['slackChannel']
HOOK_URL = os.environ['hookUrl']

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def lambda_handler(event, context):
    logger.info("Event: " + str(event))
    message = str(event['Records'][0]['Sns']['Message'])

    slack_message = {
        'channel': SLACK_CHANNEL,
        'text': message
    }

    req = Request(HOOK_URL, json.dumps(slack_message).encode('utf-8'))
    try:
        response = urlopen(req)
        response.read()
        logger.info("Message posted to %s", slack_message['channel'])
    except HTTPError as e:
        logger.error("Request failed: %d %s", e.code, e.reason)
    except URLError as e:
        logger.error("Server connection failed: %s", e.reason)

트리거 추가를 눌러 SNS를 추가한다.

이메일 알림이 필요없으면 구독에서 삭제하면 된다.

마지막으로 EB 구성의 환경 변수에 슬랙 웹훅에 대한 환경 변수를 추가하면 된다.

profile
97kim.github.io

0개의 댓글