Wir haben Windows Server in AWS und die Aufgabe besteht darin, die Sicherung zu konfigurieren. Sie können Snapshots verwenden, aber dann tritt ein Problem mit der Datenintegrität auf. Ich möchte auch wöchentliche und monatliche Schnappschüsse aufbewahren, aber der Lebenszyklus in Schnappschüssen bietet dies nicht. Der neue AWS Backup-Dienst weiß auch noch nicht, wie vollständige Snapshots erstellt werden sollen, oder ich habe nicht gefunden, wie. Nun, ich möchte, dass all dies ohne meine Teilnahme so gut wie möglich funktioniert.
Um die Aufgabe zu erfüllen, die wir brauchen
- Windows Server 2008 R2 oder höher mit AWS
- SSM Agent Version 2.2.58.0 oder höher
- AWS Tools für Windows PowerShell 3.3.48.0 oder höher
- AWS System Manager
- Ich bin
- SNS
- Lambda
Zuerst brauchen wir eine Rolle für den Server. Die Rolle sollte AWS SSM und die Erstellung von EBS-Snapshots ermöglichen.
Gehen Sie zu IAM → Richtlinien → Richtlinie erstellen.
Gehen Sie zur Registerkarte JSON und fügen Sie sie ein
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "arn:aws:ec2:*::snapshot/*" }, { "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:CreateSnapshot" ], "Resource": "*" } ] }
Wir drücken die Überprüfungsrichtlinie in dem Namen, in dem wir so etwas wie VssSnapshotPolicy schreiben. Speichern
Erstellen Sie jetzt eine Rolle.
IAM → Rollen → Rolle erstellen
Wählen Sie AWS Service → EC2 und gehen Sie zu Berechtigungen.
Hier fügen wir AmazonSSMManagedInstanceCore für SMM und unsere Richtlinie hinzu, die wir zuvor mit VssSnapshotPolicy erstellt haben. Wenn gewünscht, weisen Sie unserer Rolle ein Tag zu und geben Sie ihr einen Namen, z. B. VssSnapshotRole.
Dann weisen wir diese Rolle den gewünschten Servern zu.
Alles, was ssm jetzt kann, kann diese Server "verwalten".
Jetzt müssen wir AWSVssComponents auf den Server stellen. Wählen Sie dazu den Befehl Ausführen und klicken Sie auf Befehl ausführen. Suchen Sie nach AWS-ConfigureAWSPackage.
Wählen Sie in den Befehlsparametern Install, Name - AwsVssComponents, die neueste Version.
In Target wählen wir die Systeme aus, die gesichert werden sollen.
Klicken Sie auf RUN.
Nach Abschluss können wir ein Backup von der SSM-Konsole erstellen.
Wählen Sie den Befehl Ausführen und suchen Sie nach AWSEC2-CreateVssSnapshot. Wir installieren unsere Server in Target. Wählen Sie Optionen wie Boot-Volume ausschließen, Nur kopieren und Keine Writer.
Klicken Sie auf RUN. Wir müssen Schnappschüsse erstellen.
Erstellen Sie für Sicherungsbenachrichtigungen ein SNS-Thema. Und abonnieren Sie es. Ich verwende eine E-Mail-Benachrichtigung.
Wir erstellen eine Richtlinie, die das Senden von Nachrichten ermöglicht
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:aws:sns:ap-northeast-1:Account ID:Topic Name" } ] }
Und erstellen Sie eine Rolle mit dieser Richtlinie.
Um den Prozess zu automatisieren, verwenden wir das SSM-Wartungsfenster.
Klicken Sie auf Wartungsfenster erstellen. Geben Sie den Namen ein und füllen Sie den Zeitplan nach Belieben aus.
Wir gehen in das erstellte Wartungsfenster und fügen die Befehlsaufgabe Register RUN hinzu. Geben Sie die Parameter ein. In Tag schreibe ich den Typ der Sicherung (TAG Key = SnapshotType, Value =). Ich habe drei mögliche Parameter: Tag, Woche, Monat und dementsprechend drei Wartungsfenster. Aktivieren Sie SNS-Benachrichtigungen aktivieren und geben Sie unsere Rolle für Sns und Themen an.
Alle Schnappschüsse werden jetzt nach einem Zeitplan erstellt.
Und nach einer Weile werden wir zu viele Schnappschüsse haben - sie müssen gereinigt werden. Zu diesem Zweck verwenden wir einen anderen AWS-Service - Lambda.
Erstellen Sie zunächst eine Rolle, die Snapshots lesen und löschen kann.
Zu diesem Zweck erstellen wir eine Richtlinie in IAM
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "logs:DeleteSubscriptionFilter", "ec2:DeleteSnapshot", "ec2:DescribeSnapshots", "logs:DeleteLogStream", "logs:CreateExportTask", "logs:DeleteResourcePolicy", "logs:CreateLogStream", "logs:DeleteMetricFilter", "logs:TagLogGroup", "logs:CancelExportTask", "ec2:DescribeVolumes", "logs:DeleteRetentionPolicy", "logs:DeleteLogDelivery", "logs:AssociateKmsKey", "logs:PutDestination", "logs:DisassociateKmsKey", "logs:UntagLogGroup", "logs:DeleteLogGroup", "logs:PutDestinationPolicy", "ec2:DescribeSnapshotAttribute", "logs:DeleteDestination", "logs:PutLogEvents", "logs:CreateLogGroup", "logs:PutMetricFilter", "logs:CreateLogDelivery", "logs:PutResourcePolicy", "logs:UpdateLogDelivery", "logs:PutSubscriptionFilter", "logs:PutRetentionPolicy" ], "Resource": "*" } ] }
Und wir hängen diese Politik an eine neue Rolle.
Gehen Sie zu Lambda und erstellen Sie eine neue Python-Funktion.
import datetime import sys import boto3 def get_volume_snapshots(client, volume_id, SnapshotType): args = { "Filters": [ { "Name": "volume-id", "Values": [volume_id] }, { "Name": "status", "Values": ["completed"] }, { "Name": "tag-key", "Values": ["SnapshotType"]}, { "Name": "tag-value", "Values": [SnapshotType]}, ], "OwnerIds": ["self"] } snapshots = [] while True: resp = client.describe_snapshots(**args) snapshots += resp.get("Snapshots", []) if "NextToken" in resp: args["NextToken"] = resp["NextToken"] else: break return snapshots def delete_snapshot(client, snapshot_id): wait_period = 5 retries = 5 while True: try: client.delete_snapshot(SnapshotId=snapshot_id) return True except Exception as ex:
Wir verwenden die oben erstellte Rolle. Als Auslöser verwenden wir CloudWatch Event.
Diese Funktion durchläuft alle Volumes, sucht nach allen Volumes von Snapshots, die mit dem SnapshotType-Tag abgeschlossen wurden, und entfernt alle Snapshots, die größer sind als die Aufbewahrung von Snapshots. Ich habe die letzten 5 täglichen, 3 wöchentlichen und 2 monatlichen Schnappschüsse.