본문 바로가기
서버/클라우드

Lambda 를 사용하여 CodeCommit 을 Slack 과 연동하기

by 사악신 2018. 5. 21.


먼저, Slack 에서 Incoming WebHooks 를 설치합니다.


설치 후, 설정을 시작합니다.





연동할 채널을 선택한 후, Add Incoming WebHooks integration 버튼을 클릭합니다.



생성된 Webhook URL 을 기록해둡니다. 이후, 아마존 클라우드콘솔로 접속한 후 람다함수를 생성합니다.



아래 표기된 내용으로 변경합니다.(기존에 등록한 람다함수를 사용할 경우, 역할 부분을 "기존 역할 선택"으로 하고 해당 함수를 선택합니다.)



기존 함수 코드를 변경합니다.



일단, 여기저기 돌아다니는 소스들을 취합하여 작성해보았습니다.


'use strict';


const url = require('url');

const https = require('https');

const util = require('util');

const aws = require('aws-sdk');

const codecommit = new aws.CodeCommit({ apiVersion: '2015-04-13' });


exports.handler = (event, context, callback) => {

    let webhook_url = event.Records[0].customData;

    let references = event.Records[0].codecommit.references.map(function(reference) {return reference.ref;});

    let commits = event.Records[0].codecommit.references.map(function(reference) {return reference.commit;});

    let repository = event.Records[0].eventSourceARN.split(":")[5];

    let params = {

        commitId: commits[0],

        repositoryName: repository

    };

    codecommit.getCommit(params, function(err, data) {

        if (err) {

            console.log(err);

        } else {

            let commit = data.commit;

            let commitDetails = '저장소: ' + repository + '\n' + '커밋: ' + references + '\n' + '메시지: ' + commit.message + '작성자: ' + commit.author.name + ' <' + commit.author.email + '>';

            let postData = {

                'text': commitDetails

            }

            if (!webhook_url) {

                let error = new Error("webhook 주소를 찾을 수 없습니다.");

                callback(error)

            } else {

                console.log('web-hook POST 요청: ' + webhook_url)

                let options = url.parse(webhook_url);

                options['method'] = 'POST';

                const req = https.request(options, (res) => {

                    let body = '';

                    console.log('Status:', res.statusCode);

                    console.log('Headers:', JSON.stringify(res.headers));

                    res.setEncoding('utf8');

                    res.on('data', (chunk) => body += chunk);

                    res.on('end', () => {

                        console.log('webhook 트리거 발생 성공');

                        // If we know it's JSON, parse it.

                        if (res.headers['content-type'] === 'application/json') {

                            body = JSON.parse(body);

                        }

                        callback(null, body);

                    });

                });

                req.on('error', callback);

                req.write(util.format('%j', postData));

                req.end();

            }

        }

    });

};


CodeCommit 트리거를 연결합니다. 



연동할 리포지토리를 선택하고 아래와 같이 지정합니다. 마지막 사용자 지정 데이터에는 상기 Slack 의 Webhook URL 을 입력합니다.



끝으로 생성한 람다 함수에 CodeCommit 에 접근할 수 있는 권한을 추가합니다. IAM 에서 역할로 들어간 후 LAMBDA-WEBHOOK 의 인라인 정책을 추가합니다.



CodeCommit 의 GetCommit 과 GetRepository 권한을 추가하였습니다.



정책 리뷰를 한 후, 변경 사항을 저장하면 관련 세팅이 완료됩니다. 람다 함수의 console.log 에 의해 기록된 로그들은 CloudWatch 의 로그에서 찾아볼 수 있습니다.



반응형

댓글