Notiser från Matillion till Slack

25 november 2018

Matillion ♥ Slack

Allt mer kommunikation sker via direktmeddelanden och verktyg som slack. Varför då vara låst till att skicka notiser och larm från datalagerladdningar via gamla sätt som Email? I denna bloggpost tänkte jag visa hur man enkelt kan sätta upp så Matillion skickar statusen på ETL-/ELT-flöden till en slack-kanal.

I lösningen kommer vi använda oss av tre tjänster. Hjärtat i lösningen är en tjänst från AWS kallad Simple Notification Service (SNS). Det är en meddelandetjänst som låter olika program utbyta meddelanden. Vi kommer sedan använda AWS Lambda för att reagera på nya meddelanden i SNS för att slutligen skicka dessa till en så kallad webbhook hos Slack.

Förberedelser i Slack

Vi börjar med att förbereda i Slack. Det gör vi genom att skapa en så kallad WebHook som gör att externa tjänster kan kommunicera med en slack-kanal och skicka meddelande.

Första steget där är att gå till App Directory och söka upp Incoming WebHooks.

När man lagt till det följer ett enkelt formulär där man får konfigurera var meddelanden ska hamna samt vilken ikon som meddelandena ska få. Det viktiga här är att ta med sig WebHook URL som behövs till kommande steg.

Konfiguration i AWS

Nu är Slack redo så nästa steg är att färdigställa det vi behöver i AWS. Här börjar vi med att skapa en ny SNS-kö. Det gör vi genom att i AWS konsolen söka upp SNS och klicka Create Topic. Här skriver vi in ett namn på den kö vi ska ha och klickar sedan Create Topic. När vi gjort det kommer vi till följande skärm där vi ser den adress vår nya kö fått, inringad i rött, som vi antecknar till nästa steg.

 

Nästa steg är nu att koppla ihop vår kö med Slack så att meddelande som kommer på den skickas vidare. Det gör vi med hjälp av Lambda som är ett sätt att köra kod i AWS utan servrar. Speciellt framtagen för fall som detta när man vill ha små funktioner som ska reagera på någon form av händelse.

Vi börjar genom att i AWS konsolen söka upp Lambda och klicka Create Function, väljer Node.js 4.3 och kallar den sendSlackNotification. I Designern börjar vi med att klicka för SNS som det som ska trigga vår Lambda funktion. Efter detta söker vi upp eller fyller i adressen till vår SNS-kö. Det gör att vår Lambda kommer exekveras så fort ett nytt meddelande kommer in på kön.

När vi gjort det kan vi sedan börja skriva koden som vår Lambda ska utföra. Enklast är att bara kopiera koden nedan och ersätta värdet på slack_url med länken till just din WebHook som vi skapade tidigare.

console.log('Loading function');
const https = require('https');
const url = require('url');
const slack_url = 'https://hooks.slack.com/services/ /Zk7Nrm1mDSQILXF9wHuC';
const slack_req_opts = url.parse(slack_url);
slack_req_opts.method = 'POST';
slack_req_opts.headers = {'Content-Type': 'application/json'};

exports.handler = function(event, context) {
  (event.Records || []).forEach(function (rec) {
    if (rec.Sns) {
      var req = https.request(slack_req_opts, function (res) {
      if (res.statusCode === 200) {
        context.succeed('sns posted to slack');
      } else {
        context.fail('status code: ' + res.statusCode);
      }
    });

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

    req.write(JSON.stringify({text: JSON.stringify(rec.Sns.Message, null, '  ')}));
    req.end();
  }
  });
};

 

Nu är det bara att spara och gå in i Matillion för att börja använda vår lösning.

Skicka meddelanden till Slack från Matillion

Så nu är vi redo att knyta ihop säcken och börja använda oss av vår nya lösning i Matillion. T ex kan vi i ett kontroll-flöde lägga in att vid misslyckande eller ok så ska ett meddelande skickas till SNS, som i sin tur landar i Slack. Första steget är att dra in SNS komponenten och sedan konfigurera den med vilken kö och meddelande som ska skickas.

Vi kan ha flera SNS-komponenter med olika meddelanden. T ex enligt nedan där vi laddar data från Facebook och skickar ett meddelande beroende på om det går bra eller dåligt.

Kör vi jobbet ovan kan vi nu direkt när körningen är klar få ett meddelande till vår Slack-kanal om hur det gick och agera om det behövs.

Toksmidigt tycker jag!

Som vanligt är det bara höra av dig till mig eller någon annan på Sparks om du har några funderingar om detta ämne eller andra frågor om Matillion.