Essayez d'exécuter Schedule pour démarrer et arrêter des instances dans AWS Lambda (Python)

introduction

Je voulais le faire depuis longtemps, mais quand j'ai pensé que ce serait génial de le faire en Java, Je n'ai pas écrit qu'AWS Lambda peut fonctionner en Python, donc Cela fait 3 mois que j'ai décidé de relever le défi.

Je l'ai essayé pendant que diverses personnes l'écrivaient.

Aperçu

Créer une table dans DynamoDB, définir les informations de balise pour l'heure et l'instance, Indiquez si vous souhaitez démarrer ou arrêter.

La fonction Lambda (Python) s'exécute toutes les 10 minutes, S'il correspond à l'heure des données stockées dans DynamoDB, Pour toutes les instances dont les informations de balise correspondent Démarrer ou arrêter.

Préparation

Créez une table "EC2" dans DynamoDB. Il y a quatre éléments. "Id" "Time" "Tag" "Start Stop".

  1. Id: numéro de séquence, veuillez vous assurer de commander
  2. Heure: Heure, format "% H:% M", par exemple "09:00"
  3. Tag: Tag de l'instance Saisissez le tag que vous souhaitez démarrer ou arrêter
  4. StartStop: indiquez si vous souhaitez démarrer ou arrêter.

Paramètres Lambda

  1. Le runtime est "Python 2.7"
  2. Codez plus tard ...
  3. Le gestionnaire convient
  4. Le rôle est OK s'il y a lecture / écriture dans DynamoDB et démarrage / arrêt et référence à EC2
  5. Je pense que la mémoire peut être de 128 Mo
  6. Le délai d'attente est approprié (10 secondes cette fois)

Lambda Function(Python)

Il y a certains points avec lesquels je me suis personnellement battu.

  1. "Filters = [{'Name': 'tag-key', 'Values': [tableInfo ['Tag']]}]» Je ne savais pas qu'il y avait un "[]" avant et après le "tableInfo ['Tag']"
  2. Il doit y avoir "['Items']" dans "table.scan () ['Items']" Sans cela, vous ne pouvez pas obtenir l'élément des données obtenues à partir de DynamoDB.
  3. Je ne sais pas pourquoi, mais ce doit être "boto3.client ('ec2')" Cela ne fonctionnait pas avec "boto3.resource ('ec2')"
  4. Il semble que "from boto3.dynamodb.conditions import Key, Attr" est requis

Et le code est le suivant.

import boto3
import datetime
from boto3.dynamodb.conditions import Key, Attr

def lambda_handler(event, context):
    # create EC2 client
    ec2 = boto3.client('ec2')
    # get the time(%H:%M)
    timeInfo = datetime.datetime.now().strftime("%H:%M")
    tableInfoList = getTableInfoList(timeInfo)
    instanceList = getInstanceStartStopList(ec2, tableInfoList)
    executeInstanceStartStop(ec2, instanceList)

# get the list of data (Id, StartEnd, Tag, Time)
#     Id       : Sequence
#     StartEnd : "start" or "stop"
#     Tag      : Tag-key
#     Time     : %H:%M  ex) 09:00
# @param timeInfo
# @return list of data(Id, StartEnd, Tag, Time)
def getTableInfoList(timeInfo):
    dynamodb = boto3.resource('dynamodb')
    #Set TableName
    table    = dynamodb.Table('EC2')
    #Send the Query
    #Query Parameter
    #   @param TimeInfo : [hh:mm]
    #TimeInfo = "09:00"
    tableInfoList = table.scan(
            FilterExpression=Attr('Time').eq(timeInfo)
        )['Items']
    return tableInfoList

# get the list of data (Start or Stop Instance Ids)
# @param ec2
# @param tableInfoList
# @return instanceList Dictionaly('start', 'stop')
def getInstanceStartStopList(ec2, tableInfoList):
    startInstanceIdList = []
    stopInstanceIdList  = []
    for tableInfo in tableInfoList:
        for reservation in ec2.describe_instances(Filters=[{'Name':'tag-key','Values':[tableInfo['Tag']]}])["Reservations"]:
            for instance in reservation["Instances"]:
                if (tableInfo['StartStop'] == 'start'):
                    startInstanceIdList.append(instance["InstanceId"])
                elif (tableInfo['StartStop'] == 'stop'):
                    stopInstanceIdList.append(instance["InstanceId"])
    instanceList = {"start":startInstanceIdList, "stop":stopInstanceIdList}
    return instanceList

# Start of Stop Instances
# @param ec2
# @param instanceList
def executeInstanceStartStop(ec2, instanceList):
    startInstanceIdList = instanceList["start"]
    stopInstanceIdList  = instanceList["stop"]

    if not len(startInstanceIdList) == 0:
        ec2.start_instances(InstanceIds=startInstanceIdList)

    if not len(stopInstanceIdList) == 0:
        ec2.stop_instances(stopInstanceIdList)

J'ai réussi à le faire par essais et erreurs.

à partir de maintenant

A partir de maintenant, je pense à faire quelque chose qui accompagne ça.

  1. Script qui peut enregistrer / mettre à jour / supprimer / afficher les données DynamoDB
  2. Enregistrer / mettre à jour / supprimer / afficher les données DynamoDB avec HTML statique + JS avec S3
  3. Exécution en temps réel avec API Gateway + Lambda

Je ne sais pas quand ce sera. .. ..

Recommended Posts

Essayez d'exécuter Schedule pour démarrer et arrêter des instances dans AWS Lambda (Python)
Publié en tant que pièce jointe à Slack sur AWS Lambda (Python)
Exécutez Python selon la planification sur AWS Lambda
Précautions lors de l'exécution de Python sur EC2 à partir d'AWS Lambda (Exécuter la commande)
Création d'un environnement pour exécuter ChainerMN sur une instance de GPU AWS
[Python] Créez un linebot pour écrire le nom et l'âge sur l'image
Exécutez régulièrement des programmes Python sur AWS Lambda
Essayez Tensorflow avec une instance GPU sur AWS
Utilisez AWS lambda pour récupérer les actualités et notifier régulièrement LINE des mises à jour [python]
Une histoire d'essayer d'installer uwsgi sur une instance EC2 et d'échouer
# 2 Créez un environnement Python avec une instance EC2 d'AWS (ubuntu18.04)
Je veux AWS Lambda avec Python sur Mac!
Une petite histoire à savoir comme un point addictif lors de l'écriture d'applications Twilio à l'aide de Python sur AWS Lambda
[AWS] Essayez d'ajouter la bibliothèque Python à la couche avec SAM + Lambda (Python)
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python
Essayez d'automatiser le démarrage / l'arrêt des instances EC2 avec AWS Lambda
Création d'un environnement pour exécuter des programmes Python sur AWS EC2
[Python] Permet d'importer les packages pip3 sur AWS Lambda
Essayez simplement de recevoir un webhook avec ngrok et Python
Comment créer des couches AWS Lambda lors de l'exécution de sélénium × chrome sur AWS Lambda
Python 3.6 sous Windows ... et vers Xamarin.
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
Un jeu pour partir à l'aventure en mode interactif de python
xgboost (python) sur l'environnement d'instance EC2 Spot préparé par AWS Lambda
# 3 Créez un environnement Python (Django) avec une instance EC2 (ubuntu18.04) d'AWS part2
Essayez d'extraire une chaîne de caractères d'une image avec Python3
Déguisez l'herbe sur GitHub et essayez de devenir ingénieur.
Préparer un environnement pour utiliser OpenCV et Pillow avec AWS Lambda
La route pour installer Python et Flask sur un PC hors ligne
[Python] J'ai écrit une API REST en utilisant AWS API Gateway et Lambda.
[Pour Python] Créez rapidement un fichier de téléchargement vers AWS Lambda Layer
Je suis mort en pensant qu'une variable de classe Python était une variable d'instance
Tout, de la création d'un environnement Python à son exécution sous Windows
[AWS lambda] Déployer, y compris diverses bibliothèques avec lambda (générer un zip avec un mot de passe et le télécharger vers s3) @ Python
Mettez Cabocha 0.68 dans Windows et essayez d'analyser la dépendance avec Python
[AWS] Créez un environnement Python Lambda avec CodeStar et faites Hello World
Essayez de créer foldl et foldr avec Python: lambda. Aussi mesure du temps
Essayez de créer un environnement python et anaconda sur Mac (avec pyenv, conda)
Essayez d'écrire du code python pour générer du code go - Essayez de porter JSON-to-Go et ainsi de suite
Comment arrêter le programme jusqu'à une date et une heure spécifiques en python
Migrer les applications Django exécutées sur Python 2.7 vers Python 3.5
Exécutez TensorFlow sur une instance GPU sur AWS
Installer Anaconda Python sur une instance ECS
[Python] Exécutez Headless Chrome sur AWS Lambda
Connectez-vous à s3 avec AWS Lambda Python
[Python] J'ai créé un script qui coupe et colle automatiquement les fichiers du PC local sur un SSD externe.
Essayez d'implémenter un robot Cisco Spark avec AWS Lambda + Amazon API Gateway (Python)
[Python] Combiner des listes contenant des nombres en chaînes et les écrire dans un fichier de sortie
N'hésitez pas à transformer Python en utilisant la bibliothèque en une fonction AWS Lambda
WEB grattage avec python et essayez de créer un nuage de mots à partir des critiques
Une histoire de compilation croisée d'un package Python pour AWS Lambda et de son déploiement sans serveur
Créez des paramètres dans terraform pour envoyer des messages depuis AWS Lambda Python3.8 vers Slack
J'ai essayé d'utiliser Twitter Scraper avec AWS Lambda et cela n'a pas fonctionné.
Un mémo qui a fait un tutoriel pour exécuter python sur heroku
Envisagez une application WebSocket native pour le cloud qui s'exécute sur AWS
Calculons en fait le problème statistique avec Python