[AWS] Lambda를 활용한 메시지 자동 전달 - Slack편
안녕하세요. 차니에요~~!
지난 시간에는 AWS CodeCommit에 대해 알아보았는데요.
이번엔 AWS Lambda를 활용해서 레파지토리에 커밋이 일어났을 때
자동으로 팀원들에게 내용을 공유해주는 작업을 자동화 시켜보겠습니다.
이러면 본인이 작업한 내용이 자동으로 팀과 공유가 되겠죠?
1. Slack Incoming Web Hooks 추가
기본적으로 슬랙을 활용하기 때문에 계정 생성과 워크스페이스 생성 과정은 패스하겠습니다.
슬랙에 접속하여 Incoming Web Hooks를 추가합니다.
채널을 선택하여 추가해 주면 됩니다.
여기서 웹후크 URL을 기억하시면 됩니다.
2. AWS Lambda
AWS Lambda 서비스로 이동하여 새로운 함수를 생성합니다.
함수 이름을 입력하고 런타임을 Node.js 로 지정해주었습니다.
그리고 AWS IAM 서비스로 이동하여 역할 항목으로 진입합니다.
인라인 정책 추가를 클릭합니다.
서비스는 CodeCommit을 선택하고 리소스는 모든 리소스를 선택해주었습니다.
이 작업을 해주는 이유는 Lambda에서 소스가 실행될 때 CodeCommit에 대한 권한이 없으면
Permission Denined으로 코드가 정상적으로 실행되지 않기 때문입니다.
이제 다시 AWS Lambda로 돌아옵니다.
트리거 추가를 클릭하여 해당 페이지로 진입 후 트리거에 대한 상세 설정을 입력해줍니다.
이 포스팅 기준에서는 FirstRepo 리포지토리의 main 브랜치에 push 될 때 캐치업 하도록 설정되어있습니다.
추가로 사용자 지정 데이터에는 1번에서 저장해둔 웹 후크 URL 을 입력하여 트리거를 추가합니다.
이제 코드 항목에 하기 코드를 입력한 뒤 Deploy(적용) 합니다.
코드에 대한 내용은 어렵지 않으니 쭉 훑어보시면 이해가 될 거라고 봅니다.
Slack Message Formatting을 참고 하시어 일정 수준 커스텀 가능하다는 점 알려드립니다.
'use strict';
const url = require('url');
const https = require('https');
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 record = event.Records[0];
let references = record.codecommit.references.map(function(reference) {return reference.ref;});
let commits = record.codecommit.references.map(function(reference) {return reference.commit;});
let region = record.eventSourceARN.split(":")[3];
let repository = record.eventSourceARN.split(":")[5];
let branchName = record.codecommit.references[0].ref;
let commitId = commits[0];
let params = {
commitId: commitId,
repositoryName: repository
};
codecommit.getCommit(params, function(err, data) {
if (err) {
console.log(err);
} else {
let commit = data.commit;
if (!webhook_url) {
let error = new Error("webhook 주소를 찾을 수 없습니다.");
callback(error)
} else {
let options = url.parse(webhook_url);
options['method'] = 'POST';
const req = https.request(options, (res) => {
var body = '';
res.setEncoding('utf8');
res.on('data', (chunk) => body += chunk);
res.on('end', () => {
console.log('webhook 트리거 발생 성공');
if (res.headers['content-type'] === 'application/json') {
body = JSON.parse(body);
}
callback(null, body);
});
});
let authorName = commit.author.name + ' <' + commit.author.email + '>',
commitMessage = commit.message.replace(/[^\S\n\r]*\n$/, ""),
titleLink = "https://ap-northeast-2.console.aws.amazon.com/codesuite/codecommit" +
"/repositories/" + repository +
"/commit/" + commitId +
"?region=" + region,
timeStamp = commit.author.date.replace("+0900", "").trim() + "000";
let slackMessage = {
attachments: [{
color: "#36a64f",
pretext: "*The core has been updated.*",
// author_name: authorName,
title: "AWS CodeCommit Notify - Go to history",
title_link: titleLink,
fields: [
{
title: "*Author*",
value: "🤔ㅤ " + authorName,
short: false
},
{
title: "*Branch*",
value: "🪴 " + branchName,
short: false
},
{
title: "*Commit Message*",
value: "`" + commitMessage + "`",
short: false
}
],
"footer": "Native",
ts: timeStamp
}]
};
req.write(JSON.stringify(slackMessage));
req.end();
}
}
});
};
3. 테스트
이제 모든 설정이 완료되었으니 테스트를 해보도록 합시다.
AWS CodeCommit 서비스로 이동합니다.
아까 설정한 트리거가 보입니다. 클릭해서 들어가주세요.
위와 같이 설정이 되어 있을텐데 "트리거 테스트"를 클릭하면 트리거가 강제 발생하여 슬랙으로 메시지를 보내 줄 것 입니다.
이상으로 포스팅 마치겠습니다.
질문은 댓글로 남겨주세요!
