• Home
  • About
    • Pieces for Studying photo

      Pieces for Studying

      Moon is a minimal, one column jekyll theme.

    • Learn More
    • Email
    • LinkedIn
    • Github
  • Posts
    • All Posts
    • Baekjoon
    • CS231N
    • Study
  • Projects

[AWS] Lambda를 이용한 Slack Bot (2) - Lambda 함수 만들기

28 Nov 2020

Reading time ~1 minute

1. slack 메시지 보내기

Slack으로 메시지를 보내는 sendMessage 함수를 작성할 것이다.

import { IncomingWebhook } from "@slack/webhook";

const url = process.env.SLACK_WEBHOOK_URL as string;
const webhook = new IncomingWebhook(url);

const sendMessage = ({result, pageInfo}) => {
  const mapToBlocks = result.map((val)=> {
    return {
      type: "section",
      text: {
        type: "plain_text",
        text: `${val.title}: ${val.info}`
      }
    }
    });
    try {
      await webhook.send({
        text: `오늘의 ${pageInfo} 발매계획입니다.`,
        attachments: [
          {
            blocks: mapToBlocks,
          },
        ],
      });
    } catch (err) {
      return err;
    }
}
export default sendMessage;

여기서 result는 웹 크롤링 후 필요한 정보를 담은 배열이다. 그냥 axios등을 이용하여 POST요청을 보내도 상관 없지만 여기서는 webhook.send 함수를 이용해 메시지를 보냈다. 다음과 같은 형태로 메시지가 도착한다. lambda1

Lambda 함수 만들기

작성할 함수는 따로 event 를 받지 않는다.

먼저 lambda 반환 타입을 정의해 준다.

interface returnType {
  statusCode: number;
  body: string;
}

다음으로 lambda handler 를 만들어 export 해주면 끝이다.

import crawler from './crawler';
import sendMessage from './slack';
import { Handler } from 'aws-lambda';

export const hello: Handler<any,returnType> = async () => {
  try {
    for (let getInfo of crawler) {
      const result = await getInfo();
      if(result) {
        await sendMessage(result);
      }
    }
    return {
      statusCode: 200,
      body: JSON.stringify({message: 'SUCCESS'}),
    }
   } catch (err) {
     return {
       statusCode: 403,
       body: JSON.stringify({message : err.message}),
     }   
   }

}

Deploy

serverless deploy 명령어로 배포를 할 수 있다. 배포가 완료되면 serverless invoke -f FUNCNAME 으로 함수를 실행해볼 수 있다. 실행에 성공했다면 콘솔에 AWS lambda에서 온 response를 볼 수 있다.

마치며

가볍게 Lambda함수를 이용해 Slack bot을 만들어 보았다. 여기선 모든 과정을 하나의 Lambda에 넣었고 지정된 시간에만 trigger하게(CloudWatch) 만들었다.

여기서 크롤링 과정을 따로 lambda로 분리해 필요할 때 API gateway로 trigger 하도록 만들어 볼 것이다.

Github



study Share Tweet +1