Автоматизация создания снимков AWS EC2 с помощью PowerShell

Amazon Elastic Block Store (EBS) – это сервис, предоставляющий хранилище для экземпляров Amazon EC2. EBS – это то, на чем работает каждый том на ваших экземплярах EC2. Когда вы полагаетесь на сервис для выполнения важной инфраструктуры, мудро обеспечить резервное копирование данных. В этом блоге узнайте, как управлять и автоматизировать снимки EC2 с использованием языка сценариев PowerShell.

Каждый том EBS, подключенный к экземпляру EC2, может быть резервным копированием с использованием снимка EBS. Каждый снимок можно создать одним из двух способов: полным или инкрементальным. Ну, технически оба, но… просто идите со мной на это.

Когда создается первая резервная копия снимка для экземпляра EC2, создается резервная копия всего тома. При создании последующих снимков сохраняются только данные на уровне блочного хранилища, которые изменились с момента последнего снимка. Однако, в отличие от типичных инкрементальных резервных копий в точке времени, поскольку снимки могут быть цеплены, при восстановлении снимка восстанавливаются все данные для этого тома, что делает его подобным полному резервному копированию.

Снимки могут происходить асинхронно, что означает, что снимки могут находиться в процессе создания параллельно. Когда начинается, снимок входит в фазу ожидания, пока все необходимые блоки не будут скопированы в Amazon S3, где хранятся все снимки EBS.

Использование PowerShell для создания снимков AWS EC2

Есть несколько различных способов, которые позволяют управлять снимками EBS в AWS. Вы можете использовать консоль управления AWS, AWS CLI, PowerShell или API напрямую, если хотите. В этой статье мы будем использовать 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, который я только что сделал перед внесением изменений в производство. Я бы хотел создать метку с именем Stage и назначить ей значение Dev. Для этого я могу создать объект 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 из снимков

Еще одна интересная возможность снимков заключается в том, что вы можете создать совершенно новый образ (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

Затем я могу передать этот идентификатор в виде таблицы хэшей параметру 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/