Github의 isuue가 댓글을 달 때 Lambda를 사용하여 채팅 작업에 알리려고했습니다.

개요



Github Webhook -> AWS API Gateway -> Lambda -> Chatwork
라는 구성으로 채팅 작업에 github에서 주석이 있음을 알릴 수 있습니다.
Chatwork API가 사용 가능하다고 가정합니다.

Lambda로 함수 만들기



함수 만들기



AWS Lambda > 함수 > 함수 생성 에서 함수를 생성합니다.


함수 이름에 적절한 이름을 입력합니다. 이번에는 chatworkNotification로 둡니다.
함수에 사용하는 언어는, 사용하고 있는 사람이 많을 것 같았기 때문에 Node.js로 했습니다.

함수 코드



이번에는 코드 항목 유형을 코드를 인라인으로 편집하여 aws에서 코드를 추가합니다.

index.js
const https = require('https');
const host = 'api.chatwork.com';
const TOKEN = process.env['CHATWORK_TOKEN'];
const ROOM_ID = process.env['ROOM_ID'];
const path = '/v2/rooms/' + ROOM_ID +'/messages';

exports.handler = function(event) {
  const content = JSON.parse(event.body);
  const messageBody = content.comment.body;

  if (messageBody.match('@account') && content.action === 'created') {

    const issueTitle = content.issue.title;
    const issueUrl = content.issue.html_url;
    const postData = 'body=[To:{account_id}] ○○さん\n' + issueTitle + 'にコメントが追加されました。\n' + issueUrl;

    var options = {
      host: host,
      path: path,
      port: 443,
      method: 'POST',
      headers: {
        'X-ChatWorkToken': TOKEN,
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(postData)
      }
    };

    let req = https.request(options, (res) => {
      console.log('status code : ' + res.statusCode);
      res.setEncoding('utf8');
      res.on('data', (d) => {
        console.log(d)
      });
    });

    req.on('error', (e) => {
      console.error(e);
    });

    req.write(postData);
    req.end();

  }
};

HTTPS 모듈



이번에는 node.js의 표준 모듈 https을 호출하여 사용하고 있습니다. (다른 모듈을 준비하는 것이 귀찮았기 때문에)

환경 변수


  • CHATWORK_TOKEN : 채팅 작업의 API 설정> API Token에서 확인할 수 있습니다
  • ROOM_ID : 채팅 작업을 통해 통보하려는 룸 ID

  • 이번에는 채팅 작업에 대한 메시지 추가가 되므로 경로는 /v2/rooms/' + ROOM_ID +'/messages' 되지만, 그 밖에도 작업 추가 등도 가능하므로 채팅 작업 문서 을 확인하면서 하고 싶은 것에 맞춰 보세요.

    통지되는 조건 설정



    if의 조건으로서 messageBody.match('@account') 를 넣고 있는 것은, 특정의 유저를 멘션했을 때만 통지하고 싶었기 때문입니다.content.action === 'created'는 댓글을 편집할 때 알림을 원하지 않으므로 새 댓글로만 제한되었습니다.
    github webhook의 json 구조는 문서에 나와 있으므로 알림 메시지에 설명하려는 내용에 맞게 데이터를 검색해야합니다.

    채팅 작업의 멘션 설정



    채팅 작업을 통해 알림을 받을 때 TO를 추가하고 싶었기 때문에 알림 메시지에 [To:{account_id}] ○○さん를 그대로 표시했습니다.

    API 게이트웨이



    Amazon API Gateway > API > API 생성

    통합 유형을 Lambda로 설정하고 방금 만든 함수chatworkNotification를 지정합니다.
    API명은 적당한 이름을 붙여 주세요. 나머지 작성 단계는 기본값으로 작성됩니다.


    API를 만들면 엔드포인트 URL이 만들어지므로 나중에 Webhook을 설정할 때 이 URL에 액세스하도록 설정합니다.

    Github Webhook 설정



    대상Repository > Settings > Webhooks > Add webhook

    Payload URL은 방금 만든 URL에 Lambda 함수가 연결한 경로를 지정합니다.
    ex.) htps : // x x. 네, 아빠. 아 p의 r ぇ아 st-1. 아마조나 ws. 코 m / 짱과 rk의 치후 카치 온
    이번에는 issue에 대한 댓글만 주고 싶기 때문에 트리거는 Issue comments를 선택합니다.

    확인



    한 가지 설정은 종료입니다.
    그리고는 issue에 코멘트를 추가해 보고 채팅 워크에 통지가 날아 가면 완료입니다.


    정리해 보면 상당히 간단하게 할 수 있네요. (나는 상당히 시간이 걸렸지만,,)
    slack에게 통지를 날리는 기사는 가득 있었습니다만, 채팅 워크에 통지하는 기사가 적게 느꼈으므로 정리해 보았습니다.

    참조


  • GitHub의 멘션을 Slack에 알리기
  • AWS의 Lambda 동작을 HelloWorld에서 이해
  • [Sy] ChatWork에 알림 보내기 (Web API + Node.js)
  • Lambda에서 Chatwork에 메시지 게시
  • 좋은 웹페이지 즐겨찾기