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
--Erstellen Sie einen Windows-Server
Erstellen Sie einen EC2, um ein Backup zu erhalten.
Die Sicherheitsgruppe ist auf das Minimum eingestellt.
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.
Einige Minuten nach dem Erstellen von EC2 können Sie die Zielinstanz in der verwalteten Instanz von Systems Manager anzeigen.
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.
Dieses Mal verwenden wir das von AWS erstellte Dokument "AWS EC2-CreateVssSnapshot".
Wählen Sie unter den Zielelementen den Server aus, den Sie gerade erwähnt haben, und führen Sie das Dokument aus.
Überprüfen Sie anhand des Befehlsverlaufs, ob der Status des ausgeführten Befehls erfolgreich ist.
Der Schnappschuss wurde erfolgreich aufgenommen.
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.
Ü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.
Da auch Schnappschüsse erstellt wurden, scheint es kein Problem zu geben.
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