אוטומציה של Snapshots ב- AWS EC2 עם PowerShell

Amazon Elastic Block Store (EBS) הוא שירות המספק אחסון עבור מקרים של Amazon EC2. EBS הוא מה שכל הנפחות במקרי ה EC2 שלך רצים עליו. כאשר אתה סומך על שירות להפעלת תשתית חשובה, חכם לוודא שהנתונים מגובים. בפוסט בבלוג זה, למד כיצד לנהל ולאוטומט EC2 snapshots באמצעות שפת התסריט PowerShell.

כל נפח EBS שמחובר למקרה EC2 יכול להיות מגובה באמצעות snapshot של EBS. כל snapshot ניתן ליצירה באמצעות אחת משני הדרכים; snapshot מלא או מצער. נכון, בעצם שתיים אבל..פשוט לך איתי על זה.

כאשר גיבוי ה snapshot הראשון נוצר עבור מקרה EC2, הוא יוצר גיבוי של כל הנפח בשלמותו. כאשר נוצרים snapshot נוספים, נשמרים רק נתונים ברמת האחסון ברמת בלוק ששתתשנו מאז ה snapshot האחרון. אולם, למרות גיבויי נקודה בזמן מציינים נקודתיים מצויים, מאחר שניתן לרכות snapshot, כאשר משוחזר snapshot נשחזרים כל הנתונים עבור הנפח ההוא ולכן דומים לגיבוי מלא.

Snapshot יכולים להתרחש אסינכרונית, במובנה זה אומר ש snapshot יכולים להיות בתהליך יצירה במקביל. כאשר מתחילים, snapshot נכנסים לשלב הממתין עד שכל הבלוקים הנדרשים מועתקים אל Amazon S3 שם נשמרים כל snapshot של EBS.

שימוש בפווארשל כדי ליצור snapshot של AWS EC2

ישנם מספר דרכים שונות בהן ניתן לנהל Snapshots של EBS דרך AWS. ניתן להשתמש ב- AWS Management Console, ב- AWS CLI, ב-PowerShell או ישירות ב-APIs אם זו ההעדפה שלך. במאמר זה, אנו נשתמש ב-PowerShell מאחר ויש למודול AWSPowerShell תמיכה מצוינת בניהול Snapshots של EBS עם פקודות PowerShell.

דרישות מוקדמות

לפני שנתחיל, יהיו כמה דרישות מוקדמות שאני מניח שיש לך כדי להפיק את המרב מהמדריך הזה. יהיה עליך לספק:

  • חשבון AWS
  • מופע EC2 עם נפח מקושר
  • אומת כמשתמש ראשי או משתמש IAM עם הרשאה ליצירת Snapshot (arn:aws:ec2:region::snapshot/*)

לאחר שסיימת להכין את כל הדרישות הללו, אנו מוכנים להתחיל!

מציאת Snapshots קיימים של EC2

אחת מהמשימות הראשונות שנבצע היא לגלות האם יש לנו כל Snapshots קיימים כבר. כדי לזהות זאת, נשתמש בפקודה Get-EC2Snapshot. זו הפקודה שתחפש אחר Snapshots שכבר נוצרו ותציג אותם בקונסול 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>

תשים לב שה-Snapshots של EC2 שמופיעים אינם שייכים למכונה ה-virtual שלך. אלו כל Snapshots ששותפו איתך וזמינים לשחזור למכונות ה-virtual שלך. כדי לגלות את כל הSnapshots שהגיעו מהמכונות ה-virtual שלך, השתמש בפרמטר OwnerId עם ערך self.

PS> Get-EC2Snapshot -OwnerId self

יצירת Snapshot חדש של 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 שוב ולאשר שה-מצב הוא כעת הושלם.

הקצאת תגיות

אם יש לך הרבה צילומי EBS לנהל, יכול להיות קשה לשמור על כולם. כדי למיין צילומים ולסדר אותם לפי כל גילוי, תוכל גם להקצות תגיות להם. תגיות הן חלק של EC2 וניתן להשתמש בהן נגד הצילומי EBS שלך.

תוכל להקצות תגיות ביצירת הצילום או לאחר מכן. כדי להקצות תגיות ביצירת הצילום, השתמש בפרמטר TagSpecification ב-New-EC2Snapshot.

לדוגמה, אולי אני רוצה לתייג את צילום ה- AWS EC2 שלי שאני עשיתי לפני שערכתי שינויי ייצור. אני רוצה ליצור תג בשם "שלב" ולהקצות לו את הערך "פיתוח". כדי לעשות זאת, אני יכול ליצור אובייקט TagSpecification, להקצות אובייקט או יותר למאפיין התגים ולהגדיר את סוג המשאב שבו התג יתקשר.

$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 חדש מצילומי מסך

תכונה נוספת מדהימה של צילומי מסך היא שניתן ליצור תמונה (AMI) חדשה מצילום מסך. אם יש לך צילום מסך של כורך השורש של מופע EC2 של Linux, תוכל בקלות ליצור 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

לאחר מכן, אני יכול להעביר את המזהה הזה כפרמטר hashtable לפרמטר 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. אם התרחשויות שכיסינו כאן לא מתאימות למה שאתה צריך לעשות, אני ממליץ לך לבדוק את כל פקודות צילומי ה-EC2 הזמינות על ידי הרצת Get-Command -Noun *ec2snapshot* -Module AWSPowerShell. זה יעניק לך רעיון טוב על מה אפשרי עם PowerShell וצילומי EC2 (EBS).

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