AWS Elastic Beanstalk + Slack 연동하기

이 포스트에서 하는 것

새 버전의 앱을 Elastic Beanstalk에 업로드하면 슬랙 채널에 메시지를 보냅니다.

이미 AWS CLI가 설치되어 있고, 슬랙을 사용하고 있으며, Elastic Beanstalk에 앱을 배포하고 있는 것을 전제로 합니다.

사용하는 기술

  • Slack webhook
  • AWS Elastic Beanstalk
  • AWS SNS
  • AWS Lambda

먼저 Webhook을 Slack에 integration합니다.

https://slack.com/apps/A0F7XDUAZ-incoming-webhooks에서 Incoming Webhook을 Slack 채널에 설정합니다.

저는 #develop 채널에 붙였습니다. Webhook URL을 기억해주세요.

AWS Lambda 함수 만들기

Lambda - Create Lambda Function - Blank Function 순으로 진입하여 Lambda Function을 생성합니다. Trigger는 빈칸으로 두세요. 플랫폼은 node.js입니다.

아래 코드를 복사하여 붙여넣기합니다. 코드는 여기에서 가져왔습니다.

기억했던 Webhook API URL과 알림을 배달할 슬랙 채널을 적절하게 수정해주세요.

var https = require('https');
var util = require('util');

exports.handler = function(event, context) {
    console.log(JSON.stringify(event, null, 2));
    console.log('From SNS:', event.Records[0].Sns.Message);

    var postData = {
        "channel": "#aws-sns",
        "username": "AWS SNS via Lamda :: DevQa Cloud",
        "text": "*" + event.Records[0].Sns.Subject + "*",
        "icon_emoji": ":aws:"
    };

    var message = event.Records[0].Sns.Message;
    var severity = "good";

    var dangerMessages = [
        " but with errors",
        " to RED",
        "During an aborted deployment",
        "Failed to deploy application",
        "Failed to deploy configuration",
        "has a dependent object",
        "is not authorized to perform",
        "Pending to Degraded",
        "Stack deletion failed",
        "Unsuccessful command execution",
        "You do not have permission",
        "Your quota allows for 0 more running instance"];

    var warningMessages = [
        " aborted operation.",
        " to YELLOW",
        "Adding instance ",
        "Degraded to Info",
        "Deleting SNS topic",
        "is currently running under desired capacity",
        "Ok to Info",
        "Ok to Warning",
        "Pending Initialization",
        "Removed instance ",
        "Rollback of environment"        
        ];

    for(var dangerMessagesItem in dangerMessages) {
        if (message.indexOf(dangerMessages[dangerMessagesItem]) != -1) {
            severity = "danger";
            break;
        }
    }

    // Only check for warning messages if necessary
    if (severity == "good") {
        for(var warningMessagesItem in warningMessages) {
            if (message.indexOf(warningMessages[warningMessagesItem]) != -1) {
                severity = "warning";
                break;
            }
        }        
    }

    postData.attachments = [
        {
            "color": severity,
            "text": message
        }
    ];

    var options = {
        method: 'POST',
        hostname: 'hooks.slack.com',
        port: 443,
        path: '/services/your-slack-webhook-url-info-goes-here'
    };

    var req = https.request(options, function(res) {
      res.setEncoding('utf8');
      res.on('data', function (chunk) {
        context.done(null);
      });
    });

    req.on('error', function(e) {
      console.log('problem with request: ' + e.message);
    });    

    req.write(util.format("%j", postData));
    req.end();
};

AWS SNS 토픽 생성하기

SNS - Topics에 진입하여 SNS 생성합니다. 토픽 이름은 적절하게 지어주세요.

Create subscription버튼을 클릭해고 Protocol을 AWS Lambda로 설정합니다. Endpoint에 Lambda 함수가 나타납니다. 선택해주세요.

이제 Topic ARN을 복사해주세요.

AWS CLI로 Elastic Beanstalk 설정 변경하기

아쉽게도 Elastic Beanstalk에 SNS 토픽을 붙이는 것은 아직 웹콘솔에서 지원되지 않습니다. AWS CLI가 설치되지 않았다면 여기에서 설치해주세요.

아래 내용을 터미널에서 실행합니다.

aws elasticbeanstalk update-environment --environment-name ENV_이름 --option-settings Namespace=aws:elasticbeanstalk:sns:topics,OptionName="Notification Topic ARN",Value="복사한_Topic_ARN을_여기에_붙여넣기"

이제 Elastic Beanstalk에 새 버전의 앱이 업로드되면 Slack으로 알림이 배달됩니다.

이렇게요!

0
👍
0
❤️
0
😄
0
😝
0
😢
0
😡