uju's Tech

[Node.js: Lambda] AWS의 lambda와 SNS를 이용한 Slack Webhook 으로 메시지 보내기(1탄) 본문

Node

[Node.js: Lambda] AWS의 lambda와 SNS를 이용한 Slack Webhook 으로 메시지 보내기(1탄)

ujusy 2020. 10. 5. 23:10

<본 포스팅은 공부목적으로 작성되었습니다. 혹시 틀린 부분이 있거나 문제가 되는 부분이 있다면 답글 달아주세요!>

 

개발 진행 중 특정한 상황에 Slack으로 메시지를 보내 확인할 수 있도록 구축해주고 싶었다. 또한 이를 기존 구현하는 프로젝트 내에 구현하는 것이 아닌 lambda 에 올려 서버 부하를 줄이고자 했다.

 

nodejs 에서 slack incoming webhook을 사용하기 위해 아래의 링크를 참고하여 설치를 진행해준다.

 

www.npmjs.com/package/@slack/webhook

 

@slack/webhook

Official library for using the Slack Platform's Incoming Webhooks

www.npmjs.com

 

npm install @slack/webhook

 

아래는 프로젝트 디렉토리 구조이다. 이 구조의 폴더는 아래에서 천천히 설명하도록 하겠다. 

프로젝트
 |
 |-- slack.js
 |-- slackMessage.js
 |-- index.js
 |-- package.json
 |-- package-lock.json
 |-- .gitignore
 

1. 먼저 slack.js를 생성해준다.

 

설치 후  원하는 webhookUrl과 payload를 보낼 수있도록 slack.js 폴더 내에 코드를 작성해 준다.

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

/**
 * @param {string} webhookUrl
 * @param {object} payload
 * @returns {Promise<void>}
 */
const sendSlackWebhook = async (webhookUrl, payload) => {
  const webhook = new IncomingWebhook(webhookUrl);
  try {
    await webhook.send(payload);
  } catch (e) {
    console.log(e);
  }
};

module.exports = {
  sendSlackWebhook,
};

 

slack.js에 위와 같이 작성해주어 우리가 보낼 Incoming webhookUrl에 보내고 싶은 payload를 작성될 수있도록 구현해준다.

"slack webhook url은 slack에서 incoming webhook 앱 연결하면 생성된다. -> 구글에 아주 많은 자료가 있다"

 

 

2. 전송하고 싶은 message 형식(payload) 을 지정하기 위해 slackMessage.js 폴더를 생성하여 해당 메시지 형식을 작성해준다.

 

예를 들어 아래와 같이 작성할 수 있다.

 

const { sendSlackWebhook } = require('./slack');

const webhookUrl = process.env.SLACK_WEBHOOK_NOTIFICATION_URL;

if (!webhookUrl) {
  throw Error('webhookUrl 환경변수가 존재하지 않습니다.');
}

/**
 * {object} message
*/
const sendMessage = async (message) => {
  const payload = {
    blocks: [
      {
        type: 'section',
        text: {
          type: 'mrkdwn',
          text: message.text,
        },
        accessory: {
          type: 'image',
          image_url: message.image,
          alt_text: '메시지',
        },
      },
    ],
  };

  await sendSlackWebhook(webhookUrl, payload);
};

module.exports = {
	sendMessage,
};

 

이러한 block을 원하는 형태로 커스텀할 수있다.  

 

아래 링크(slack api)에서 block을 커스텀하고 테스트를 실행해 볼 수있다.

 

api.slack.com/messaging/composing/layouts

 

Creating rich message layouts

Learn how to build bot users, send notifications, and interact with workspaces using our APIs.

api.slack.com

 

1번, 2번까지 진행하였으면 slack의 메시지 webhook과 메시지 형식을 지정하였다.

 

다음 2탄으로는 람다 생성과 람다로의 배포과정 및 handler 구현에 대해 작성해볼 예정이다.

Comments