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
함수를 이용해 메시지를 보냈다. 다음과 같은 형태로 메시지가 도착한다.
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 하도록 만들어 볼 것이다.