< strong>
Implementieren Sie etwas wie Cloud Automator Versuchen Sie div>
Hintergrund
Erstens ist die Geschichte dieser Zeit "serverlose Architektur", "Cloud Automator" und "re: Invent".
Serverlose Architektur
Es war ein heißes Thema. Serverlose Architektur.
Es ist schön, frei von Serveroperationen zu sein, nicht wahr?
Cloud Automator
Cloud Automator ist ein SaaS-Tool, das Vorgänge wie die Sicherung automatisiert. Es wird von <a href="http://www.serverworks.co.jp/" target=blank"> Serverworks bereitgestellt.
Mit Cloud Automator und den typischen Anwendungsfällen können Sie Folgendes tun.
--Starten Sie die EC2-Instanz nur während der Geschäftszeiten
- Sichern Sie EBS und RDS automatisch
- Es ist in Ordnung zu stehlen, aber ich werde das Produkt nicht vorstellen, da dies nicht der Zweck ist. Cloud Automator ist nur eine Geschichte, daher weiß ich es nicht
re:Invent
Sie haben "Python-Unterstützung" und "Zeitplanbasierte Ausführung" angekündigt.
Viele Menschen sollten sich über diese Neuigkeiten freuen.
Ich wollte etwas machen, das diese beiden Dinge beinhaltet.
Was ist diesmal zu tun?
Implementieren wir einen der Cloud Automator-Anwendungsfälle, die in ↑ "Automatisierung des Starts / Stopps der EC2-Instanz" in Lambda eingeführt wurden.
Starten Sie die Instanz um 10:00 Uhr und löschen Sie sie um 19:00 Uhr. Auf diese Weise können Sie vermeiden, dass Sie versehentlich vergessen, die Instanz zu löschen, und eine große Menge Geld in Rechnung stellen.
Diagramm
So was.
Der aktuelle Lambda kann planmäßig gestartet werden. Nutzen Sie ihn also.
Die Komponenten sind die folgenden drei.
--Lambda-Funktion ... Funktion [1], um zu einer bestimmten Zeit zu starten und das Auftreten von "Ereignis" zu benachrichtigen.
--SNS Thema zum Empfangen des Ereignisses und zum Aufrufen von "Aktion"
--Lambda-Funktion ... Funktion [2], die "Aktionen" wie Start / Stopp (oder Benachrichtigung über die Ausführung) der Zielinstanz ausführt
- Da es ohne das SNS-Thema unten rechts funktioniert, werden wir diesmal nicht damit umgehen.
Verfahren
- Erstellen einer IAM-Rolle
- Erstellen Sie eine Vorlage für SNS Topic und Lambda Function
- Implementierte E-Mail-Benachrichtigung zu SNS Topic
- Einstellungen der Lambda-Funktionsereignisquelle
- Implementieren und testen Sie die Lambda-Funktion
- Stellen Sie einen Timer für Lambdas Ereignisquelle ein
Erstellen einer IAM-Rolle
In dieser Konfiguration gibt es zwei Arten von Lambda-Funktionen. Weisen Sie ihnen daher die entsprechende IAM-Rolle zu.
Funktion [1] verwendet sns: Publish,
Geben Sie in Funktion [2] die Berechtigungen für sns: Publish und ec2: StartInstances, ec2: StopInstances an.
Dieses Mal erstellen wir eine IAM-Rolle, die Lambda zugewiesen werden soll. Wählen Sie also ** Lambda als Rollentyp ** aus. Mach keinen Fehler.
Erstellen Sie eine Vorlage für das SNS-Thema und die Lambda-Funktion
Nur die Außenseite wird zuerst gemacht.
Erstellen Sie zwei Funktionen [1](zum Auslösen der Start- / Stoppzeit), eine Funktion [2](zum Ausführen von Start / Stopp) und mindestens ein SNS-Thema.
Betten Sie den Funktionscode in eine entsprechende Vorlage ein.
Die IAM-Rollenzuweisung ist die zuvor erstellte.
Registrieren wir Arn of Function [1] in ** Subscriptions of Topic **.
E-Mail-Benachrichtigung zum SNS-Thema implementiert
Sie können damit den Vorgang überprüfen, indem Sie Ihre eigene E-Mail-Adresse in dem oben erstellten Thema registrieren.
Dies funktioniert auch dann, wenn es nicht das Schlimmste ist.
Nachdem Sie Ihre E-Mail-Adresse in Abonnement erstellen eingegeben haben, klicken Sie auf "Abonnement bestätigen" und Sie erhalten eine Bestätigungs-E-Mail. Die Abonnementregistrierung ist abgeschlossen, wenn Sie dem im Text angegebenen Link folgen.
Einstellungen der Lambda-Funktionsereignisquelle
Stellen Sie die Ereignisquelle für die Lambda-Funktion ein.
Stellen Sie zunächst die Funktion [1] so ein, dass sie zeitlich startet.
Sie können wie Cron schreiben. Die Zeit ist derzeit nur UTC. Wenn Sie JST an Wochentagen um 10:00 Uhr starten möchten, sieht es wie in der obigen Abbildung aus.
Funktion [2] ist dieselbe.
Wählen Sie einfach das SNS-Thema aus. Zum Zeitpunkt der Einstellung werden Kandidatenthemen aufgelistet.
Implementierte und getestete Lambda-Funktion
Hier ist ein Beispiel für Code.
#Beispiel eines Lambda-Funktionscodes zur Information über die Startzeit von EC2
import json
import boto3
sns_client = boto3.client("sns")
def lambda_handler(event, context):
print("Received event: " + json.dumps(event, indent=2))
# publish to SNS Topic ...
topic_arn = "my-topic-arn"
message = dict(Action="start", InstanceIds=["instance-id"])
param = dict(TopicArn=topic_arn, Subject="subject", Message=json.dumps(message))
return sns_client.publish(**param)
Es werden Informationen an Topic übergeben, welche Instanz "welche Aktion (Start / Stopp)" ausgeführt werden soll. Parameterspezifikationen
message = dict(Action="start", InstanceIds=["instance-id"])
Die Beschreibung hier ist alles. Es ist sehr unsinnig, dass der Code direkt in die Instanz-ID eingegeben wird, aber lassen Sie uns gehen, ohne uns darum zu kümmern.
Das Folgende ist ein Codebeispiel einer Funktion, die tatsächlich eine Aktion ausführt (Start / Stopp einer Instanz).
import json
import boto3
ec2_client = boto3.client("ec2")
def lambda_handler(event, context):
# Get parameter
param = json.loads(event["Records"][0]["Sns"]["Message"])
# Invoke action
if param.get("Action", "") == "start":
ret = ec2_client.start_instances(InstanceIds=param.get("InstanceIds", []))
elif param.get("Action", "") == "stop":
ret = ec2_client.stop_instances(InstanceIds=param.get("InstanceIds", []))
return ret
Sagen Sie nicht, dass die Methode zur Parametererfassung fehlerhaft ist. ..
Schauen Sie sich die in Message enthaltenen Parameter an und starten oder stoppen Sie die entsprechende Instanz.
Die Implementierung ist so abgeschlossen.
Themen und Reflexionspunkte
Es gibt viele Dinge, aber ich möchte diejenigen erwähnen, die von besonderer Bedeutung sind. Wenn alles verbessert werden kann, kann es nützlich sein, auch wenn es vor Ort ist.
Geben Sie die Instanz direkt an
Die notwendigen Parameter sollten von außen gezogen werden. Sollte ich mindestens ein Tag angeben?
Als Gerät zur Steigerung der Vielseitigkeit,
Es ist denkbar, "Lambda-Funktion, die diesmal" Lambda-Funktion erstellt "erstellt, zu implementieren, die Funktion mit API-Gateway zu umschließen und die Zielinstanz durch den POST-Parameter angeben zu lassen. .. Metaprogrammierung. Ich möchte das eines Tages tun.
Code verschmutzt
Ich habe keine Fehlerbehandlung oder ähnliches in Betracht gezogen.
Über die Nachricht von SNS
Bei der Übergabe an den Parameter wird JSON einmal in eine Zeichenfolge konvertiert, es sollte jedoch möglich sein, es als JSON-Objekt zu übergeben. Ich habe in diesem Bereich nicht genug gelernt.
Zusammenfassung
Ich habe versucht, EC2 Start / Stop mit Lambda zu automatisieren.
Es gibt viel Raum für Verbesserungen, und ich hoffe, wir können es bald aktualisieren.
das ist alles.