Automatiseer AWS EC2-snapshots met PowerShell

Amazon Elastic Block Store (EBS) is een service die opslag biedt voor Amazon EC2-instanties. EBS is waar elke volume op uw EC2-instanties op draait. Wanneer u vertrouwt op een service om belangrijke infrastructuur uit te voeren, is het verstandig om ervoor te zorgen dat gegevens worden geback-upt. In deze blogpost leert u hoe u EC2-snapshots kunt beheren en automatiseren met behulp van de PowerShell-scripttaal.

Elke EBS-volume die aan een EC2-instantie is gekoppeld, kan worden geback-upt via een EBS-snapshot. Elke snapshot kan worden gemaakt via een van twee manieren; een volledige of incrementele snapshot. Nou ja, technisch gezien beide maar.. ga gewoon met me mee op deze.

Wanneer de eerste snapshotback-up wordt gemaakt voor een EC2-instantie, maakt het een back-up van de volledige volume. Wanneer er vervolgens snapshots worden gemaakt, worden alleen de gegevens op het niveau van blokopslag opgeslagen die zijn gewijzigd sinds de laatste snapshot. Echter, in tegenstelling tot typische incrementele point-in-time back-ups, aangezien snapshots kunnen worden geketend, wanneer een snapshot wordt hersteld, worden alle gegevens voor die volume hersteld, waardoor het vergelijkbaar is met een volledige back-up.

Snapshots kunnen asynchroon plaatsvinden wat betekent dat snapshots tegelijkertijd in het maakproces kunnen zijn. Wanneer gestart, komt een snapshot in een wachtende fase totdat alle benodigde blokken zijn gekopieerd naar Amazon S3 waar alle EBS-snapshots worden opgeslagen.

Het gebruiken van PowerShell om AWS EC2-snapshots te maken

Er zijn verschillende manieren waarop AWS u toestaat EBS-snapshots te beheren. U kunt de AWS Management Console, de AWS CLI, PowerShell of de API’s rechtstreeks gebruiken als u dat wilt. In dit artikel gaan we PowerShell gebruiken, aangezien de AWSPowerShell-module uitstekende ondersteuning biedt voor het beheren van EBS-snapshots met PowerShell-opdrachten.

Vereisten

Voordat we te ver gaan, ga ik ervan uit dat u enkele vereisten hebt om het meeste uit deze zelfstudie te halen. U heeft nodig:

  • Een AWS-account
  • Een EC2-instantie met een gekoppelde volume
  • Geverifieerd met de hoofdgebruiker of een IAM-gebruiker met de CreateSnapshot-toestemming (arn:aws:ec2:regio::snapshot/*)

Zodra u al deze vereisten op orde hebt, zijn we er klaar voor!

Bestaande EC2-snapshots vinden

Een van de eerste taken die we zullen uitvoeren, is ontdekken of we al bestaande snapshots hebben. Om dat te achterhalen, gebruiken we de opdracht Get-EC2Snapshot. Dit is de opdracht die zal zoeken naar eventuele al gemaakte snapshots en deze zal uitvoeren naar de PowerShell-console.

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>

U zult merken dat de AWS EC2-snapshots die verschijnen, niet die zijn voor uw EC2-instantie. Dit zijn allemaal snapshots die met u zijn gedeeld en die beschikbaar zijn om te herstellen naar uw EC2-instanties. Om alle snapshots te ontdekken die afkomstig zijn van uw EC2-instanties, gebruikt u de parameter OwnerId met de waarde self.

PS> Get-EC2Snapshot -OwnerId self

Een nieuwe EBS-snapshot maken

Assuming that you already have an EC2-instance aangemaakt, kun je nu een snapshot maken. Je kunt nieuwe snapshots maken met behulp van de New-EC2Snapshot-opdracht, maar eerst moet je de volume-ID verzamelen voor elk volume dat je wilt vastleggen. Om dat te doen, moeten we eerst de EC2-instantie-ID vinden waaraan het volume is gekoppeld.

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

Als je eenmaal de EC2-instantie-ID kent, moet je die gebruiken om de volumes te vinden. Om alle volumes die aan de EC2-instantie zijn gekoppeld te vinden, gebruik je de Get-EC2Volume-opdracht en filter je de uitvoer om alleen de volumes weer te geven met een gekoppelde instantie-ID van degene die we zoeken.

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

Nu we de volumes hebben, raadt AWS aan om de instantie af te sluiten of in ieder geval het volume te demonteren. We gaan dus de instantie afsluiten.

PS> Stop-EC2Instance -InstanceId $instanceId

We kunnen nu elk volume doorlopen en de ID van dat volume doorgeven aan de VolumeId-parameter op de New-EC2Snapshot-opdracht. Zodra dat gebeurt, zul je merken dat de snapshot in de status pending komt.

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

Je kunt bevestigen dat de snapshot is voltooid door opnieuw Get-EC2Snapshot uit te voeren en te controleren of de Status nu voltooid is.

Tags toewijzen

Als je veel snapshots moet beheren, kan het moeilijk zijn om ze allemaal recht te houden. Om snapshots te sorteren en te categoriseren voor elk gebruik, kun je er ook tags aan toewijzen. Tags zijn een alomtegenwoordig onderdeel van EC2 en kunnen worden gebruikt voor je EBS-snapshots.

Je kunt tags toewijzen bij het maken van een snapshot of daarna. Om tags toe te wijzen bij het maken van een snapshot, gebruik je de TagSpecification-parameter op New-EC2Snapshot.

Bijvoorbeeld, misschien wil ik deze AWS EC2-snapshot taggen die ik net heb gemaakt voordat ik een productiewijziging aanbracht. Ik wil een tag genaamd Stage maken en het toewijzen als Dev. Om dit te doen, kan ik een TagSpecification-object maken, een of meer Tag-objecten toewijzen aan de eigenschap Tags, en vervolgens het resourcetype definiëren waaraan deze tag zal worden gekoppeld.

$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'

Zodra ik het TagSpecification-object heb gemaakt, kan ik dat doorgeven aan New-EC2Snapshot.

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

Het maken van een nieuwe AMI van Snapshots

Een andere handige functie van snapshots is dat je een geheel nieuwe image (AMI) kunt maken vanuit een snapshot. Als je een snapshot hebt van het rootvolume van een alleen Linux EC2-instantie, kun je eenvoudig een geheel nieuwe AMI maken vanuit dat volumesnapshot. Laten we zeggen dat ik een nieuwe image wil maken vanuit de snapshot die ik zojuist heb gemaakt. Dat kan ik doen met de New-EC2Image-opdracht.

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

Vervolgens kan ik dat ID doorgeven als een hashtable naar de BlockDeviceMapping-parameter op 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-snapshots verwijderen

Als we klaar zijn met de snapshot, kunnen we deze nu verwijderen. Het is eenvoudig. Leid eenvoudig de instantie die is geretourneerd door Get-EC2Snapshot naar Remove-EC2Snapshot. U kunt echter op deze fout stuiten als een AMI in gebruik is.

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

In dit geval is de AMI geregistreerd en moet u deze eerst afmelden met de Unregister-EC2Image-opdracht.

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

Samenvatting

PowerShell stelt u in staat om elk aspect van EBS-snapshots te beheren. Als de hier behandelde scenario’s niet aan uw behoeften voldoen, raad ik u aan om alle beschikbare EC2-snapshotopdrachten te bekijken door Get-Command -Noun *ec2snapshot* -Module AWSPowerShell uit te voeren. Dat geeft u een goed idee van wat er mogelijk is met PowerShell en EC2 (EBS)-snapshots.

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