لدينا خادم ويندوز في AWS والمهمة هي تكوين النسخ الاحتياطي. يمكنك استخدام اللقطات ، ولكن بعد ذلك ستكون هناك مشكلة في تكامل البيانات. أريد أيضًا الاحتفاظ بلقطات أسبوعية وشهرية ، لكن دورة الحياة في اللقطات لا تقدم هذا. لا تعرف خدمة AWS Backup الجديدة أيضًا كيفية القيام بلقطات كاملة حتى الآن ، أو لم أجد كيف. حسنًا ، أريد أن يعمل كل هذا قدر الإمكان دون مشاركتي.
لتحقيق المهمة التي نحتاجها
- نظام التشغيل Windows Server 2008 R2 أو إصدار أحدث يعمل بنظام AWS
- عامل SSM الإصدار 2.2.58.0 أو الأحدث
- أدوات AWS لنظام التشغيل Windows PowerShell 3.3.48.0 أو الأحدث
- مدير نظام AWS
- IAM
- SNS
- امدا
أولاً نحتاج إلى دور للخادم. يجب أن يقوم الدور بتمكين 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:
نحن نستخدم الدور الذي تم إنشاؤه أعلاه. كمحرك نستخدم حدث CloudWatch.
تمر هذه الوظيفة عبر جميع وحدات التخزين ، وتبحث عن جميع وحدات تخزين اللقطات التي تكتمل بعلامة SnapshotType وتزيل جميع اللقطات التي تكون أكبر من عمليات احتجاز اللقطات. لدي آخر 5 لقطات يومية و 3 لقطات أسبوعية و 2 لقطات شهرية.