[PYTHON] Führen Sie Systems Manager von Lambda aus, um ein Backup von EC2 zu erhalten

Einführung

Ich habe mich gefragt, ob es eine gute Möglichkeit gibt, ein regelmäßiges Backup von EC2 zu erhalten, aber ich habe herausgefunden, dass SSM Snapshots erstellen kann, also habe ich es von Lambda aus ausgeführt. Ich überspringe das Erstellen des Servers, aber da ich den System-Manager verwende, verwende ich Windows Server 2019, auf dem der SSM-Agent standardmäßig installiert ist.

Referenz SSM-Agenten auf Windows-Instanz installieren und konfigurieren

Was ich getan habe

--Erstellen Sie einen Windows-Server

Windows Server-Erstellung und IAM-Rolleneinstellungen

Erstellen Sie einen EC2, um ein Backup zu erhalten. image.png

Die Sicherheitsgruppe ist auf das Minimum eingestellt. image.png

Fügen Sie nach dem Erstellen von EC2 die IAM-Rolle hinzu, damit Systems Manager auf Ihrer Instanz ausgeführt werden kann. Dieses Mal werden zur Überprüfung nur EC2FullAccess (für die Snapshot-Erfassung) und SSMManagedInstanceCore (für die SSM-Ausführung) festgelegt. image.png

Einige Minuten nach dem Erstellen von EC2 können Sie die Zielinstanz in der verwalteten Instanz von Systems Manager anzeigen. image.png

Holen Sie sich ein Backup vom Systems Manager

Ich möchte sofort ein Backup mit Lambda erstellen, stelle jedoch zunächst sicher, dass ich ein Backup von Systems Manager erhalten kann.

Drücken Sie die Befehlstaste Ausführen. image.png

Dieses Mal verwenden wir das von AWS erstellte Dokument "AWS EC2-CreateVssSnapshot". image.png

Wählen Sie unter den Zielelementen den Server aus, den Sie gerade erwähnt haben, und führen Sie das Dokument aus. image.png

Überprüfen Sie anhand des Befehlsverlaufs, ob der Status des ausgeführten Befehls erfolgreich ist. image.png

Der Schnappschuss wurde erfolgreich aufgenommen. image.png

Führen Sie Systems Manager-Dokumente von Lambda aus

Nachdem Sie ein Backup von Systems Manager erstellt haben, führen Sie Systems Manager von Lambda aus.

Erstellen Sie zunächst eine IAM-Rolle zum Ausführen von Lambda. Beginnen Sie nur mit Lambdas Ausführungsberechtigung und fahren Sie fort, während Sie den Fehler beseitigen. image.png

Übrigens sieht der Lambda-Code so aus (geschrieben in Python)

lambda_function.py


import json
import traceback
import boto3
import logging
from datetime import datetime

logger = logging.getLogger()
logger.setLevel(logging.INFO)

instance_id = 'i-0bec94e365078de8c'
document_name = 'AWSEC2-CreateVssSnapshot'
exec_date = datetime.now().strftime("%Y/%m/%d_%H:%M:%S")
snapshot_name = 'testserver-snapshot-' + exec_date

def lambda_execute_ssm(event):
    
    ssm = boto3.client('ssm')
    
    logger.info("Start Get Snapshot")

    ssm_result = ssm.send_command(
        InstanceIds = [ instance_id ],
        DocumentName = document_name,
        Parameters = {
            'ExcludeBootVolume': [
                'False',
            ],
            'description': [
                'Ssm Execute Document',
            ],
            'tags': [
                'Key=Name,Value={}'.format(snapshot_name),
            ]
        }
    )
    logger.info("exec lambda result -> {}".format(ssm_result))    
    logger.info("Completed!")

def lambda_handler(event, context):
    try:
        lambda_execute_ssm(event)
    except Exception:
        logger.error('Exception -> {}'.format(traceback.format_exc()))

Wenn ich versuche, Lambda in diesem Zustand auszuführen, tritt der folgende Fehler auf

botocore.exceptions.ClientError: An error occurred (AccessDeniedException) when calling the SendCommand operation: User: arn:aws:sts::XXXXXXXXXXXX:assumed-role/lambda-ssm-handler/ssm-execution is not authorized to perform: ssm:SendCommand on resource: arn:aws:ec2:ap-northeast-1:XXXXXXXXXXXX:instance/i-0bec94e365078de8c

Soweit ich den Fehlerinhalt lese, versuche ich, SSM SendCommand auszuführen, aber es scheint, dass die Ursache darin besteht, dass Lambda nicht über diese Berechtigung verfügt?

Als ich eine Richtlinie (AmazonSSMMaintenanceWindowRole) anhängte, die die SSM SendCommand-Berechtigung für die Rolle von Lambda zulässt, und Lambda erneut ausführte, wurde sie erfolgreich beendet. image.png

Da auch Schnappschüsse erstellt wurden, scheint es kein Problem zu geben. image.png

Ergänzung zu Schlussfolgerungen und Erkenntnissen

Da ich ein Backup von Lambda erhalten konnte, kann ich es anscheinend regelmäßig erhalten, wenn ich es nach einem Zeitplan mit CloudEvent usw. ausführe.

Bei dieser Methode muss ein Lambda zum Löschen erstellt werden, damit der Lebenszyklusmanager in dieser Hinsicht möglicherweise besser ist. Der Lebenszyklusmanager hat jedoch eine zeitliche Verzögerung bei der Erfassung und Flexibilität im Zusammenhang mit CloudWatch Event cron. Es ist nicht möglich, einen Zeitplan festzulegen. Wenn Sie ihn benötigen, sollten Sie Lambda ausführen.

Eigentlich wollte ich einen Ort einrichten, an dem SNS benachrichtigt werden kann, wenn der SSM-Befehl fehlschlägt. Da jedoch beim Übergeben der Rolle für die SNS-Benachrichtigung häufig Fehler auftraten, habe ich beschlossen, einmal einen Snapshot zu erstellen. Ich kann die IAM-Rolle nicht verstehen. ..

Recommended Posts

Führen Sie Systems Manager von Lambda aus, um ein Backup von EC2 zu erhalten
So erhalten Sie eine Liste mit Links von einer Seite aus Wikipedia
So erhalten Sie den Wert aus dem Parameterspeicher in Lambda (mit Python)
Führen Sie BigQuery von Lambda aus
[Befehl] Befehl zum Abrufen einer Liste von Dateien mit Zeichen voller Breite
Ich möchte viele Prozesse von Python aus starten
So erhalten Sie eine Liste der integrierten Ausnahmen für Python
AWS Lambda Layers Eine kurze Erklärung von der Erstellung bis zur Verknüpfung
Senden Sie eine Anfrage von AWS Lambda an Amazon Elasticsearch Service
Ich habe versucht, mit Pandas eine Pferderenn-Datenbank zu erstellen
Versuchen Sie, die Thread-Liste der Nachrichten (Abneigung) mit Python zu erhalten.
Vorsichtsmaßnahmen beim Ausführen von Python unter EC2 über AWS Lambda (Befehl ausführen)
So erhalten Sie eine Zeichenfolge aus einem Befehlszeilenargument in Python
TensorFlow Aus einer großen Anzahl von Bildern lernen ... ~ (fast) Lösung ~
[Python] So erhalten und ändern Sie Zeilen / Spalten / Werte aus einer Tabelle.
Ich habe versucht, das Entwicklungsstartverfahren von Django kurz zusammenzufassen
Verwendung der visuellen Erkennung, um die LINE ID von einem Mädchen zu erhalten
[Python] Ruft das Aktualisierungsdatum eines Nachrichtenartikels aus HTML ab
Ich habe versucht, mit Boto3 eine Liste der AMI-Namen zu erhalten
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
Rufen Sie dlm von Python aus auf, um ein zeitvariables Koeffizientenregressionsmodell auszuführen
So bekommen Sie einen Ingenieur aus Ihren 30ern
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
Vorbereiten des Betriebs von Flask auf EC2
[Lambda] [Python] Von Lambda auf Twitter posten!
[EC2] So führen Sie einen Selen-Webdriver aus
[EC2] So machen Sie mit Selen eine Bildschirmaufnahme Ihres Smartphones
[Python-Memo] Ich möchte eine zweistellige Hexadezimalzahl aus einer Dezimalzahl erhalten
Übergeben Sie beim Ausführen einer Python-Shell von Electron mehrere Argumente, um Python auszuführen.
[Linux] Ein Befehl zum Abrufen einer Liste der in der Vergangenheit ausgeführten Befehle
So finden Sie den Ansichtsnamen mit dem Namespace über die URL (path_info) in Django
So erhalten Sie mithilfe der API von Virus Total einen Beispielbericht aus einem Hashwert
Holen Sie sich den Songtitel aus dem Titel des von Ihnen gesungenen Videos
Holen Sie sich das durchschnittliche Gehalt eines Jobs mit bestimmten Bedingungen von Indeed.com
TensorFlow Aus einer großen Anzahl von Bildern lernen ... (ungelöstes Problem) → 12/18 Gelöst
Lassen Sie Code Day6 ab Null beginnen "1342. Anzahl der Schritte, um eine Zahl auf Null zu reduzieren"