تلقائي صور AWS EC2 مع PowerShell

Amazon Elastic Block Store (EBS) هو خدمة توفير التخزين لحالات Amazon EC2. EBS هو ما يعمل كل مسح على حالات EC2 الخاصة بك. عند الاعتماد على خدمة لتشغيل البنية التحتية المهمة ، من الحكمة التأكد من نسخ البيانات الخاصة بها. في هذه المقالة في المدونة ، تعرّف على كيفية إدارة وتلقين اللقطات الفورية لـ EC2 باستخدام لغة البرمجة PowerShell.

يمكن نسخ كل مسح EBS المرتبط بحالة EC2 عبر لقطة EBS. يمكن إنشاء كل لقطة عبر أحد طريقين ؛ لقطة كاملة أو لقطة تزايدية. حسنًا ، من الناحية التقنية كلاهما ولكن.. فقط تابع معي في هذا الأمر.

عند إنشاء النسخة الاحتياطية الأولى للمسح لحالة EC2 ، يتم إنشاء نسخة احتياطية من المسح بأكمله. عند إنشاء لقطات متتالية ، يتم حفظ البيانات فقط على مستوى تخزين مستوى مستوى البلوك التي تغيرت منذ آخر لقطة احتياطية. ومع ذلك ، على عكس النسخ الاحتياطي التزايدي النموذجي في نقطة الوقت ، حيث يمكن ربط اللقطات الفورية ، عند استعادة لقطة فإن جميع البيانات لهذا المسح يتم استعادتها مما يجعلها مماثلة للنسخ الاحتياطي الكامل.

يمكن أن تحدث اللقطات بشكل غير متزامن مما يعني أن اللقطات يمكن أن تكون في عملية الإنشاء بشكل متوازٍ. عند البدء ، تدخل اللقطة مرحلة معلقة حتى يتم نسخ جميع البلوكات الضرورية إلى Amazon S3 حيث يتم تخزين جميع لقطات EBS.

استخدام PowerShell لإنشاء لقطات EC2 في AWS

توجد عدة طرق مختلفة يتيح لك AWS إدارة لقطات EBS. يمكنك استخدام وحدة التحكم في إدارة AWS أو سطر الأوامر AWS CLI أو PowerShell أو الواجهات البرمجية مباشرة إذا كنت تفضل ذلك. في هذا المقال، سنستخدم PowerShell نظرًا لأن وحدة AWSPowerShell تدعم بشكل رائع إدارة لقطات EBS باستخدام أوامر PowerShell.

المتطلبات المسبقة

قبل أن نتقدم كثيرًا، سأفترض أن لديك بعض المتطلبات المسبقة للاستفادة القصوى من هذا البرنامج التعليمي. ستحتاج إلى:

  • حساب AWS
  • مثيل EC2 بحجم مرفق
  • تم التوثيق باستخدام المستخدم الجذر أو مستخدم IAM مع إذن CreateSnapshot (arn:aws:ec2:region::snapshot/*)

بمجرد أن تكون جميع هذه المتطلبات مرتبة، نحن جاهزون للبدء!

العثور على لقطات EC2 الحالية

أحد المهام الأولى التي سنقوم بها هي اكتشاف ما إذا كانت هناك أي لقطات حالية بالفعل. لمعرفة ذلك، نستخدم أمر Get-EC2Snapshot. هذا هو الأمر الذي سيبحث عن أي لقطات تم إنشاؤها بالفعل وسيقوم بإخراجها إلى وحدة تحكم PowerShell.

PS C:\> Get-EC2Snapshot


DataEncryptionKeyId :
Description         : Business/Industry Summary (Windows)
Encrypted           : False
KmsKeyId            :
OwnerAlias          : amazon
OwnerId             : 947081328633
Progress            : 100%
SnapshotId          : snap-8af818e3
StartTime           : 11/19/2008 6:15:17 AM
State               : completed
StateMessage        :
Tags                : {}
VolumeId            : vol-e1ac4888
VolumeSize          : 15
<SNIP>

سوف تلاحظ أن لقطات AWS EC2 التي تظهر ليست لمثيل EC2 الخاص بك. هذه جميع اللقطات التي تم مشاركتها معك والتي يمكنك استعادتها إلى مثيلات EC2 الخاصة بك. لاكتشاف جميع اللقطات التي تأتي من مثيلات EC2 الخاصة بك، استخدم معلمة OwnerId مع القيمة self.

PS> Get-EC2Snapshot -OwnerId self

إنشاء لقطة جديدة EBS

من المفترض أنك قد قمت بإنشاء مثيل EC2 بالفعل، يمكنك الآن إنشاء لقطة. يمكنك إنشاء لقطات جديدة باستخدام الأمر New-EC2Snapshot ولكن أولاً، ستحتاج إلى جمع معرف الحجم لكل حجم ترغب في إنشاء لقطة له. للقيام بذلك، نحتاج أولاً إلى العثور على معرف مثيل EC2 حيث يتم تثبيت الحجم.

PS> (Get-EC2Instance).instances
PS> $instanceId = (Get-EC2Instance).instances.InstanceId

بمجرد معرفة معرف مثيل EC2، ستحتاج إلى استخدام ذلك للعثور على الأحجام. للعثور على جميع الأحجام المرتبطة بمثيل EC2، ستستخدم الأمر Get-EC2Volume وتصفية الناتج لتتضمن فقط الأحجام ذات معرف مثيل مرتبط بما نبحث عنه.

PS> $volumes = Get-EC2Volume | Where-Object { $_.attachments.InstanceId -eq $instanceId }

Attachments      : {i-083007f62ff750d7a}
AvailabilityZone : us-east-1b
CreateTime       : 3/1/2019 7:06:57 AM
Encrypted        : False
Iops             : 100
KmsKeyId         :
Size             : 8
SnapshotId       : snap-0ff5b79fdf9b021e8
State            : in-use
Tags             : {}
VolumeId         : vol-0bf53c62534f99eee
VolumeType       : gp2

الآن بعد أن لدينا الأحجام، توصي AWS بإيقاف تشغيل المثيل أو على الأقل فصل الحجم. سنقوم بإيقاف تشغيل المثيل.

PS> Stop-EC2Instance -InstanceId $instanceId

يمكننا الآن تكرار كل حجم وتمرير معرف الحجم هذا إلى المعلمة VolumeId في الأمر New-EC2Snapshot. عندما يحدث ذلك، ستلاحظ بعد ذلك أن اللقطة ستدخل في حالة قيد الانتظار.

foreach ($volume in $volumes) {
    New-EC2Snapshot -VolumeId $volume.VolumeId
}

DataEncryptionKeyId :
Description         :
Encrypted           : False
KmsKeyId            :
OwnerAlias          :
OwnerId             : 013223035658
Progress            :
SnapshotId          : snap-027a3550dde80eb3b
StartTime           : 3/1/2019 7:19:13 AM
State               : pending
StateMessage        :
Tags                : {}
VolumeId            : vol-0bf53c62534f99eee
VolumeSize          : 8

يمكنك تأكيد أن اللقطة قد تم الانتهاء منها عن طريق تشغيل Get-EC2Snapshot مرة أخرى وتأكيد أن الحالة الآن مكتملة.

تعيين العلامات

إذا كان لديك الكثير من اللقطات لإدارتها، قد يكون من الصعب الحفاظ على تنظيمها جميعًا. لفرز اللقطات وتصنيفها لكل اكتشاف، يمكنك أيضًا تعيين علامات لها. العلامات هي جزء شائع من EC2 ويمكن استخدامها ضد لقطات EBS الخاصة بك.

يمكنك تعيين العلامات أثناء إنشاء اللقطة أو بعد ذلك. لتعيين العلامات أثناء إنشاء اللقطة، استخدم المعلمة TagSpecification على New-EC2Snapshot.

على سبيل المثال ، ربما أريد تسمية لقطة AWS EC2 التي التقطتها للتو قبل إجراء تغيير إنتاجي. أود إنشاء علامة تسمية تسمى المرحلة وتعيينها كـ تطوير. للقيام بذلك ، يمكنني إنشاء كائن TagSpecification ، وتعيين واحد أو أكثر من كائنات Tag إلى خاصية Tags ، ومن ثم تحديد نوع الموارد التي سيتم إرفاق هذه العلامة بها.

$tag = New-Object Amazon.EC2.Model.Tag
$tag.Key = 'Stage'
$tag.Value = 'Dev'
$tagSpec = New-Object Amazon.EC2.Model.TagSpecification
$tagSpec.Tags = $tag
$tagSpec.ResourceType = 'snapshot'

بمجرد إنشاء كائن TagSpecification ، يمكنني بعد ذلك تمرير ذلك إلى New-EC2Snapshot.

PS> New-EC2Snapshot -VolumeId <VolumeId> -TagSpecification $tagSpec

إنشاء AMI جديد من Snapshots

ميزة رائعة أخرى للنقاط هي أنه يمكنك إنشاء صورة جديدة تمامًا (AMI) من لقطة. إذا كان لديك لقطة لحجم الجذر لـ نظام تشغيل Linux فقط EC2 instance ، يمكنك بسهولة إنشاء صورة AMI جديدة تمامًا من تلك اللقطة. لنقل أريد إنشاء صورة جديدة من اللقطة التي أنشأتها للتو. يمكنني القيام بذلك باستخدام الأمر New-EC2Image.

I’ll first need to capture the snapshot ID.

PS> $snapshotId = Get-EC2Snapshot -OwnerId self | where {$_.Tags.where({$_.Key -eq 'Stage' -and $_.Value -eq 'Dev'})} | Select-Object -ExpandProperty SnapshotId

بعد ذلك ، يمكنني تمرير ذلك ID كجدول التجزئة إلى المعلمة BlockDeviceMapping في New-EC2Image.

PS> $block = @{SnapshotId=$snapshotId}
PS> Register-EC2Image -Name 'my_image' -BlockDeviceMapping @{DeviceName="/dev/sda1";Ebs=$block;VirtualName='ephemeral0'} -RootDeviceName '/dev/sda1'

إزالة لقطات AWS EC2

إذا انتهينا من اللقطة ، يمكننا الآن إزالتها. القيام بذلك سهل. ببساطة قم بتوجيه النسخة التي تم إرجاعها بواسطة Get-EC2Snapshot إلى Remove-EC2Snapshot. ومع ذلك ، قد تواجه هذا الخطأ إذا كانت AMI قيد الاستخدام.

PS> Get-EC2Snapshot -OwnerId self | Remove-EC2Snapshot

Confirm
Are you sure you want to perform this action?
Performing the operation "Remove-EC2Snapshot (DeleteSnapshot)" on target "snap-066ccd492f85192be".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): a
Remove-EC2Snapshot : The snapshot snap-066ccd492f85192be is currently in use by ami-0b353cbd967f6658f
At line:1 char:33
+ Get-EC2Snapshot -OwnerId self | Remove-EC2Snapshot
+                                 ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Amazon.PowerShe...2SnapshotCmdlet:RemoveEC2SnapshotCmdlet) [Remove-EC2Snapshot], InvalidOperationExce
   ption
    + FullyQualifiedErrorId : Amazon.EC2.AmazonEC2Exception,Amazon.PowerShell.Cmdlets.EC2.RemoveEC2SnapshotCmdlet

في هذه الحالة ، تم تسجيل AMI ويجب عليك أولاً إلغاء تسجيله باستخدام الأمر Unregister-EC2Image.

PS> $myImage = Get-EC2Image -Owner self
PS> Unregister-EC2Image -ImageId $myImage.ImageId
PS> Get-EC2Snapshot -OwnerId self | Remove-EC2Snapshot

ملخص

PowerShell تتيح لك إدارة كل جانب من جوانب EBS snapshots. إذا لم تكن السيناريوهات التي covered ناقصة لما تحتاج إليه، أقترح أن تلقي نظرة على جميع أوامر EC2 snapshot المتاحة من خلال تشغيل Get-Command -Noun *ec2snapshot* -Module AWSPowerShell. سيعطيك ذلك فكرة جيدة حول ما يمكن تحقيقه باستخدام PowerShell وصور EC2 (EBS).

Source:
https://adamtheautomator.com/ec2-snapshot/