슬랙에 알림을 보내기 위한 사전 준비

  1. 아래 주소에서 초록색 Create New App 버튼 클릭

    Slack API: Applications | Slack

  2. From Scratch 클릭

  3. 앱 이름(추후 변경 가능), 사용할 워크스페이스 선택

  4. 생성 후 해당 앱의 OAuth & Permissions 메뉴에서 아래와 같이 Scope 설정

Untitled

  1. OAuth Tokens for Your Workspace에서 본인 app Bot의 토큰 발급
  2. 알림을 보낼 슬랙 채널에 등록한 Bot을 추가 ⇒ 워크스페이스에 추가되어진 봇의 세부정보에서 추가 가능

Untitled

  1. 추가한 채널의 아이디 알아내기 ⇒ 채널 세부 정보 좌측 하단

  2. 알아낸 정보를 토대로 아래 주소에서 테스트 가능 ⇒ token: 5에서 발급받은 토큰, channel: 7에서 알아낸 채널 ID, text: 전송할 내용

    chat.postMessage API method

참고

chat.postMessage API method

Nest.js 프로젝트에 코드 추가

  1. Redis 모듈을 Nest.js 프로젝트에 추가 npm i --save ioredis npm i @liaoliaots/nestjs-redis
  2. Redis 모듈을 App 모듈에 import
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { LoggerModule } from './logger/logger.module';
import { RedisModule } from '@liaoliaots/nestjs-redis';

@Module({
  imports: [
    RedisModule.forRoot({
      config: {
        host: '127.0.0.1',
        port: 6379,
      },
    }),
    ...
    LoggerModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
  1. Redis 모듈을 사용하여 로그 메시지를 Redis와 슬랙에 전송할 Logger 서비스를 작성
import { RedisService } from '@liaoliaots/nestjs-redis';
import { Injectable } from '@nestjs/common';
import { Logger } from '@nestjs/common';
import { Redis } from 'ioredis';
import axios from 'axios';

@Injectable()
export class LoggerService {
  private readonly redis: Redis;

  constructor(private readonly redisService: RedisService) {
    this.redis = this.redisService.getClient();
  }

  async log(message: string) {
    this.redis.publish('logs', message); // Redis 클라이언트를 사용하여 'logs' 채널로 메시지를 게시

    // await this.redis.set('logs', message, 'EX', 10); // Redis 클라이언트에 10초 간 정보 저장
		await this.redis.rpush('logs', message); // Redis 클라이언트에 배열로 저장

    Logger.log(message); // Nest.js의 Logger를 사용하여 메시지를 기본 로거로 출력

    // Slack에 로그 메시지를 전송하기 위한 Slack API 호출에 사용할 정보들
    const slackToken = process.env.SLACK_SECRET; // Slack API 토큰을 설정
    const slackChannel = process.env.SLACK_CHANNEL_ID; // Slack 채널 ID를 설정

    await sendSlackMessage(slackToken, slackChannel, message); // Slack에 메시지를 전송하기 위한 메서드 호출
  }
}

// Slack에 메시지를 전송하는 메서드
async function sendSlackMessage(token: string, channel: string, text: string) {
  try {
    // Slack API의 chat.postMessage API를 호출하여 메시지를 전송
    const response = await axios.post(
      '<https://slack.com/api/chat.postMessage>',
      {
        channel: channel, // Slack 채널
        text: text, // 전송할 메시지 텍스트
      },
      {
        headers: {
          Authorization: `Bearer ${token}`, // Slack API 인증을 위한 Bearer 토큰
        },
      },
    );
    return response.data; // Slack API 응답 데이터 반환
  } catch (error) {
    console.error('슬랙에 메시지를 보내던 중 에러가 발생하였습니다:', error);
  }
}
  1. 위에서 작성한 LoggerService를 모듈에 추가