[PYTHON] Création d'un bot Slack qui confirme et notifie à AWS Lambda la date d'expiration d'un certificat SSL

introduction

Actuellement, le certificat SSL du serveur que j'ai en privé est défini avec Let's Encrypt. Let's Encrypt vous informera par e-mail de la date d'expiration du certificat, mais s'il s'agit d'un e-mail, il peut être enterré avec d'autres e-mails et une omission de confirmation peut se produire.

** Si vous le mettez à jour automatiquement, oui! Je pense qu'il y a quelque chose comme **, mais cette fois je vais l'ignorer

environnement

local

AWS

Dépôt

https://github.com/nnsnodnb/slackbot_ssl_expiration

Préparation

«Applications et intégrations» doit être défini sur «Bots»

Bots___ひやかしプロジェクト_Slack.png

Bibliothèque

requirements.txt


appdirs==1.4.3
packaging==16.8
pyparsing==2.2.0
requests==2.13.0
six==1.10.0
slacker==0.9.42

Source de l'échantillon

bot.py


from slacker import Slacker
import datetime
import socket
import ssl
import slack_settings #Slack dans le même répertoire_settings.Placer py


slack = Slacker(slack_settings.SLACK_API_TOKEN)


def ssl_valid_time_remaining(hostname):
    expires = ssl_expiry_datetime(hostname)
    return expires - datetime.datetime.utcnow()


def ssl_expires_in(hostname, buffer_days=7):  #Date limite succursale 7 jours à l'avance
    remaining = ssl_valid_time_remaining(hostname)
    if remaining < datetime.timedelta(days=0):
        raise AlreadyExpired("Cert expired %s days ago" % remaining.days)
    elif remaining < datetime.timedelta(days=buffer_days):
        return True
    else:
        return False


def ssl_expiry_datetime(hostname):
    ssl_date_fmt = r'%b %d %H:%M:%S %Y %Z'
    context = ssl.create_default_context()

    conn = context.wrap_socket(
            socket.socket(socket.AF_INET),
            server_hostname=hostname,
    )

    conn.settimeout(3.0)
    conn.connect((hostname, 443))
    ssl_info = conn.getpeercert()
    return datetime.datetime.strptime(ssl_info['notAfter'], ssl_date_fmt)  # ssl_info['notAfter']Est la date d'expiration du certificat


def post_slack(hostname):
    message = '@channel https://' + hostname + ' '
    if ssl_expires_in(hostname):
        message += 'Il est temps de se débarrasser de'
    else:
        message += 'Est toujours dans le délai' 

    #Les méthodes ici utilisent le package slacker
    slack.chat.post_message(
            '#expiration',
            message,
            as_user=True,
            link_names=True
    )


def execute(event, context):
    post_slack('<YOUR DOMAIN>')

slack_setting.py


SLACK_API_TOKEN = ''

Exécutez localement

$ python bot.py

スクリーンショット_2017-06-07_17_21_48.png

Cette fois encore, M. Yo Watanabe était en charge de la notification.

Paramètres Lambda

Lambda_Management_Console.png

  1. Paramètres de déclenchement Lambda_Management_Console.png Réglez comme vous le souhaitez. J'ai sélectionné le paramètre pour être notifié à 2h00 du lundi au vendredi avec cron.
  2. Saisissez correctement le nom de la fonction
  3. Sélectionnez «Python 3.6» pour «runtime»
  4. Le téléchargement du code source est expliqué ci-dessous
  5. Entrez bot.execute pour handler
  6. Les rouleaux, etc. sont réglés individuellement

Réflexion de bibliothèque externe

Dans l'environnement local, les commandes suivantes, etc. sont assez bonnes,

Environnement local


$ pip install -r requirements.txt

Étant donné que la bibliothèque n'est pas reconnue sur AWS Lambda, vous devez télécharger la bibliothèque externe entière.

Enregistrez la bibliothèque externe dans le répertoire du projet


$ pip install <LIBRARY_NAME> -t .

Si vous faites quelque chose comme ça, il sera enregistré dans le répertoire du projet. Cependant, il est difficile de le faire un par un, alors j'ai fait ce qui suit.

$ pip freeze > requirements.txt  # requirements.Sans txt
$ pip install -r requirements.txt -t .

Puis compresser et télécharger

$ zip -r bot.zip *  # bot.zip est votre nom préféré

Puisque bot.zip est créé dans le répertoire du projet, sélectionnez Télécharger fichier .ZIP pour télécharger bot.zip`.

スクリーンショット 2017-06-07 17.41.57.png

Si les paramètres sont corrects, Slack sera averti à l'heure définie! Dans mon environnement, M. Yo Watanabe vous informera du «lundi au vendredi 2h00» comme mentionné ci-dessus! !!

Recommended Posts

Création d'un bot Slack qui confirme et notifie à AWS Lambda la date d'expiration d'un certificat SSL
Script pour obtenir la date d'expiration du certificat SSL
Création d'un bot Slack qui confirme et notifie à AWS Lambda la date d'expiration d'un certificat SSL
J'ai fait un bot mou qui m'informe de la température
J'ai écrit un bot Slack qui notifie les informations de retard avec AWS Lambda
[Discode Bot] J'ai essayé de créer un Bot qui me dit la valeur de race de Pokemon
Script pour obtenir la date d'expiration du certificat SSL
J'ai créé une application avec Lambda qui notifie LINE de "j'aime" à l'aide de l'API Qiita.
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
J'ai créé un Linebot qui m'informe des sites d'évacuation à proximité sur AWS
Un programme qui notifie l'état de fonctionnement des équipements de photographie d'usine entièrement automatiques
Créez un BOT qui raccourcit l'URL Discord
LINE Bot qui vous informe des stocks d'intérêt
J'ai fait un bouton IFTTT qui déverrouille l'entrée 2 lock sésame avec 1 bouton (via AWS Lambda)
Lorsque j'ai créé un scan ECR à partir d'un CDK, je pouvais voir l'arrière du scan
Comment créer un LINE BOT 004 interactif (répondre à la date de clôture d'une société cotée)
L'histoire de la création d'un Bot qui affiche les membres actifs dans un canal spécifique de Slack avec Python
J'ai créé un bot LINE qui me dit le type et la force de Pokémon dans la région de Garal avec Heroku + Flask + PostgreSQL (Heroku Postgres)
Une histoire à laquelle j'étais accro à appeler Lambda depuis AWS Lambda.
Une formule qui calcule simplement l'âge à partir de la date de naissance
Créez une application qui informe LINE de la météo tous les matins
[Python] J'ai écrit une API REST en utilisant AWS API Gateway et Lambda.
[Pour les débutants] Je veux obtenir l'index d'un élément qui satisfait une certaine expression conditionnelle
(Python) J'ai créé une application de Trello qui notifie périodiquement le relâchement des tâches sur le point d'expirer.
Utilisez AWS lambda pour récupérer les actualités et notifier régulièrement LINE des mises à jour [python]
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo
J'ai fait une étude préliminaire de l'API pour recevoir les webhooks d'entrée / sortie de réunion Zoom dans Lambda (1)