Utilisons AWS Lambda pour créer un mécanisme pour notifier Slack lorsque la valeur surveillée par CloudWatch est dépassée sur Python

introduction

Je parle à l'intérieur de l'entreprise, «Ramu mais Ramu», et pour moi, un ancien C #, est-ce un langage de programmation? J'ai pensé, mais ce n'était pas le cas. (Il existe une expression lambda en C #.)

En interne, j'ai placé le runtime node.js sur AWS Lambda et l'ai notifié de slack, mais on m'a dit que la version du node est ancienne et que je vais bientôt arrêter de la prendre en charge, j'ai donc décidé de passer à Python. (Parce qu'il y avait une personne dans l'entreprise qui connaissait Python mieux que node)

AWS Lambda fournit un traitement commun sous forme de modèles, c'est donc assez facile à faire. Je vais résumer la procédure.

Etapes de configuration

Suivez à peu près les étapes ci-dessous.

  1. Création de la fonction Lambda
  2. Création de SNS et liaison avec Lambda
  3. Coopération entre EC2 et SNS
  4. Codage
  5. Test

Diagramme

Le résultat final sera quelque chose comme ça.

aws.png

procédure

1. Création d'une fonction Lambda

Créez cette fois la fonction Lambda principale. Vous pouvez facilement le faire en suivant les instructions. Soyez assuré que vous pouvez facilement le recréer ou le supprimer.

Sélectionnez Lambda dans la liste des services.

①.png

Commencez à créer la fonction Lambda.

②.png

Si vous saisissez slack dans le filtre, vous pouvez créer un modèle pour slack, mais cette fois, nous le créerons avec des espaces.

③.png

Nous définirons le déclencheur plus tard, alors laissez-le vide.

④.png

2. Création de SNS et liaison avec Lambda

SNS = Service de notification simple. C'est un service qui reçoit un traitement ou un changement de statut et vous notifie sous forme de message. Vous pouvez envoyer des messages aux e-mails et à Lamda comme celui-ci. Le service lui-même n'a pas été traduit au 06 avril 2017, mais je pense qu'il n'y a pas de problème car il est simple en anglais.

Créez un SNS et joignez l'abonnement.

Créez des abonnements.

AWS_SNS.png

Sélectionnez la fonction Lambda que vous venez de créer

AWS_SNS.png

3. Coopération entre EC2 (Cloud Watch) et SNS

Réglez l'alarme à partir de l'écran EC2.

EC2_Management_Console.png

4. Codage

Effectuer divers réglages

Les paramètres sont les suivants.

Cette fois, je l'ai réglé comme suit.

Lambda_Management_Console.png

@code

lambda_handler.py


from __future__ import print_function

import boto3
import json
import logging
import os

from urllib2 import Request, urlopen, URLError, HTTPError

#paramètres de relâchement
SLACK_CHANNEL = os.environ['SLACK_CHANNEL']
HOOK_URL      = os.environ['HOOK_URL']

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def lambda_handler(event, context):
    logger.info("Event: " + str(event))
    message = json.loads(event['Records'][0]['Sns']['Message'])
    logger.info("Message: " + str(message))

    alarm_name  = message['AlarmName']
    description = message['AlarmDescription']
    new_state   = message['NewStateValue']
    reason      = message['NewStateReason']

    if new_state == 'OK':
        emoji = ":+1:"
    elif new_state == 'ALARM':
        emoji = ":exclamation:"
        
    slack_message = {
        'channel': SLACK_CHANNEL,
        'text': "*%s %s: %s*\n %s\n %s" % (emoji, new_state, alarm_name, description, reason)
    }

    req = Request(HOOK_URL, json.dumps(slack_message))
    try:
        response = urlopen(req)
        response.read()
        logger.info("Message posted to %s", slack_message['channel'])
    except HTTPError as e:
        logger.error("Request failed: %d %s", e.code, e.reason)
    except URLError as e:
        logger.error("Server connection failed: %s", e.reason)

@ Variable d'environnement + Arufa

Lambda_Management_Console_1.png

5. Test

À partir de l'écran Lambda, procédez comme suit:

  1. Action → Réglage de l'événement de test → Entrée de l'événement de test
  2. Enregistrez et testez

C'est Miso, mais j'espère que vous pourrez vous y référer pour les données de test.

Résultat d'exécution

Une notification a été envoyée avec succès au canal sandbox. Il contient également des pictogrammes.

Slack_-_eversense.png

en conclusion

J'ai pu réaliser une notification de relâchement avec un programme simple. Définissez les métriques de manière appropriée et profitez d'une vie AWS confortable. (Même si vous me prévenez, cela n'a aucun sens si vous le regardez ...)

De plus, il semble que seul le SNS créé dans la même région puisse être défini à partir de Lambda, donc si vous souhaitez traverser des régions, sélectionnez Lambda à partir du SNS de chaque région.

Au début, j'ai essayé d'utiliser les variables d'environnement de Lambda, mais je n'ai pas pu l'utiliser car j'ai eu une erreur autour de base64. Si vous pouvez l'utiliser, la fonction Lambda peut être facilement réutilisée, je vais donc m'en occuper correctement à la prochaine occasion.

Recommended Posts

Utilisons AWS Lambda pour créer un mécanisme pour notifier Slack lorsque la valeur surveillée par CloudWatch est dépassée sur Python
Notification Slack lorsqu'un mot spécifique est murmuré sur Twitter en utilisant Heroku avec python
Utilisez AWS lambda pour récupérer les actualités et notifier régulièrement LINE des mises à jour [python]
python Comment notifier automatiquement par téléphone lorsque le système tombe en panne
Utilisation pratique des couches lors du chargement de bibliothèques sur Lambda
Créez des paramètres dans terraform pour envoyer des messages depuis AWS Lambda Python3.8 vers Slack
Tutoriel "Cython" qui rend Python explosif: Gérer le passage de fonctions côté C ++ par référence.
Une petite histoire à savoir comme un point addictif lors de l'écriture d'applications Twilio à l'aide de Python sur AWS Lambda
Publié en tant que pièce jointe à Slack sur AWS Lambda (Python)
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
À propos de l'erreur que j'ai rencontrée en essayant d'utiliser Adafruit_DHT à partir de Python sur Raspberry Pi
Précautions lors de l'exécution de Python sur EC2 à partir d'AWS Lambda (Exécuter la commande)
Que faire lorsque le type de valeur est ambigu en Python?
ImportError lors de la tentative d'utilisation du package gcloud avec la version AWS Lambda Python
Notifier Slack lorsque le processus d'apprentissage automatique en cours d'exécution sur GCP est terminé
Notifier slack lorsque la page de vente du commutateur est mise à jour ~ développement de bot slack avec python ③ ~
Le format du message obtenu par Slack API est subtilement difficile à utiliser
Fonction Lambda (version python) qui décompresse et génère des éléments dans CloudWatch Logs lorsqu'un fichier compressé est téléchargé vers s3
Exécutez régulièrement des programmes Python sur AWS Lambda
[Introduction à AWS] Le premier Lambda est Transcribe ♪
Remarque Python: lors de l'attribution d'une valeur à une chaîne
Résumé de l'étude de Python pour utiliser AWS Lambda
[Python] Lancer un message sur le canal Slack
Une histoire bloquée lors de la tentative de mise à niveau de la version Python avec GCE
Lorsque vous connectez SSD à Linux et créez un serveur de fichiers, il est préférable d'utiliser NTFS.
Créez un script python pour vérifier si le lien à l'URL spécifiée est valide
C'était une vie que je voulais faire de l'OCR sur AWS Lambda pour localiser les personnages.
Comment mettre Pyenv sur Amazon Linux et Ubuntu pour créer un environnement Python 3.6.0
Essayez d'exécuter Schedule pour démarrer et arrêter des instances dans AWS Lambda (Python)
Utilisez AWS Lambda + LINE Notify pour avertir LINE de ne pas oublier votre parapluie lorsque vous rentrez chez vous
Instructions d'utilisation de l'interface de ligne de commande AWS (Python / awscli) sous Mac OS X
Utilisez l'API Twitter pour réduire le temps nécessaire à Twitter (créer une chronologie de mise en évidence (comme))
Ajouter une fonction pour indiquer la météo d'aujourd'hui au bot slack (fabriqué par python)
Vérifiez types_map lors de l'utilisation de mimetypes avec AWS Lambda (Python)
Créer une couche pour AWS Lambda Python dans Docker
Re: Python lambda est inutile ^ H ^ H ^ H ^ H ^ H Difficile à utiliser
J'ai essayé de créer une API RESTful en connectant l'API rapide du framework Python explosif à MySQL.
Lorsqu'une chaîne de caractères d'une certaine série se trouve dans la clé du dictionnaire, la chaîne de caractères est convertie en valeur du dictionnaire.
J'ai écrit un script pour créer rapidement un environnement de développement pour Twitter Bot avec AWS Lambda + Python 2.7