[PYTHON] Créez un bot avec AWS Lambda qui démarre / arrête automatiquement les instances avec des balises spécifiques

Mots magiques, économies

――Lors de l'utilisation d'EC2 pour l'environnement de développement, il est facile d'oublier l'arrêt de l'instance lors du retour à la maison. «Il semble qu'il y ait un dicton:" Si la poussière s'accumule, elle devient une montagne. "

Références des ancêtres, etc.

―― J'espère que vous pouvez avoir une idée des paramètres de rôle et d'interface graphique ici. [Méthode de classe] J'ai essayé de démarrer et d'arrêter automatiquement EC2 dans l'événement de planification de Lambda [Évitez d'oublier d'arrêter ou de supprimer EC2, RDS et ELB! Événement de planification Lambda] (http://dev.classmethod.jp/cloud/aws/lambda-scheduled-event-info/ "Évitez d'oublier d'arrêter ou de supprimer EC2, RDS, ELB! Événement LambdaSchedule")

Ce que je veux faire cette fois

En semaine ou samedi, dimanche ou jours fériés

--Pour le jugement des jours de la semaine ou des samedis et dimanches, si vous spécifiez MON-FRI dans ScheduleEvent (cron) de Lambda, il ne peut être exécuté que les jours de la semaine, mais si nécessaire en raison du problème UTC décrit plus tard, date standard python.weekday () etc. utilisation ――Il existe différentes façons de juger les vacances, mais au final, je me fie aux vacances japonaises de Google Agenda. Donc, j'ai un module python créé par Google, donc je vais l'utiliser. [google-api-python-client] (https://github.com/google/google-api-python-client "google-api-python-client")

Lorsque vous utilisez un module externe avec Lambda, compressez-le et téléchargez l'intégralité du code

--Lambda a deux façons d'écrire du code, l'une consiste à écrire lors de l'édition en ligne sur le navigateur, et l'autre consiste à compresser chaque module et à télécharger le code si vous souhaitez utiliser un module externe. --Google-api-python-client ne peut pas être utilisé, bien sûr, alors installez-le localement dans n'importe quel répertoire avec pip.

cd [Annuaire approprié]
sudo pip install --upgrade google-api-python-client -t ./

#Ecrire le fichier principal à exécuter sur Lambda dans le même répertoire
vim hoge.py

hoge.py


import boto3
import datetime
import sys

from apiclient.discovery import build


# https://console.developers.google.com/projet d'ici
API_KEY = '[Clé API de développement Google]'
CALENDAR_ID = 'ja.japanese#[email protected]'

#Les vacances de fin d'année et de nouvel an et les vacances d'entreprise ne démarrent pas automatiquement(YYYY-MM-Énumérer avec DD)。
company_holiday_list = []


#Nom de la fonction(Ici lambda_handler)Et le nom du fichier(Ici hoge.py)À
#Définir le nom du gestionnaire de Lambda ex.) hoge.lambda_handler
def lambda_handler(event, context):
    client = boto3.client('ec2')

    #Démarre automatiquement lorsque le nom de la balise «Arrêt automatique» est AUTO/Arrêtez
    #Si le nom de tag «Arrêt automatique» est activé, seul l'arrêt automatique est effectué.
    query_start = [
        {'Name': 'tag:AutoShutdown', "Values": ['AUTO']},
        {'Name': 'instance-state-name', "Values": ['stopped']}
    ]
    query_stop = [
        {'Name': 'tag:AutoShutdown', "Values": ['ON', 'AUTO']},
        {'Name': 'instance-state-name', "Values": ['running']}
    ]

    service = build(serviceName='calendar', version='v3', developerKey=API_KEY)
    events = service.events().list(calendarId=CALENDAR_ID).execute()
    holiday_list = []

    for item in events['items']:
        holiday_list.append(item['start']['date'])

    holiday_list.extend(company_holiday_list)

    #Confirmation du nom de l'événement de la source d'allumage
    try:
        #En cas de démarrage automatique, ne fonctionne que les jours de semaine sauf les samedis, dimanches et jours fériés
        if '[ARN de la source de l'événement(ScheduleEvent pour le démarrage automatique)Copie]' in event['resources']:
            if not str(datetime.date.today()) in holiday_list:
                client.start_instances(InstanceIds=get_instanceid(query_start))

        elif '[ARN de la source de l'événement(ScheduleEvent pour arrêt automatique)Copie]' in event['resources']:
            client.stop_instances(InstanceIds=get_instanceid(query_stop))

        elif '[ARN de la source de l'événement(ScheduleEvent pour l'arrêt automatique X minutes notification à l'avance)Copie]' in event['resources'] \
                and (not str(datetime.date.today()) in holiday_list):
            #Il est préférable d'écrire ici un processus qui vous informe de Slack 5 ou 10 minutes à l'avance.(Arrêt automatique de la prévention des explosions)

    except Exception as e:
        #La gestion des erreurs. Comme jeter une trace de pile dans Slack.

    print("SUCCESS: task succeeded")
    return


def get_instanceid(query):
    client = boto3.client('ec2')
    response = client.describe_instances(Filters=query)

    ec2_count = len(response['Reservations'])
    ec2_list = []

    if not ec2_count == 0:
        for i in range(0, ec2_count):
            ec2_list.append(response['Reservations'][i]['Instances'][0]['InstanceId'])
        return ec2_list
    else:
        print("SUCCESS: specified hosts is None")
        sys.exit()

--Télécharger le code vers Lambda

zip -r ~/hoge.zip .
aws lambda update-function-code --function-name [Nom de la fonction défini lors de la création de Lambda] --zip-file fileb://~/hoge.zip

Supplément temporaire

-Veuillez réécrire [Event source ARN] dans votre propre environnement m (_ _) m La partie ARN dans l'image ci-dessous est un copier-coller. hoge.png --Je ne veux pas diviser les fonctions Lambda en plusieurs fonctions par démarrage / arrêt automatique, donc Branche s'il s'agit de démarrage ou d'arrêt en fonction de l'événement source de déclenchement (nom ScheduleEvent). --Lambda's Schedule Event est UTC, alors soyez prudent lorsque vous le définissez et le manipulez! Par exemple, je veux que JST démarre automatiquement à 8 heures du matin! Dans ce cas, si c'est UTC, la date changera de JST, donc elle ne démarrera pas automatiquement.

Recommended Posts

Créez un bot avec AWS Lambda qui démarre / arrête automatiquement les instances avec des balises spécifiques
J'ai écrit un bot Slack qui notifie les informations de retard avec AWS Lambda
Créer une couche pour AWS Lambda Python dans Docker
Créez un bot Mastodon avec une fonction pour répondre automatiquement avec Python
J'ai écrit un script pour créer rapidement un environnement de développement pour Twitter Bot avec AWS Lambda + Python 2.7
[AWS] Créer une API avec API Gateway + Lambda
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
Comment créer une API de machine learning sans serveur avec AWS Lambda
Créez un BOT qui peut appeler des images enregistrées avec Discord comme des pictogrammes
[AWS] Créez un environnement Python Lambda avec CodeStar et faites Hello World
Créons une fonction de chat avec Vue.js + AWS Lambda + dynamo DB [Paramètres AWS]
Créez un bot qui stimule les tendances Twitter
Créer un référentiel privé avec AWS CodeArtifact
Essayez d'implémenter un robot Cisco Spark avec AWS Lambda + Amazon API Gateway (Python)
[AWS SAM] Créer une API avec DynamoDB + Lambda + API Gateway
Créer un LINE BOT avec Minette pour Python
Créer une page qui se charge indéfiniment avec python
LINE BOT avec Python + AWS Lambda + API Gateway
Étapes pour créer un bot Twitter avec Python
Créez un bot discord qui notifie unilatéralement avec python (seuls les requêtes et json sont utilisés)
[AWS] J'ai créé un BOT de rappel avec LINE WORKS
Créez un chatbot prenant en charge la saisie gratuite avec Word2Vec
Procédure de création d'un Line Bot sur AWS Lambda
Créez un bot qui ne renvoie que le résultat de l'analyse morphologique avec MeCab avec Discord
Créer un bot slack
Créez une application Web qui reconnaît les nombres avec un réseau neuronal
Créez une PythonBox qui sort avec Random après l'entrée PEPPER
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
Créez une application d'apprentissage automatique avec ABEJA Platform + LINE Bot
Créons un script qui s'enregistre avec Ideone.com en Python.
Créez un jeu de vie mis à jour manuellement avec tkinter
Créez un Twitter BOT avec le SDK GoogleAppEngine pour Python
Essayez d'automatiser le démarrage / l'arrêt des instances EC2 avec AWS Lambda
Je viens de créer un environnement virtuel avec la couche AWS lambda
Tornado - Créons une API Web qui renvoie facilement JSON avec JSON
Créez une API Web capable de fournir des images avec Django
Créez rapidement une API avec Python, lambda et API Gateway à l'aide d'AWS SAM
[AWS] J'ai créé un BOT de rappel avec LINE WORKS (implémentation)
L'histoire de la création d'un Bot qui affiche les membres actifs dans un canal spécifique de Slack avec Python