[PYTHON] Erstellen Sie mit AWS Lambda einen Bot, der Instanzen mit bestimmten Tags automatisch startet / stoppt

Zauberworte, Kosteneinsparungen

――Wenn Sie EC2 für die Entwicklungsumgebung verwenden, können Sie das Herunterfahren der Instanz bei der Rückkehr nach Hause leicht vergessen. ――Es scheint ein Sprichwort zu geben: "Wenn sich Staub ansammelt, wird es zu einem Berg."

Referenzen von Vorfahren usw.

――Wenn Sie die Einstellungen von Rolle und GUI hier verstehen können. [Klassenmethode] Ich habe versucht, EC2 automatisch mit Lambdas Schedule-Ereignis zu starten und zu stoppen [Verhindern Sie, dass Sie vergessen, EC2, RDS und ELB zu stoppen oder zu löschen! Lambda Schedule Event] (http://dev.classmethod.jp/cloud/aws/lambda-scheduled-event-info/ "Verhindern Sie, dass Sie vergessen, das EC2-, RDS-, ELB! LambdaSchedule-Ereignis zu stoppen oder zu löschen")

Was ich diesmal machen möchte

Wochentage oder Samstage, Sonntage oder Feiertage

--Für die Beurteilung von Wochentagen oder Samstagen und Sonntagen kann MON-FRI in ScheduleEvent (cron) von Lambda nur an Wochentagen ausgeführt werden, aufgrund des später beschriebenen UTC-Problems, falls erforderlich, Python-Standarddatum.Wochentag () usw. verwenden ――Es gibt verschiedene Möglichkeiten, Feiertage zu beurteilen, aber am Ende verlasse ich mich auf die japanischen Feiertage von Google Kalender. Ich habe also ein Python-Modul von Google, also werde ich es verwenden. [google-api-python-client] (https://github.com/google/google-api-python-client "google-api-python-client")

Wenn Sie ein externes Modul mit Lambda verwenden, komprimieren Sie es und laden Sie den gesamten Code hoch

cd [Passendes Verzeichnis]
sudo pip install --upgrade google-api-python-client -t ./

#Schreiben Sie die Hauptdatei, die auf Lambda ausgeführt werden soll, in dasselbe Verzeichnis
vim hoge.py

hoge.py


import boto3
import datetime
import sys

from apiclient.discovery import build


# https://console.developers.google.com/Projekt von hier
API_KEY = '[Google Development API-Schlüssel]'
CALENDAR_ID = 'ja.japanese#[email protected]'

#Jahres- und Neujahrsfeiertage sowie Betriebsfeiertage beginnen nicht automatisch(YYYY-MM-Mit DD aufzählen)。
company_holiday_list = []


#Funktionsname(Hier Lambda_handler)Und der Dateiname(Hier hoge.py)Zu
#Auf Lambdas Handler-Namen setzen, z.) hoge.lambda_handler
def lambda_handler(event, context):
    client = boto3.client('ec2')

    #Startet automatisch, wenn der Tag-Name "Auto Shutdown" AUTO lautet/Halt
    #Wenn der Tag-Name "Auto Shutdown" aktiviert ist, wird nur ein automatischer Stopp ausgeführt.
    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)

    #Bestätigung des Ereignisnamens der Zündquelle
    try:
        #Bei automatischem Start nur an Wochentagen außer samstags, sonntags und an Feiertagen arbeiten
        if '[Ereignisquelle ARN(ScheduleEvent für den automatischen Start)Kopieren]' in event['resources']:
            if not str(datetime.date.today()) in holiday_list:
                client.start_instances(InstanceIds=get_instanceid(query_start))

        elif '[Ereignisquelle ARN(ScheduleEvent für automatischen Stopp)Kopieren]' in event['resources']:
            client.stop_instances(InstanceIds=get_instanceid(query_stop))

        elif '[Ereignisquelle ARN(ScheduleEvent für automatischen Stopp X Minuten Vorabbenachrichtigung)Kopieren]' in event['resources'] \
                and (not str(datetime.date.today()) in holiday_list):
            #Es ist freundlicher, hier einen Prozess zu schreiben, der Sie 5 oder 10 Minuten im Voraus über Slack informiert.(Automatischer Stopp-Explosionsschutz)

    except Exception as e:
        #Fehlerbehandlung. Als würde man eine Stapelspur in Slack werfen.

    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()
zip -r ~/hoge.zip .
aws lambda update-function-code --function-name [Funktionsname beim Erstellen von Lambda festgelegt] --zip-file fileb://~/hoge.zip

Vorübergehende Ergänzung

-Bitte schreiben Sie [Ereignisquelle ARN] in Ihre eigene Umgebung m (_ _) m Der ARN-Teil im Bild unten ist ein Kopieren und Einfügen. hoge.png

Recommended Posts

Erstellen Sie mit AWS Lambda einen Bot, der Instanzen mit bestimmten Tags automatisch startet / stoppt
Ich habe einen Slack-Bot geschrieben, der Verzögerungsinformationen mit AWS Lambda benachrichtigt
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
Erstellen Sie einen Mastodon-Bot mit einer Funktion, die automatisch mit Python antwortet
Ich habe ein Skript geschrieben, um mit AWS Lambda + Python 2.7 schnell eine Entwicklungsumgebung für Twitter Bot zu erstellen
[AWS] API mit API Gateway + Lambda erstellen
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen
Erstellen Sie einen BOT, der mit Discord registrierte Bilder wie Piktogramme aufrufen kann
[AWS] Erstellen Sie mit CodeStar eine Python Lambda-Umgebung und führen Sie Hello World aus
Erstellen wir eine Chat-Funktion mit Vue.js + AWS Lambda + Dynamo DB [AWS-Einstellungen]
Erstellen Sie einen Bot, der Twitter-Trends verstärkt
Erstellen Sie ein privates Repository mit AWS CodeArtifact
Versuchen Sie, einen Cisco Spark Bot mit AWS Lambda + Amazon API Gateway (Python) zu implementieren.
[AWS SAM] Erstellen Sie eine API mit DynamoDB + Lambda + API Gateway
Erstellen Sie mit Minette für Python einen LINE BOT
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
LINE BOT mit Python + AWS Lambda + API Gateway
Schritte zum Erstellen eines Twitter-Bots mit Python
Erstellen Sie einen Discord-Bot, der einseitig mit Python benachrichtigt (nur Anfragen und JSON werden verwendet).
[AWS] Ich habe BOT mit LINE WORKS daran erinnert
Erstellen Sie einen Chatbot, der die kostenlose Eingabe mit Word2Vec unterstützt
Vorgehensweise zum Erstellen eines Linienbot in AWS Lambda
Erstellen Sie mit MeCab mit Discord einen Bot, der nur das Ergebnis der morphologischen Analyse zurückgibt
Erstellen Sie einen Slack Bot
Erstellen Sie eine Web-App, die Zahlen mit einem neuronalen Netzwerk erkennt
Erstellen Sie eine PythonBox, die nach der PEPPER-Eingabe mit Random ausgegeben wird
Ich habe versucht, automatisch einen Bericht mit der Markov-Kette zu erstellen
Erstellen Sie eine App für maschinelles Lernen mit ABEJA Platform + LINE Bot
Erstellen wir ein Skript, das sich bei Ideone.com in Python registriert.
Erstellen Sie ein Lebensspiel, das manuell mit tkinter aktualisiert wird
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
Versuchen Sie, Start / Stop für EC2-Instanzen mit AWS Lambda zu automatisieren
Ich habe gerade eine virtuelle Umgebung mit der AWS-Lambda-Schicht erstellt
Tornado - Erstellen wir eine Web-API, die JSON problemlos mit JSON zurückgibt
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
Erstellen Sie mit AWS SAM schnell eine API mit Python, Lambda und API Gateway
[AWS] Ich habe BOT mit LINE WORKS (Implementierung) in Erinnerung gerufen.
Die Geschichte des Erstellens eines Bots, der aktive Mitglieder in einem bestimmten Slack-Kanal mit Python anzeigt