ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 슬랙 토큰을 이용해서 알람봇 연동하기
    개발공부/JAVA 2023. 8. 4. 10:55

    회사에서 새로운 서버로 프로젝트 셋팅하는 작업을 진행 중인데 전환하는 과도기 기간 동안

    연동 시 문제가 생기면 알람을 받을 수 있도록 해놓으면 좋을 것 같아 찾아보던 중 슬랙 토큰을 이용한 알람봇 연동하는게 있었다

     

    슬랙 알람봇 연동방법은 웹토큰만 있는게 아니라 웹훅도 있는데 회사에서 사용하는 슬랙은 무료판(...)이라 웹훅 사용에 제한이 있어

    웹토큰을 이용하여 진행했다

     

    검색하면 다른 블로그에도 잘 정리되어 있지만 오랜만에 글을 쓸 겸 정리해두는게 좋아서 작성해본다


    01. 슬랙 chat bot 생성

     

     

     

     

     

     

     

     

    • From scratch 클릭

     

     

     

     

     

     

     

     

    • app 이름 생성 및 workspace 지정

     

     

     

     

     

     

     

     

     

     

     

    02. 생성한 app에 권한 부여

     

     

    • 좌측 OAuto & Permissions 클릭

    권한(Authentication) 관련 API 문서

    https://api.slack.com/authentication

     

     

     

     

     

     

     

    • Scopes 항목 이동하여 권한 부여
      • channels:read → 워크스페이스의 public 채널에 대한 정보 보기
      • chat:write → SlackApi로 message 발송

    #Scopes 권한

    슬랙 채널에 메시지를 보내기 위해서는 chat:write는 반드시 추가해야함 !!

    ※ 참고

    슬랙 채널을 private로 설정한 경우 groups:read Scope를 추가적으로 설정해야함

     

    03. OAuth Tokens을 발급

     

    ※슬랙 토큰은 알람봇의 인증키로 사용될 용도니 반드시 외부로 노출해서는 안되고 개인보관을 해야함

    Slack의 Bot Token은 xoxb- 형식

     

     

     

     

     

    04. 알람봇 생성함

     

    생성하면 모자이크 처리된 부분에 토큰이 생성되는데 개인이 잘 저장해야함

     

     

     

     

     

     

     

     

    05. 채널에 생성한 앱 추가

    알람받을 채널을 클릭

    통합 > 앱 > 앱추가 생성한 APP 추가

     

     

     

     

     

     

     

     

     

     

     

     


    06. 알람 설정 받을 채널 ID 값 얻기

    • 빨간박스 : 발급받은 토큰 (xoxb로 시작하는~) 입력
    • 노란박스 : 버튼 클릭하여 슬랙의 정보 확인

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    해당 워크스페이스에 존재하는 모든 채널들이 다 나오는데

    내가 알람받을 채널의 채널ID 하여 기억해두기

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    07. chat API 테스트 호출

     

    토큰 및 채널ID (필수값) 및 테스트할 문자 입력해서 채널에 전송

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    슬랙 채널 내 수신된 메세지

    08. 알람 연동 로직

    #pom.xml 의존성 추가

    <!-- slack bot -->
    <dependency>
        <groupId>com.slack.api</groupId>
        <artifactId>slack-api-client</artifactId>
        <version>1.20.2</version>
    </dependency>

     

    #systemproperties에 슬랙 정보 추가

    #slack 알람봇 정보
    slack.token=xoxb형식의 발급받은 토큰정보
    slack.channel=C0로 시작하는 채널 ID

    #java 연동 소스

    @Slf4j
    @Service
    public class SlackService {
     
        @Value("${slack.token}")
        private String SLACK_TOKEN; //전송 토큰
     
        @Value("${slack.channel}")
        private String SLACK_CHANNEL; //전송 채널
     
        /**
         * 슬랙채널로 메시지 전송
         * @param msg 전송메시지
         */
        public void sendSlackMessage(String msg) throws Exception {
     
            Slack slack = Slack.getInstance();
            MethodsClient methods = slack.methods(SLACK_TOKEN);
     
            try {
     
                if (StringUtils.isEmpty(msg)) {
                    log.info("sendSlackMessage >> !! 수신된 메세지 없음 : {}", msg);
                    msg = "";
                }
     
                //슬랙 메세지 셋팅
                StringBuffer msgError = new StringBuffer();
                msgError.append("**** ExceptionError 입니다  ****\n\n");
                msgError.append("###서버IP : ");
                msgError.append(getIp());
                msgError.append("\n");
                msgError.append("###수신 전문 : ");
                msgError.append(msg);
                msgError.append("\n");
     
                //슬랙 메세지 전송
                ChatPostMessageRequest request = ChatPostMessageRequest.builder()
                        .channel(SLACK_CHANNEL)
                        .text(msgError.toString())
                        .build();
     
                ChatPostMessageResponse response = methods.chatPostMessage(request);
     
            } catch (Exception e) {
                log.error("sendSlackMessage >> !! 슬랙 전송 실패 !! " + e.getMessage());
                e.printStackTrace();
            }
        }
     
        public static String getIp(){
     
            String ip = null;
     
            try {
                ip = InetAddress.getLocalHost().getHostAddress();
            } catch (UnknownHostException e) {
                log.error("getIp >> !! getIp 조회 실패 !! " + e.getMessage());
                ip = "";
            }
     
            return ip;
        }
    }

    Exception 발생 시 전송한 슬랙 메세지


    #발생할 수 있는 이슈

    01.워크스페이스 제한으로 실패

     

     

     

     

     

     

     

     

     

     

     

     

    ##해결

    슬랙 무료판의 겨우엔 10개로 제한되어있어 워크스페이에 설치된 앱을 확인하여 필요없는 앱 삭제하면 됨

    02. bot 설치 안되는 경우

    봇의 사용자를 설정하지 않아 생긴 문제

    1. Your APP
    2. 내가 만든 봇 클릭
    3. 좌측 APP Home > Add Display Name > Edit
    4. 이름 입력 후 다시 설치

    https://velog.io/@dulcis-hortus/slackbot-%EC%84%A4%EC%B9%98%ED%95%A0-%EB%B4%87-%EC%82%AC%EC%9A%A9%EC%9E%90%EA%B0%80-%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4

     

    03. 슬랙 알람 연동 테스트 시 정상적으로 수행되지 않는 경우

    invalid_auth : Key가 잘못되었거나 #2. Chatbot 생성 에서 이야기했던 Scope의 설정에 chat:write 권한이 적용되지 않았을것이다.

    not_in_channel : 입력한 ID의 채널에 해당 알림봇 App이 추가되지 않았을것이다.

    channel_not_found : 채널의 ID가 잘못되었을것이다.


    #참고 사이트

     

    '개발공부 > JAVA' 카테고리의 다른 글

    input/outputstream 활용한 PDF 다운로드  (0) 2023.02.24
    log4j / logback / log4j2 정리  (0) 2022.11.09
    [TDD] 예제 테스트 작성  (0) 2022.10.04
    [TDD] BDD 스타일의 mockito API  (0) 2022.09.28
    [TDD] Mock 객체 생성 및 구현  (0) 2022.09.26
Designed by Tistory.