Sauvegarde des serveurs Windows dans AWS

Nous avons un serveur Windows dans AWS et la tâche consiste à configurer la sauvegarde. Vous pouvez utiliser des instantanés, mais il y aura alors un problème avec l'intégrité des données. Je souhaite également conserver des instantanés hebdomadaires et mensuels, mais le cycle de vie des instantanés ne propose pas cela. Le nouveau service AWS Backup ne sait pas encore comment effectuer des instantanés complets, ou je n'ai pas trouvé comment. Eh bien, je veux que tout cela fonctionne autant que possible sans ma participation.

Pour accomplir la tâche dont nous avons besoin

  1. Windows Server 2008 R2 ou version ultérieure exécutant AWS
  2. SSM Agent version 2.2.58.0 ou ultérieure
  3. Outils AWS pour Windows PowerShell 3.3.48.0 ou version ultérieure
  4. AWS System Manager
  5. Je suis
  6. SNS
  7. Lambda

Nous avons d'abord besoin d'un rôle pour le serveur. Le rôle doit activer AWS SSM et la création d'instantanés EBS.

Accédez à IAM → Stratégies → Créer une stratégie.
Accédez à l'onglet JSON et insérez

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "arn:aws:ec2:*::snapshot/*" }, { "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:CreateSnapshot" ], "Resource": "*" } ] } 

Nous appuyons sur Revoir la politique dans le Nom que nous écrivons quelque chose comme VssSnapshotPolicy. Enregistrer

Créez maintenant un rôle.
IAM → Rôles → Créer un rôle

Sélectionnez AWS Service → EC2 et accédez à Autorisations.

Ici, nous ajoutons AmazonSSMManagedInstanceCore pour SMM et notre stratégie que nous avons créée précédemment VssSnapshotPolicy. Si vous le souhaitez, attribuez une balise à notre rôle et donnez-lui un nom, par exemple VssSnapshotRole.

Ensuite, nous allons attribuer ce rôle aux serveurs souhaités.

Tout ce que ssm peut désormais «gérer» ces serveurs.

Maintenant, nous devons mettre AWSVssComponents sur le serveur. Pour ce faire, sélectionnez Exécuter la commande et cliquez sur Exécuter la commande, recherchez AWS-ConfigureAWSPackage.

Dans les paramètres de commande, sélectionnez Installer, Nom - AwsVssComponents, la dernière version.
Dans Target, nous sélectionnons les systèmes à sauvegarder.

Cliquez sur RUN.

Après avoir terminé, nous pouvons effectuer une sauvegarde à partir de la console SSM.

Sélectionnez la commande Exécuter, recherchez AWSEC2-CreateVssSnapshot. Nous installons nos serveurs dans Target. Sélectionnez les options Exclure le volume de démarrage, Copier uniquement et Aucun écrivain.

Cliquez sur RUN. Nous devons créer des instantanés.

Pour les notifications de sauvegarde, créez un sujet SNS. Et abonnez-vous. J'utilise la notification par e-mail.

Nous créons une politique qui permet d'envoyer des messages à notre tour

 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:aws:sns:ap-northeast-1:Account ID:Topic Name" } ] } 

Et créez un rôle avec cette politique.

Pour automatiser le processus, nous utiliserons la fenêtre de maintenance SSM.

Cliquez sur Créer une fenêtre de maintenance. Remplissez le nom, remplissez le calendrier de toute âme.

Nous allons dans la fenêtre de maintenance créée et ajoutons la tâche de commande Register RUN. Remplissez les paramètres. Dans Tag, j'écris le type de sauvegarde (TAG Key = SnapshotType, Value =). J'ai trois paramètres possibles: Jour, Semaine, Mois et en conséquence trois fenêtres de maintenance. Définissez Activer les notifications SNS et indiquez notre rôle pour sns et topic.

Tous les instantanés seront désormais créés selon un calendrier.

Et après un certain temps, nous aurons trop d'instantanés - ils doivent être nettoyés. Pour ce faire, nous utiliserons un autre service AWS - Lambda.

Créez d'abord un rôle qui peut lire et supprimer des instantanés.

Pour ce faire, nous créons une stratégie dans 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": "*" } ] } 

Et nous suspendons cette politique à un nouveau rôle.

Accédez à lambda et créez une nouvelle fonction python.

 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: # As the list of snapshot is eventually consistent old snapshots might appear in listed snapshots if getattr(ex, "response", {}).get("Error", {}).get("Code", "") == "'InvalidSnapshot.NotFound": return False # Throttling might occur when deleting snapshots too fast if "throttling" in ex.message.lower(): retries -= 1 if retries == 0: raise ex time.sleep(wait_period) wait_period = min(wait_period + 10 , 30) continue raise ex def lambda_handler(event, context): retentions = {"Day": 5, "Week": 3, "Month": 2} client = boto3.client("ec2") vols = client.describe_volumes() snapshots_deleted = [] for vol in vols['Volumes']: vol_id = vol['VolumeId'] for SnapshotType, retention_count in retentions.items(): snapshots_for_volume = sorted(get_volume_snapshots(client, vol_id, SnapshotType), key=lambda s: s["StartTime"], reverse=True) snapshots_to_delete = [] if retention_count > 0: snapshots_to_delete = [b["SnapshotId"] for b in snapshots_for_volume[retention_count:]] for snapshot_id in snapshots_to_delete: if delete_snapshot(client, snapshot_id): snapshots_deleted.append(snapshot_id) return { "DeletedSnapshots": snapshots_deleted } 

Nous utilisons le rôle créé ci-dessus. Comme déclencheur, nous utilisons CloudWatch Event.
cette fonction passe par tous les volumes, recherche tous les volumes d'instantanés qui sont terminés avec la balise SnapshotType et supprime tous les instantanés qui sont davantage des rétentions d'instantanés. J'ai les 5 derniers instantanés quotidiens, 3 hebdomadaires et 2 mensuels.

Source: https://habr.com/ru/post/fr462601/


All Articles