Automatize instantâneos do AWS EC2 com PowerShell

O Amazon Elastic Block Store (EBS) é um serviço que fornece armazenamento para instâncias Amazon EC2. O EBS é onde cada volume em suas instâncias EC2 é executado. Quando você depende de um serviço para executar infraestrutura importante, é prudente garantir que os dados sejam copiados. Neste post do blog, aprenda como gerenciar e automatizar snapshots do EC2 usando a linguagem de script PowerShell.

Cada volume EBS conectado a uma instância EC2 pode ser copiado por meio de um snapshot do EBS. Cada snapshot pode ser criado de duas maneiras; um snapshot completo ou incremental. Bem, tecnicamente ambos, mas… só me acompanhe nessa.

Ao criar o primeiro backup de snapshot para uma instância EC2, é criado um backup do volume inteiro. Quando snapshots subsequentes são criados, apenas os dados no nível de armazenamento do bloco que foram alterados desde o último snapshot são salvos. No entanto, ao contrário dos backups incrementais típicos, já que os snapshots podem ser encadeados, ao restaurar um snapshot, todos os dados para aquele volume são restaurados, tornando-o semelhante a um backup completo.

Os snapshots podem ocorrer de forma assíncrona, o que significa que os snapshots podem estar no processo de criação em paralelo. Quando iniciado, um snapshot entra em uma fase pendente até que todos os blocos necessários sejam copiados para a Amazon S3, onde todos os snapshots do EBS são armazenados.

Usando o PowerShell para Criar Snapshots AWS EC2

Existem algumas maneiras diferentes de a AWS permitir que você gerencie instantâneos do EBS. Você pode usar o Console de Gerenciamento da AWS, a CLI da AWS, o PowerShell ou as APIs diretamente, se preferir. Neste artigo, vamos usar o PowerShell, já que o módulo AWSPowerShell oferece ótimo suporte para gerenciar instantâneos do EBS com comandos do PowerShell.

Pré-requisitos

Antes de avançarmos muito, vou presumir que você tenha alguns pré-requisitos para aproveitar ao máximo este tutorial. Você vai precisar de:

  • Uma conta da AWS
  • Uma instância EC2 com um volume anexado
  • Autenticado com o usuário root ou um usuário IAM com permissão para CreateSnapshot (arn:aws:ec2:região::snapshot/*)

Depois de ter todos esses pré-requisitos em ordem, estamos prontos para começar!

Encontrar Instantâneos EC2 Existente

Uma das primeiras tarefas que faremos é descobrir se já existem instantâneos lá fora. Para descobrir isso, usamos o comando Get-EC2Snapshot. Este é o comando que procurará por quaisquer instantâneos que já tenham sido criados e os exibirá no console do 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>

Você notará que os instantâneos EC2 da AWS que aparecem não são para sua instância EC2. Esses são todos instantâneos que foram compartilhados com você e estão disponíveis para serem restaurados em suas instâncias EC2. Para descobrir todos os instantâneos que vieram de suas instâncias EC2, use o parâmetro OwnerId com o valor self.

PS> Get-EC2Snapshot -OwnerId self

Criando um Novo Instantâneo EBS

Assumindo que você já tenha uma instância EC2 criada, agora você pode criar um snapshot. Você pode criar novos snapshots usando o comando New-EC2Snapshot, mas primeiro, você precisará reunir o ID do volume para cada volume que deseja incluir no snapshot. Para fazer isso, primeiro precisamos encontrar o ID da instância EC2 à qual o volume está anexado.

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

Depois de saber o ID da instância EC2, será necessário usá-lo para localizar os volumes. Para encontrar todos os volumes anexados à instância EC2, você usará o comando Get-EC2Volume e filtrará a saída para incluir apenas os volumes com um ID de instância anexado igual ao que estamos procurando.

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

Agora que temos os volumes, a AWS recomenda desligar a instância ou pelo menos desmontar o volume. Vamos desligar a instância.

PS> Stop-EC2Instance -InstanceId $instanceId

Agora podemos iterar sobre cada volume e passar o ID desse volume como parâmetro VolumeId no comando New-EC2Snapshot. Quando isso acontecer, você notará que o snapshot entrará no estado de pendente.

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

Você pode confirmar que o snapshot foi concluído executando Get-EC2Snapshot novamente e verificando se o Estado agora é concluído.

Atribuição de Tags

Se você tiver muitos snapshots para gerenciar, pode ser difícil manter tudo organizado. Para classificar snapshots e categorizá-los para cada descoberta, você também pode atribuir tags a eles. Tags são uma parte ubíqua do EC2 e podem ser usadas em seus snapshots do EBS.

Você pode atribuir tags durante a criação do snapshot ou posteriormente. Para atribuir tags durante a criação do snapshot, use o parâmetro TagSpecification no New-EC2Snapshot.

Por exemplo, talvez eu queira marcar esse snapshot do AWS EC2 que acabei de tirar antes de fazer uma alteração de produção. Eu gostaria de criar uma tag chamada Stage e atribuí-la como Dev. Para fazer isso, posso criar um objeto TagSpecification, atribuir um ou mais objetos Tag à propriedade Tags e, em seguida, definir o tipo de recurso a que essa tag será anexada.

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

Depois de criar o objeto TagSpecification, posso passá-lo para New-EC2Snapshot.

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

Criando uma nova AMI a partir de snapshots

Outra funcionalidade legal dos snapshots é que você pode criar uma nova imagem (AMI) a partir de um snapshot. Se você tiver um snapshot do volume raiz de uma instância EC2 somente Linux, você pode facilmente criar uma nova AMI a partir desse snapshot do volume. Digamos que eu queira criar uma nova imagem a partir do snapshot que acabei de criar. Posso fazer isso usando o comando 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

Em seguida, posso passar esse ID como um hashtable para o parâmetro BlockDeviceMapping em New-EC2Image.

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

Removendo snapshots do AWS EC2

Se já terminamos com os snapshots, agora podemos removê-los. Fazer isso é fácil. Basta redirecionar a instância retornada por Get-EC2Snapshot para Remove-EC2Snapshot. No entanto, você pode encontrar esse erro se uma AMI estiver em uso.

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

Nesse caso, a AMI está registrada e você deve desregistre-a primeiro usando o comando Unregister-EC2Image.

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

Resumo

O PowerShell permite que você gerencie todos os aspectos dos snapshots do EBS. Se os cenários que abordamos aqui não atenderam ao que você precisa fazer, sugiro dar uma olhada em todos os comandos de snapshot do EC2 disponíveis executando Get-Command -Noun *ec2snapshot* -Module AWSPowerShell. Isso lhe dará uma boa ideia do que é possível com o PowerShell e os snapshots do EC2 (EBS).

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