Versuchen Sie, Schedule auszuführen, um Instanzen in AWS Lambda (Python) zu starten und zu stoppen.

Einführung

Ich wollte es schon lange machen, aber als ich dachte, es wäre großartig, es in Java zu machen, Ich habe nicht geschrieben, dass AWS Lambda in Python ausgeführt werden kann Es ist 3 Monate her, seit ich mich entschlossen habe, die Herausforderung anzunehmen.

Ich habe es versucht, während verschiedene Leute es geschrieben haben.

Überblick

Erstellen Sie eine Tabelle in DynamoDB, Tag-Informationen für Zeit und Instanz festgelegt. Geben Sie ein, ob gestartet oder gestoppt werden soll.

Die Lambda-Funktion (Python) wird alle 10 Minuten ausgeführt. Wenn es mit der Zeit der in DynamoDB gespeicherten Daten übereinstimmt, Für alle Instanzen, deren Tag-Informationen übereinstimmen Starten oder stoppen.

Vorbereitung

Erstellen Sie eine Tabelle "EC2" in DynamoDB. Es gibt vier Elemente. "Id" "Time" "Tag" "Start Stop".

  1. Id: Sequenznummer, bitte unbedingt bestellen
  2. Zeit: Zeit, Format "% H:% M", z. B. "09:00"
  3. Tag: Tag der Instanz Geben Sie das Tag ein, das Sie starten oder stoppen möchten
  4. StartStop: Geben Sie ein, ob gestartet oder gestoppt werden soll.

Lambda-Einstellungen

  1. Laufzeit ist "Python 2.7"
  2. Code später ...
  3. Handler ist geeignet
  4. Die Rolle ist in Ordnung, wenn DynamoDB gelesen / geschrieben und gestartet / gestoppt und auf EC2 verwiesen wird
  5. Ich denke, der Speicher kann 128 MB sein
  6. Timeout ist angemessen (diesmal 10 Sekunden)

Lambda Function(Python)

Es gibt einige Punkte, mit denen ich persönlich zu kämpfen hatte.

  1. "Filter = [{'Name': 'Tag-Schlüssel', 'Werte': [tableInfo ['Tag']]}]" Ich wusste nicht, dass es vor und nach dem "tableInfo ['Tag']" ein "[]" gibt.
  2. In "table.scan () ['Items']" muss "['Items']" enthalten sein. Ohne dies können Sie das Element der von DynamoDB erhaltenen Daten nicht abrufen.
  3. Ich weiß nicht warum, aber es muss "boto3.client ('ec2')" sein. Es hat nicht funktioniert mit "boto3.resource ('ec2')"
  4. Es scheint, dass "von boto3.dynamodb.conditions Import Key, Attr" erforderlich ist

Und der Code ist wie folgt.

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)

Ich habe es mit Versuch und Irrtum geschafft.

von jetzt an

Von nun an denke ich darüber nach, etwas zu machen, das dies begleitet.

  1. Skript, das DynamoDB-Daten registrieren / aktualisieren / löschen / anzeigen kann
  2. Registrieren / Aktualisieren / Löschen / Anzeigen von DynamoDB-Daten mit statischem HTML + JS mit S3
  3. Echtzeitausführung mit API Gateway + Lambda

Ich weiß nicht wann es sein wird. .. ..

Recommended Posts

Versuchen Sie, Schedule auszuführen, um Instanzen in AWS Lambda (Python) zu starten und zu stoppen.
Gepostet als Anhang zu Slack auf AWS Lambda (Python)
Führen Sie Python planmäßig auf AWS Lambda aus
Vorsichtsmaßnahmen beim Ausführen von Python unter EC2 über AWS Lambda (Befehl ausführen)
Erstellen einer Umgebung zum Ausführen von ChainerMN auf einer AWS-GPU-Instanz
[Python] Erstellen Sie einen Linebot, um den Namen und das Alter auf das Bild zu schreiben
Führen Sie regelmäßig Python-Programme auf AWS Lambda aus
Versuchen Sie Tensorflow mit einer GPU-Instanz unter AWS
Verwenden Sie AWS Lambda, um Nachrichten zu kratzen und LINE regelmäßig über Updates zu informieren [Python]
Eine Geschichte über einen Versuch, uwsgi auf einer fehlgeschlagenen EC2-Instanz zu installieren
# 2 Erstellen Sie eine Python-Umgebung mit einer EC2-Instanz von AWS (ubuntu18.04).
Ich möchte Lambda mit Python auf Mac AWS!
Eine kleine Geschichte, die beim Schreiben von Twilio-Anwendungen mit Python auf AWS Lambda süchtig macht
[AWS] Versuchen Sie, die Python-Bibliothek mit SAM + Lambda (Python) zur Ebene hinzuzufügen.
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
Versuchen Sie, Start / Stop für EC2-Instanzen mit AWS Lambda zu automatisieren
Erstellen einer Umgebung zum Ausführen von Python-Programmen unter AWS EC2
[Python] Ermöglicht den Import von pip3-Paketen in AWS Lambda
Versuchen Sie einfach, einen Webhook mit ngrok und Python zu erhalten
So erstellen Sie AWS Lambda-Schichten, wenn Selen × Chrom auf AWS Lambda ausgeführt wird
Python 3.6 unter Windows ... und zu Xamarin.
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Ein Spiel für ein Abenteuer im interaktiven Python-Modus
xgboost (Python) in einer von AWS Lambda erstellten EC2 Spot-Instanzumgebung
# 3 Erstellen Sie eine Python-Umgebung (Django) mit einer EC2-Instanz (ubuntu18.04) von AWS part2
Versuchen Sie, mit Python3 eine Zeichenfolge aus einem Bild zu extrahieren
Verkleide das Gras auf GitHub und versuche Ingenieur zu werden.
Bereiten Sie eine Umgebung für die Verwendung von OpenCV und Pillow mit AWS Lambda vor
Der Weg zur Installation von Python und Flask auf einem Offline-PC
[Python] Ich habe eine REST-API mit AWS API Gateway und Lambda geschrieben.
[Für Python] Erstellen Sie schnell eine Upload-Datei in AWS Lambda Layer
Ich bin gestorben, weil ich dachte, eine Python-Klassenvariable sei eine Instanzvariable
Alles vom Erstellen einer Python-Umgebung bis zur Ausführung unter Windows
[AWS lambda] Stellen Sie mit lambda verschiedene Bibliotheken bereit (generieren Sie eine Zip-Datei mit einem Kennwort und laden Sie sie auf s3 hoch) @ Python
Setzen Sie Cabocha 0.68 in Windows ein und versuchen Sie, die Abhängigkeit mit Python zu analysieren
[AWS] Erstellen Sie mit CodeStar eine Python Lambda-Umgebung und führen Sie Hello World aus
Versuchen Sie, Foldl und Foldr mit Python: Lambda zu machen. Auch Zeitmessung
Versuchen Sie, eine Python- und Anaconda-Umgebung auf einem Mac zu erstellen (mit pyenv, conda).
Versuchen Sie, Python-Code zu schreiben, um Go-Code zu generieren. - Versuchen Sie, JSON-to-Go usw. zu portieren
So stoppen Sie das Programm bis zu einem bestimmten Datum und einer bestimmten Uhrzeit in Python
Migrieren Sie Django-Anwendungen, die unter Python 2.7 ausgeführt werden, auf Python 3.5
Führen Sie TensorFlow auf einer GPU-Instanz in AWS aus
Installieren von Anaconda Python auf einer ECS-Instanz
[Python] Führen Sie Headless Chrome unter AWS Lambda aus
Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
[Python] Ich habe ein Skript erstellt, das Dateien auf dem lokalen PC automatisch ausschneidet und auf eine externe SSD einfügt.
Versuchen Sie, einen Cisco Spark Bot mit AWS Lambda + Amazon API Gateway (Python) zu implementieren.
[Python] Kombinieren von Listen mit Zahlen zu Zeichenfolgen und Schreiben in eine Ausgabedatei
Sie können Python mithilfe der Bibliothek in eine AWS Lambda-Funktion verwandeln
WEB Scraping mit Python und versuchen, aus Bewertungen eine Wortwolke zu machen
Eine Geschichte über das Cross-Kompilieren eines Python-Pakets für AWS Lambda und das Bereitstellen ohne Server
Erstellen Sie Einstellungen in Terraform, um Nachrichten von AWS Lambda Python3.8 an Slack zu senden
Ich habe versucht, Twitter Scraper mit AWS Lambda zu verwenden, aber es hat nicht funktioniert.
Ein Memo, das ein Tutorial zum Ausführen von Python auf Heroku erstellt hat
Stellen Sie sich eine Cloud-native WebSocket-Anwendung vor, die unter AWS ausgeführt wird
Berechnen wir das statistische Problem mit Python