النسخ الاحتياطي خوادم ويندوز في AWS

لدينا خادم ويندوز في AWS والمهمة هي تكوين النسخ الاحتياطي. يمكنك استخدام اللقطات ، ولكن بعد ذلك ستكون هناك مشكلة في تكامل البيانات. أريد أيضًا الاحتفاظ بلقطات أسبوعية وشهرية ، لكن دورة الحياة في اللقطات لا تقدم هذا. لا تعرف خدمة AWS Backup الجديدة أيضًا كيفية القيام بلقطات كاملة حتى الآن ، أو لم أجد كيف. حسنًا ، أريد أن يعمل كل هذا قدر الإمكان دون مشاركتي.

لتحقيق المهمة التي نحتاجها

  1. نظام التشغيل Windows Server 2008 R2 أو إصدار أحدث يعمل بنظام AWS
  2. عامل SSM الإصدار 2.2.58.0 أو الأحدث
  3. أدوات AWS لنظام التشغيل Windows PowerShell 3.3.48.0 أو الأحدث
  4. مدير نظام AWS
  5. IAM
  6. SNS
  7. امدا

أولاً نحتاج إلى دور للخادم. يجب أن يقوم الدور بتمكين AWS SSM وإنشاء لقطات EBS.

انتقل إلى IAM → السياسات → إنشاء سياسة.
انتقل إلى علامة التبويب JSON وأدخل

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

نضغط على سياسة المراجعة في الاسم نكتب شيئًا مثل VssSnapshotPolicy. حفظ

الآن خلق دور.
IAM → أدوار → إنشاء دور

حدد خدمة AWS → EC2 وانتقل إلى أذونات.

هنا نضيف AmazonSSMManagedInstanceCore لـ SMM وسياستنا التي أنشأناها سابقًا VssSnapshotPolicy. إذا رغبت في ذلك ، قم بتعيين علامة لدورنا وقم بإعطائها اسمًا ، يقول VssSnapshotRole.

ثم نذهب وتعيين هذا الدور إلى الخوادم المطلوبة.

كل شيء يمكن لـ ssm الآن "إدارة" هذه الخوادم.

الآن نحن بحاجة إلى وضع AWSVssComponents على الخادم. للقيام بذلك ، حدد تشغيل الأمر وانقر فوق تشغيل الأمر ، ابحث عن AWS-ConfigureAWSPackage.

في معلمات الأوامر ، حدد تثبيت ، الاسم - AwsVssComponents ، الإصدار الأحدث.
في الهدف ، نختار الأنظمة التي سنقوم بالنسخ الاحتياطي لها.

انقر فوق RUN.

بعد الانتهاء ، يمكننا عمل نسخة احتياطية من وحدة التحكم SSM.

حدد أمر تشغيل ، وابحث عن AWSEC2-CreateVssSnapshot. نقوم بتثبيت خوادمنا في الهدف. حدد خيارات مثل استثناء وحدة تخزين التمهيد ونسخ فقط ولا كتاب.

انقر فوق RUN. لدينا لإنشاء لقطات.

للحصول على إعلامات النسخ الاحتياطي ، قم بإنشاء موضوع SNS. والاشتراك فيه. أنا أستخدم إشعار البريد الإلكتروني.

نقوم بإنشاء سياسة تسمح بإرسال الرسائل بدورنا

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

وخلق دور مع هذه السياسة.

لأتمتة العملية ، سوف نستخدم نافذة صيانة SSM.

انقر فوق إنشاء نافذة الصيانة. املأ الاسم ، املأ الجدول بما تريد.

نذهب إلى نافذة الصيانة التي تم إنشاؤها ونضيف مهمة الأمر Register RUN. ملء المعلمات. في العلامة ، اكتب نوع النسخ الاحتياطي (TAG Key = SnapshotType ، Value =). لدي ثلاث معلمات ممكنة: اليوم ، والأسبوع ، والشهر ، وبالتالي ثلاثة نوافذ صيانة. اضبط تمكين إشعارات SNS وأشير إلى دورنا في SNS والموضوع.

سيتم الآن إنشاء جميع اللقطات وفقًا لجدول زمني.

وبعد فترة من الوقت ، سيكون لدينا الكثير من اللقطات - يجب تنظيفها. للقيام بذلك ، سوف نستخدم خدمة AWS أخرى - Lambda.

أولاً ، قم بإنشاء دور يمكنه قراءة وحذف اللقطات.

للقيام بذلك ، نقوم بإنشاء سياسة في 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": "*" } ] } 

ونحن نعلق هذه السياسة على دور جديد.

انتقل إلى lambda وقم بإنشاء وظيفة بيثون جديدة.

 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 } 

نحن نستخدم الدور الذي تم إنشاؤه أعلاه. كمحرك نستخدم حدث CloudWatch.
تمر هذه الوظيفة عبر جميع وحدات التخزين ، وتبحث عن جميع وحدات تخزين اللقطات التي تكتمل بعلامة SnapshotType وتزيل جميع اللقطات التي تكون أكبر من عمليات احتجاز اللقطات. لدي آخر 5 لقطات يومية و 3 لقطات أسبوعية و 2 لقطات شهرية.

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


All Articles