Automatizar 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 é o que cada volume em suas instâncias EC2 utiliza. Quando você depende de um serviço para executar infraestrutura importante, é sábio garantir que os dados estejam sendo 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 através de um snapshot EBS. Cada snapshot pode ser criado de duas maneiras; um snapshot completo ou incremental. Bem, tecnicamente ambos, mas… apenas siga comigo nesta.

Ao criar o primeiro backup de snapshot para uma instância EC2, ele cria um backup de todo o volume. 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 de backups incrementais típicos no ponto no tempo, como 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.

Snapshots podem ocorrer de forma assíncrona, o que significa que snapshots podem estar em 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 EBS são armazenados.

Usando o PowerShell para Criar Snapshots do AWS EC2

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

Pré-requisitos

Antes de avançarmos muito, haverá alguns pré-requisitos que presumirei que você tenha 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 CreateSnapshot (arn:aws:ec2:region::snapshot/*)

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

Encontrando Snapshots Existentes do EC2

Uma das primeiras tarefas que faremos é descobrir se já existem snapshots por aí. Para descobrir isso, usamos o comando Get-EC2Snapshot. Este é o comando que irá procurar por quaisquer snapshots que já tenham sido criados e irá mostrá-los 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ê vai notar que os snapshots do EC2 da AWS que aparecem não são para sua instância EC2. Esses são todos snapshots que foram compartilhados com você e estão disponíveis para você restaurar em suas instâncias EC2. Para descobrir todos os snapshots que vieram de suas instâncias EC2, use o parâmetro OwnerId com o valor self.

PS> Get-EC2Snapshot -OwnerId self

Criando um Novo Snapshot do 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 antes, será necessário reunir o ID do volume para cada volume que você deseja 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 conhecer o ID da instância EC2, será necessário usá-lo para encontrar os volumes. Para encontrar todos os volumes anexados à instância EC2, utilize o comando Get-EC2Volume e filtre a saída apenas para os volumes com um ID de instância anexado 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 um e passar o ID do volume para o parâmetro VolumeId no comando New-EC2Snapshot. Quando isso acontecer, você notará que o snapshot entrará em um 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 que o Estado agora é concluído.

Atribuindo Tags

Se você tiver muitos snapshots para gerenciar, pode ser difícil mantê-los organizados. Para classificar e categorizar os snapshots 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 EBS.

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

Por exemplo, talvez eu queira marcar este snapshot do AWS EC2 que acabei de tirar antes de fazer uma mudança de produção. 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 então definir o tipo de recurso a que esta 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

Outro recurso interessante 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 de 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 o snapshot, agora podemos removê-los. Fazer isso é fácil. Basta encaminhar a instância retornada por Get-EC2Snapshot para Remove-EC2Snapshot. No entanto, você pode encontrar este 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

Neste caso, a AMI está registrada e você deve primeiro removê-la do registro 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 das snapshots do EBS. Se os cenários que cobrimos aqui não atenderem 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 as snapshots do EC2 (EBS).

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