Powiadomienia z AWS na MS Teams

Alerts from AWS to Teams

Pisałem już wcześniej jak wysyłać powiadomienia z Azure na MS Teams (link). Dzisiaj pokażę jak wysyłać powiadomienia z AWS do aplikacji MS Teams. Przy okazji zmieniając jedną rzecz można wysyłać też powiadomienia na Slacka jeśli ktoś nie lubi Teamsów 😉

TEAMS

Jeśli chcemy wysyłać powiadomienia do aplikacji Teams to musimy mieć tam uprawnienia pozwalające na tworzenie konektorów/łączników (Jeśli nam ich brakuje dodajemy je: Settings => Member permissions => Allow members to create, update, and remove connectors).

Jeśli mamy już takie uprawnienia, to możemy dodać “incoming webhook“. Klikamy na 3 kropki() przy nazwie kanału w którym chcemy publikować wiadomości i wybieramy łączniki (Connectors).

MS TEAMS - webhooks

Wyszukujemy webhook i klikamy dodaj przy nazwie “Przychodzący element webhook“. Klikamy dodaj następnie podajemy nazwę możemy zmienić obrazek. Po kliknięciu utwórz wygeneruje się adres URL, który należy skopiować ponieważ będzie nam potrzebny w dalszej części.

MS TEAMS - webhooks add
MS TEAMS - webhooks create

Amazon SNS

Teraz możemy otworzyć stronę AWS i przejść do ‘Simple Notification Service‘. Jest to usługa która wysyła powiadomienia. Tworzymy nowy Topic. Wybieramy typ Standard, podajemy nazwę i klikamy na ‘Create topic‘.

AWS - SNS
AWS - SNS create topic
AWS - SNS topic - create

Lambda

Teraz możemy przejść do usługi Lambda. Stworzymy funkcję, która będzie tłumaczyć nasze wiadomości w taki sposób by zrozumiała je aplikacja Teams.

Klikamy na ‘Create function‘ wybieramy ‘Author from scratch‘ podajemy nazwę naszej funkcji, a jako język ustawimy ‘Python 3.8‘.

Amazon AWS Lambda function add

Po utworzeniu funkcji zmieniamy jej kod na ten który umieściłem poniżej z jednym wyjątkiem. W miejsce url wklejamy adres który tworzyliśmy w aplikacji Teams podczas dodawania webhooka.

Amazon AWS Lambda function code
#!/usr/bin/python3.8
import urllib3 
import json
http = urllib3.PoolManager() 
def lambda_handler(event, context): 
    url = "https://outlook.office.com/webhook/PODAJ_WŁAŚCIWY_URL"    
    msg = {
        "text": event['Records'][0]['Sns']['Message']
    }
    encoded_msg = json.dumps(msg).encode('utf-8')
    resp = http.request('POST',url, body=encoded_msg)
    print({
        "message": event['Records'][0]['Sns']['Message'], 
        "status_code": resp.status, 
        "response": resp.data
    })

Gdy mamy właściwy kod możemy go sprawdzić klikając na test podać nazwę i kliknąć create. Jeśli wszystko dobrze skonfigurowaliśmy powinniśmy dostać odpowiedź 200. Wtedy możemy kliknąć na deploy.

Teraz możemy dodać trigger który będzie wywoływał wysyłanie wiadomości. Do tego celu użyjemy topiku który utworzyliśmy wcześniej w usłudze Amazon SNS. W tym celu klikamy na ‘Add trigger‘ wybieramy SNS i nazwę naszego topika.

Amazon AWS Lambda function add trigger
Amazon AWS Lambda function add trigger - SNS

To już wszystko. Gdy przejdziemy do topiku w naszej usłudze Amazon SNS możemy ręcznie wysłać wiadomość, która powinna po chwili pojawić się na naszym kanale w aplikacji Teams.

AWS - SNS - publish message

Powiadomienia o budżecie

Na koniec podam jeszcze praktyczny przykład, jak można wysyłać powiadomienia o przekroczeniu budżetu.

Na początek musimy ponownie otworzyć naszą funkcję lambda, by dodać do niej niezbędne uprawnienia. Kopiujemy nazwę ARN która za chwilę będzie nam potrzebna. Klikamy na ‘Edit‘ i edytujemy sekcję ‘Access policy – optional‘. Za kwadratowym nawiasem wstawiamy poniższy kod, w którym należy zamienić wartość parametru Resource na nazwę ARN którą wcześniej kopiowaliśmy. Pamiętajcie podczas kopiowania kodu o przecinku za nawiasem.

    {
      "Sid": "AWSBudgetsSNS_Permissions",
      "Effect": "Allow",
      "Principal": {
        "Service": "budgets.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "PODAJ_ARN"
    },
AWS - lambda edit
AWS - lambda edit access policy

Teraz wystarczy tylko utworzyć nowy budżet, albo edytować istniejący. W AWS podczas tworzenia/edycji przechodzimy do sekcji ‘Set up your notifications‘ jeśli tam oprócz adresu email podamy nazwę ARN naszego topicu to będzie on wysyłał powiadomienia do naszej aplikacji Teams.

AWS - budget
AWS - budget - set notification

W identyczny sposób można wysyłać inne powiadomienia w AWS do aplikacji MS Teams.

SLACK

Na sam koniec jak obiecałem Slack. Jeśli chcecie wysyłać wiadomości do Slack zamiast Teams to należy zamienić kod który wpisywaliśmy w funkcji Lambda na ten przedstawiony poniżej. W kodzie trzeba podać tylko prawidłowy URL (tak jak przy Teamsach) i nazwę kanału. Dodatkowo można zmienić nazwę użytkownika która będzie widniała przy alertach.

#!/usr/bin/python3.8
import urllib3
import json
http = urllib3.PoolManager()
def lambda_handler(event, context):
    url = "https://hooks.slack.com/services/PODAJ_WŁAŚCIWY_URL"
    msg = {
        "channel": "#NAZWA_KANAŁU",
        "username": "POWIADOMIENIA_AWS",
        "text": event['Records'][0]['Sns']['Message'],
        "icon_emoji": ""
    }
    
    encoded_msg = json.dumps(msg).encode('utf-8')
    resp = http.request('POST',url, body=encoded_msg)
    print({
        "message": event['Records'][0]['Sns']['Message'], 
        "status_code": resp.status, 
        "response": resp.data
    })
notification aws - slack

Więcej na temat Amazon Simple Notification Service znajdziecie w dokumentacji AWS pod linkiem https://docs.aws.amazon.com/sns/

Jeśli temat Amazon Web Service (AWS) was interesuje zachęcam by odwiedzać blog i zaglądać do kategorii AWS w której będzie coraz więcej artykułów na ten temat.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *