Heim  >  Artikel  >  Backend-Entwicklung  >  Senden Sie Slack-Benachrichtigungen mit Go AWS Lambda-Funktionen

Senden Sie Slack-Benachrichtigungen mit Go AWS Lambda-Funktionen

WBOY
WBOYOriginal
2024-07-17 14:03:57614Durchsuche

Einführung

In diesem Artikel besprechen wir, wie Sie eine AWS-Lambda-Funktion erstellen, um Slack-Benachrichtigungen zu senden, wenn die CPU-Auslastung einer AWS-Instanz 50 % erreicht.

AWS Lambda ist ein serverloser Rechendienst, der von Amazon Web Services (AWS) angeboten wird. Damit können Sie Code ausführen, ohne selbst Server bereitstellen oder verwalten zu müssen.

Es ist ereignisgesteuert, d. h. Ihr Code wird als Reaktion auf Ereignisse ausgeführt, die von anderen AWS-Diensten ausgelöst werden, z. B. ein in s3 abgeschlossener Datei-Upload, eine HTTP-Anfrage von Amazon API Gateway oder verschiedene andere Auslöser.

Hier besprechen wir, wie man Amazon Cloudwatch einrichtet, um Metriken von einer EC2-Instanz zu überwachen und zu sammeln, Cloudwatch-Alarme basierend auf diesen Metriken, um eine Benachrichtigung auszulösen, wenn ein bestimmter Schwellenwert oder eine bestimmte Bedingung erreicht wird, und den Amazon Simple Notification-Dienst Erhalten Sie diese Benachrichtigungen und schließlich eine Lambda-Funktion, die das SNS-Thema abonniert hat, die die Benachrichtigung verarbeitet und eine Slack-Nachricht sendet.

Voraussetzung

Um dem folgen zu können, sollte der Leser über Grundkenntnisse und Verständnis dafür verfügen

  • Golang
  • AWS und seine Dienste ### Einrichten des Projekts Zuerst schreiben wir zunächst die Funktion zum Senden dieser Benachrichtigungen an Slack.

Erstellen Sie ein neues Go-Projekt und nennen Sie es, wie Sie möchten. Ich habe meine „lambdaFunction“ in Ihrer main.go-Datei genannt, fügen Sie den folgenden Codeabschnitt ein

import (
   "bytes"
   "context"
   "encoding/json"
   "fmt"
   "github.com/aws/aws-lambda-go/events"
   "github.com/aws/aws-lambda-go/lambda"
   "net/http"
)

type slackMessage struct {
   Text string `json:"text"`
}

func handleRequest(ctx context.Context, snsEvent events.SNSEvent) error {
    webhookURL := "https://hooks.slack.com/services/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"
    for _, record := range snsEvent.Records {
        snsRecord := record.SNS
        sendSlackNotification(webhookURL, snsRecord.Message)
    }
    return nil
}

func sendSlackNotification(webhookURL, message string) {
   slackMessage := slackMessage{Text: "Cpu usage is above 50%" + message}
   slackBody, _ := json.Marshal(slackMessage)
   req, err := http.NewRequest(http.MethodPost, webhookURL, bytes.NewBuffer(slackBody))
   if err != nil {
      fmt.Printf("Error creating request: %v\n", err)
      return
   }
   req.Header.Set("Content-Type", "application/json")

   client := &http.Client{}
   resp, err := client.Do(req)
   if err != nil {
      fmt.Printf("Error sending request: %v\n", err)
   }
   defer resp.Body.Close()
   if resp.StatusCode != http.StatusOK {
      fmt.Printf("Error response from slack: %v\n", resp.StatusCode)
   } else {
      fmt.Printf("Successfully sent Slack notification: %v\n", resp.StatusCode)
   }
}



func main() {
   lambda.Start(handleRequest)
}

Führe den Go-Mod aus

Lassen Sie uns versuchen zu verstehen, was vor sich geht
Die handleRequest-Funktion

  • Zuerst erstellen wir eine Struktur mit dem Namen slackMessage, um das an Slack gesendete Nachrichtenformat darzustellen. Sie verfügt über ein einzelnes Feld „Text“, das den Nachrichteninhalt enthält
  • Die handleRequest-Funktion ist die Hauptfunktion, die von der Lambda-Laufzeit ausgeführt wird. Es akzeptiert zwei Argumente: context und snsEvent events.SNSEvent mit Details zur eingehenden SNS-Benachrichtigung.
  • Die Funktion durchläuft jeden snsRecord innerhalb des snsEvent, ruft den Nachrichteninhalt aus dem Feld sns.message ab und ruft sendSlackNotification mit der Slack-Webhook-URL und dem Nachrichteninhalt auf

sendSlackNotification-Funktion

  • Diese Funktion benötigt zwei Argumente: webhookURL: die URL, an die die Slack-Benachrichtigungen gesendet werden, und message: den Nachrichteninhalt, der an Slack gesendet werden soll.
  • Ich habe eine vordefinierte Meldung „CPU-Auslastung liegt über 50 %“ bereitgestellt, die an die bereitgestellte Nachricht angehängt ist. Anschließend wird die slackMessage-Struktur mit json.marshal.
  • in das JSON-Format gemarshallt
  • Eine HTTP-Post-Anfrage wird mit http.NewRequest erstellt, wobei die Slack-Webhook-URL, der JSON-formatierte Text und der Inhaltstyp-Header auf application.json gesetzt sind *Die Anfrage wird über einen http.client gesendet und die Antwort wird empfangen Die Hauptfunktion wird nur für lokale Tests verwendet. In einer Lambda-Umgebung wird die Funktion lamba.start automatisch mit handleRequest als Einstiegspunkt aufgerufen

Slack-Webhook-URL abrufen

Um die Slack-Webhook-URL zu erhalten, mit der Sie Nachrichten an Slack senden können, navigieren Sie zu https://api.slack.com/apps. Stellen Sie sicher, dass Sie bei Ihrem Slack-Konto angemeldet sind, bevor Sie fortfahren.

  • Klicken Sie oben rechts auf „Neue App erstellen“. Es erscheint ein Dialogfeld. Wählen Sie „Von Grund auf neu“, um eine neue App zu erstellen. Anschließend wird ein weiteres Dialogfeld angezeigt. Hier können Sie Ihrer App den Namen „cpu-alert“ geben und dann den spezifischen Slack-Arbeitsbereich auswählen, an den die Nachrichten gesendet werden sollen. Ich habe bereits einen Testarbeitsbereich „Site Reliability Test“ erstellt
  • Klicken Sie auf „App erstellen“
  • Wählen Sie im Abschnitt „Features und Funktionalität hinzufügen“ die Option „Eingehende Webhooks“ aus
  • Stellen Sie die Schaltfläche „Eingehenden Webhook aktivieren“ auf „Ein“. Navigieren Sie erneut zurück und scrollen Sie zum Abschnitt „App installieren“
  • Klicken Sie auf „In Workspace installieren“ und wählen Sie dann den Kanal aus, an den Slack Nachrichten senden soll. Klicken Sie dann auf „Zulassen“.
  • Gehen Sie zurück zu „Features und Funktionalität hinzufügen“ und wählen Sie „Eingehende Webhooks“
  • Scrollen Sie nach unten, um unsere Webhook-URL zu finden, kopieren Sie sie dann und fügen Sie sie in unseren Code ein.

Der nächste Schritt besteht darin, ein Bereitstellungspaket für unsere Go-App zu erstellen
Wir werden die Anwendung erstellen.

  • Öffnen Sie ein Terminal im Arbeitsverzeichnis des Projekts.run GOOS=linux go build -o main main.go
  • Erstellen Sie eine „Bootstrap“-Datei Erstellen Sie im Stammverzeichnis des Projekts eine Datei mit dem Namen „bootstrap“ und folgendem Inhalt
#!/bin/sh 
./main

Machen Sie die Bootstrap-Datei ausführbar

  • Führen Sie chmod +x bootstrap aus
  • Zippen Sie die ausführbare Datei und die Bootstrap-Datei, indem Sie zip function.zip main bootstrap ausführen

Hochladen der Lamba-Funktion

  • Navigieren Sie zur AWS-Verwaltungskonsole
  • Suchen Sie nach Lambda und erstellen Sie eine neue Funktion
  • Geben Sie ihm einen Namen Ihrer Wahl
  • Wählen Sie „Autor von Grund auf neu“
  • Wählen Sie für die Laufzeit Amazon Linux 2023 aus
  • Klicken Sie auf Funktion auswählen
  • Wenn die Erstellung der Funktion abgeschlossen ist, scrollen Sie nach unten und suchen Sie die Option „Hochladen von“
  • Wählen Sie Ihre function.zip-Datei aus, NICHT den gesamten Ordner, der den Code enthält
  • Speichern Sie es
  • Suchen Sie den Abschnitt mit den Laufzeiteinstellungen und klicken Sie auf Bearbeiten
  • Setzen Sie den Handler auf Bootstrap und speichern Sie ihn

Im nächsten Schritt konfigurieren wir einen Trigger für die Lambda-Funktion. Dieser Auslöser definiert das Ereignis, das die Funktion dazu veranlasst, eine Nachricht an Slack zu senden

Wie ich bereits erwähnt habe, tritt dieser Auslöser ein, wenn die CPU-Auslastung einer virtuellen Maschine >= 50 % beträgt

Um diese Funktionalität zu erreichen, besteht der erste Schritt darin, eine EC2-Instanz zu erstellen.

Wenn dies erledigt ist, müssen wir Cloudwatch für die Überwachung und Erfassung von Metriken konfigurieren

  • Suchen Sie nach Cloudwatch und öffnen Sie es
  • Wählen Sie „Alarme erstellen“ aus
  • Wählen Sie „Metriken auswählen“
  • Wählen Sie ec2
  • Wählen Sie Metriken pro Instanz aus
  • Wählen Sie die CPUUtilization-Metrik aus

Im Zustandsbereich

  • Wählen Sie „Größer/Gleich“ als Schwellenwert aus
  • Definieren Sie den Schwellenwert als „50“
  • Klicken Sie auf Weiter Suchen Sie auf der nächsten Seite den Benachrichtigungsbereich
  • Wir belassen den Alarmzustandsauslöser auf „In Alarm“
  • Wählen Sie die Option „Neues Thema erstellen“
  • Geben Sie einen eindeutigen Namen ein. Sie können auch eine E-Mail-Adresse eingeben, um Benachrichtigungen zu erhalten
  • Wählen Sie Thema erstellen
  • Geben Sie auf der nächsten Seite einen eindeutigen Alarmnamen ein Dann Alarm erstellen

Wir kehren zu unserer Lambda-Funktion zurück

  • Wählen Sie „Trigger hinzufügen“
  • Suchen Sie im Feld „Quelle auswählen“ nach „sns“ und wählen Sie es aus
  • Wählen Sie das Thema aus, das Sie zuvor erstellt haben, und klicken Sie auf „Hinzufügen“. ### Testen Wir haben die verschiedenen Teile unserer einfachen Infrastruktur fertig zusammengestellt, jetzt ist es Zeit zum Testen.

Um zu testen, ob das funktioniert, müssen wir unsere VM einer Art Stresstest unterziehen. Dieser Test erzeugt eine hohe CPU-Last. Um diesen Test durchzuführen, verwenden wir das „Stress“-Tool unter Linux.

Zuallererst müssen wir das „Stress“-Tool in unserer EC2-Instanz installieren. Verbinden Sie sich mit der EC2-Instanz und führen Sie die folgenden Befehle aus
sudo apt-get update
sudo apt-get install stress
Verwenden Sie den folgenden Befehl, um Ihre CPU einem Stresstest zu unterziehen
stress --cpu 4 --timeout 300
In diesem Beispiel werden 4 CPU-Worker (Anzahl paralleler Prozesse oder Threads) für 300 Sekunden (5 Minuten) verwendet. Sie können die Anzahl der Arbeiter und Seconda nach Ihren Wünschen anpassen.

Öffnen Sie Slack und warten Sie, bis Sie eine Benachrichtigung erhalten, die so aussieht

Image description

Häufige Fehler, auf die Sie stoßen könnten

Während Sie Ihren Stresstest durchführen, bemerken Sie möglicherweise, dass sich der Status von Cloudwatch in „Unzureichende Daten“ ändert, was dazu führen kann, dass sich der Alarm etwas verzögert. Um dies zu beheben

  • Öffnen Sie die Cloudwatch-Konsole
  • Navigieren Sie zu Alarmen und wählen Sie Ihren spezifischen Alarm aus
  • Klicken Sie auf Aktion und dann auf Bearbeiten
  • Scrollen Sie nach unten zum Abschnitt zur Behandlung fehlender Daten
  • Wählen Sie „Fehlende Daten als ignorieren behandeln (aktuellen Status beibehalten)“
  • Speichern Sie den Alarm ### Abschluss Bisher haben wir untersucht, wie man eine einfache Lambda-Funktion in Go schreibt und einrichtet. Darüber hinaus haben wir CloudWatch für die Überwachung und Erfassung von Metriken konfiguriert, CloudWatch-Alarme eingerichtet, die bei Erreichen bestimmter Schwellenwerte ausgelöst werden, und ein SNS-Thema zum Empfang dieser Alarme eingerichtet. Der Zweck des SNS-Themas besteht darin, unsere Lambda-Funktion auszulösen, die eine Slack-Nachricht sendet.

Ich hoffe, dass Sie dies unterhaltsam und informativ fanden. Sollten Fehler vorliegen, ein Teil nicht klar erklärt worden sein oder Sie glauben, dass ich etwas übersehen habe, wenden Sie sich bitte an uns. Ihr Feedback wird sehr geschätzt. Vielen Dank!

Den Link zum Github-Repository finden Sie hier

Das obige ist der detaillierte Inhalt vonSenden Sie Slack-Benachrichtigungen mit Go AWS Lambda-Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn