Introduction
Dans cet article, nous verrons comment créer une fonction AWS lambda pour envoyer des notifications Slack lorsque l'utilisation du processeur d'une instance AWS atteint 50 %.
AWS Lambda est un service de calcul sans serveur proposé par Amazon Web Services (AWS). Il vous permet d'exécuter du code sans avoir à provisionner ou gérer vous-même les serveurs.
Il est piloté par les événements, c'est-à-dire que votre code s'exécute en réponse à des événements déclenchés par d'autres services AWS, comme un téléchargement de fichier terminé en s3, une requête HTTP d'Amazon API Gateway ou divers autres déclencheurs.
Dans ce document, nous discuterons de la façon de configurer Amazon Cloudwatch pour surveiller et collecter des métriques à partir d'une instance EC2, des alarmes Cloudwatch basées sur ces métriques pour déclencher une notification lorsqu'un certain seuil ou une certaine condition est remplie, du service Amazon Simple Notification pour recevez ces notifications et enfin une fonction lambda abonnée au topic SNS, qui traitera la notification et enverra un message slack.
Condition préalable
Pour suivre cela, le lecteur doit avoir des connaissances et une compréhension de base de
- Golang
- AWS et ses services
### Mise en place du projet
Tout d’abord, nous commencerons par écrire la fonction permettant d’envoyer ces notifications à Slack.
Créez un nouveau projet go et appelez-le comme vous voulez, j'ai appelé le mien « lambdaFunction » dans votre fichier main.go, collez le morceau de code suivant
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)
}
Exécuter le mod Go
Essayons de comprendre ce qui se passe
La fonction handleRequest
- Tout d'abord, nous créons une structure nommée slackMessage pour représenter le format du message envoyé à Slack, elle comporte un seul champ Texte qui contient le contenu du message
- La fonction handleRequest est la fonction principale exécutée par le runtime lambda. Il prend en compte deux arguments de contexte et snsEvent events.SNSEvent contenant des détails sur la notification SNS entrante.
- La fonction parcourt chaque snsRecord dans le snsEvent, elle récupère le contenu du message du champ sns.message et appelle sendSlackNotification avec l'URL du webhook slack et le contenu du message
Fonction sendSlackNotification
- Cette fonction prend deux arguments webhookURL : l'URL où les notifications Slack sont envoyées et message : le contenu du message à envoyer à Slack.
- J'ai fourni un message prédéfini « L'utilisation du processeur est supérieure à 50 % » ajouté au message fourni.
Il rassemble ensuite la structure slackMessage au format JSON à l'aide de json.marshal.
- Une requête de publication HTTP est créée à l'aide de http.NewRequest avec l'URL du webhook Slack, le corps au format JSON et l'en-tête du type de contenu défini sur application.json.
*La demande est envoyée via un client http et la réponse est reçue
La fonction principale n'est utilisée que pour les tests locaux. Dans un environnement lambda, la fonction lamba.start est automatiquement appelée avec handleRequest comme point d'entrée
Obtenir l'URL du webhook Slack
Pour obtenir l'URL du webhook Slack qui vous permet d'envoyer des messages à Slack, accédez à https://api.slack.com/apps. Assurez-vous d'être connecté à votre compte Slack avant de continuer.
- Cliquez sur « Créer une nouvelle application » en haut à droite
Une boîte de dialogue apparaîtra. Sélectionnez « À partir de zéro » pour créer une nouvelle application. Suite à cela, une autre boîte de dialogue apparaîtra. Ici, vous pouvez nommer votre application « cpu-alert », puis choisir l'espace de travail Slack spécifique où vous souhaitez que les messages soient envoyés. J'ai déjà créé un espace de travail de test « test de fiabilité du site »
- Cliquez sur « Créer une application »
- Dans la section « Ajouter des caractéristiques et des fonctionnalités », sélectionnez « Webhooks entrants »
- Basculez le bouton d'activation du webhook entrant sur « activé ». Revenez en arrière et faites défiler jusqu'à la « section d'installation de l'application »
- Cliquez sur « Installer sur Workspace », puis nous choisirons le canal auquel nous voulons que Slack envoie des messages. Cliquez ensuite sur autoriser.
- Retournez à « Ajouter des fonctionnalités » et sélectionnez « Webhooks entrants »
- Faites défiler vers le bas pour trouver l'URL de notre webhook, puis copiez-la et collez-la dans notre code.
L'étape suivante consiste à créer un package de déploiement pour notre application Go
Nous allons construire l'application.
- Ouvrez un terminal dans le répertoire de travail du projet.run GOOS=linux go build -o main main.go
- Créer un fichier « bootstrap »
Créez un fichier nommé « bootstrap » dans le répertoire racine du projet avec le contenu suivant
#!/bin/sh
./main
Rendre le fichier bootstrap exécutable
- Exécutez chmod +x bootstrap
- Zippez l'exécutable et le fichier d'amorçage en exécutant zip function.zip main bootstrap
Téléchargement de la fonction lamba
- Accédez à la console de gestion AWS
- Recherchez lambda et créez une nouvelle fonction
- Donnez-lui un nom de votre choix
- Sélectionnez « Auteur à partir de zéro »
- Pour le runtime, sélectionnez Amazon Linux 2023
- Cliquez sur sélectionner la fonction
- Lorsque la création de la fonction est terminée, faites défiler vers le bas et localisez l'option « Télécharger depuis »
- Sélectionnez votre fichier function.zip PAS le dossier entier contenant le code
- Enregistrez-le
- Localisez la section des paramètres d'exécution et cliquez sur modifier
- Définissez le gestionnaire sur bootstrap et enregistrez-le
Dans l'étape suivante, nous configurerons un déclencheur pour la fonction Lambda. Ce déclencheur définit l'événement qui invitera la fonction à envoyer un message à Slack
Comme je l'ai mentionné plus tôt, ce déclencheur se produira lorsque l'utilisation du processeur d'une machine virtuelle est >= 50 %
Pour réaliser cette fonctionnalité, la première étape consiste à créer une instance EC2.
Une fois cela fait, nous devons configurer Cloudwatch pour surveiller et collecter des métriques
- Recherchez Cloudwatch et ouvrez-le
- Sélectionnez créer des alarmes
- Choisissez Sélectionner des métriques
- Sélectionnez ec2
- Sélectionnez les métriques par instance
- Sélectionnez la métrique CPUUtilization
Dans la rubrique état
- Sélectionnez Supérieur/Égal pour le seuil
- Définissez la valeur seuil comme « 50 »
- Cliquez sur suivant
Sur la page suivante, localisez la section de notification
- Nous laisserons le déclencheur de l’état d’alarme tel qu’il est « En alarme »
- Sélectionnez l'option « Créer un nouveau sujet »
- Entrez un nom unique, vous pouvez également saisir un email pour recevoir des notifications
- Sélectionnez Créer un sujet
- Sur la page suivante, entrez un nom d'alarme unique
Créez ensuite une alarme
Nous reviendrons à notre fonction lambda
- Sélectionnez « Ajouter un déclencheur »
- Dans le champ « Sélectionner une source », recherchez « sns » et sélectionnez-le
- Sélectionnez le sujet que vous avez créé précédemment et cliquez sur "ajouter"
### Tests
Nous avons fini de rassembler les différentes parties de notre infrastructure simple, il est maintenant temps de tester.
Pour tester que cela fonctionne, nous devons soumettre notre VM à une sorte de test de résistance. Ce test génère une charge CPU élevée. Pour effectuer ce test, nous allons utiliser l'outil « stress » sous Linux.
Tout d'abord, nous devons installer l'outil "stress" dans notre inatance EC2. Connectez-vous à l'instance EC2 et exécutez les commandes suivantes
sudo apt-get update
sudo apt-get install stress
Utilisez la commande suivante pour tester votre CPU
stress --cpu 4 --timeout 300
Cet exemple utilise 4 processeurs (nombre de processus ou de threads parallèles) pendant 300 secondes (5 minutes). Vous pouvez ajuster le nombre de travailleurs et de secondsa à votre guise.
Ouvrez Slack et attendez, vous devriez recevoir une alerte qui ressemble à ceci
Erreurs courantes que vous pourriez rencontrer
Lors de l'exécution de votre test de résistance, vous remarquerez peut-être que l'état de Cloudwatch passe à « données insuffisantes », ce qui peut retarder un peu l'alarme. Pour résoudre ce problème
- Ouvrez la console Cloudwatch
- Accédez aux alarmes et sélectionnez votre alarme spécifique
- Cliquez sur l'action puis modifiez
- Faites défiler jusqu'à la section de traitement des données manquantes
- Sélectionnez « Traiter les données manquantes comme ignorées (maintenir l'état actuel) »
- Enregistrer l'alarme
### Conclusion
Jusqu'à présent, nous avons exploré comment écrire et configurer une fonction Lambda simple dans Go. De plus, nous avons configuré CloudWatch pour surveiller et collecter des métriques, configuré des alarmes CloudWatch pour qu'elles se déclenchent lorsque des seuils spécifiques sont atteints et établi un sujet SNS pour recevoir ces alarmes. Le but du sujet SNS est de déclencher notre fonction Lambda, qui envoie un message Slack.
J'espère que vous avez trouvé cela agréable et instructif. S'il y a des erreurs ou si une partie n'a pas été expliquée clairement ou si vous pensez que j'ai raté quelque chose, n'hésitez pas à nous contacter. Vos commentaires sont très appréciés. Merci !
le lien vers le dépôt github se trouve ici
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!