Fazendo backup de servidores Windows na AWS

Temos o servidor Windows na AWS e a tarefa é configurar o backup. Você pode usar instantâneos, mas haverá um problema com a integridade dos dados. Eu também quero manter instantâneos semanais e mensais, mas o ciclo de vida dos instantâneos não oferece isso. O novo serviço de backup da AWS também ainda não sabe como executar instantâneos completos, ou ainda não o encontrei. Bem, quero que tudo isso funcione o máximo possível sem a minha participação.

Para realizar a tarefa que precisamos

  1. Windows Server 2008 R2 ou posterior executando a AWS
  2. Agente SSM versão 2.2.58.0 ou posterior
  3. Ferramentas da AWS para Windows PowerShell 3.3.48.0 ou posterior
  4. AWS System Manager
  5. Iam
  6. SNS
  7. Lambda

Primeiro, precisamos de uma função para o servidor. A função deve habilitar o AWS SSM e a criação de snapshots do EBS.

Vá para IAM → Políticas → Criar política.
Vá para a guia JSON e insira

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "arn:aws:ec2:*::snapshot/*" }, { "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:CreateSnapshot" ], "Resource": "*" } ] } 

Pressionamos a política de revisão no nome em que escrevemos algo como VssSnapshotPolicy. Salvar

Agora crie um papel.
IAM → Funções → Criar Função

Selecione Serviço da AWS → EC2 e vá para Permissões.

Aqui, adicionamos AmazonSSMManagedInstanceCore for SMM e nossa política que criamos anteriormente no VssSnapshotPolicy. Se desejar, atribua uma tag para nossa função e dê um nome a ela, diga VssSnapshotRole.

Em seguida, atribuímos essa função aos servidores desejados.

Agora tudo o que o ssm pode "gerenciar" esses servidores.

Agora precisamos colocar o AWSVssComponents no servidor. Para fazer isso, selecione Executar comando e clique em Executar comando, procure AWS-ConfigureAWSPackage.

Nos parâmetros de comando, selecione Instalar, Nome - AwsVssComponents, a versão mais recente.
No Target, selecionamos os sistemas que faremos backup.

Clique em EXECUTAR.

Após o término, podemos fazer backup no console do SSM.

Selecione o comando Executar, procure AWSEC2-CreateVssSnapshot. Instalamos nossos servidores no Target. Selecione as opções como Excluir volume de inicialização, Somente cópia e Sem gravadores.

Clique em EXECUTAR. Temos que criar instantâneos.

Para notificações de backup, crie um tópico do SNS. E inscreva-se. Estou usando a notificação por email.

Criamos uma política que permite o envio de mensagens por sua vez

 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:aws:sns:ap-northeast-1:Account ID:Topic Name" } ] } 

E crie uma função com esta política.

Para automatizar o processo, usaremos a janela de manutenção do SSM.

Clique em Criar janela de manutenção. Preencha o Nome, preencha a Agenda como desejar.

Entramos na janela de manutenção criada e adicionamos a tarefa de comando Register RUN. Preencha os parâmetros. No Tag, escrevo o tipo de backup (Chave TAG = SnapshotType, Value =). Eu tenho três parâmetros possíveis: dia, semana, mês e, consequentemente, três janelas de manutenção. Defina Habilitar notificações de SNS e indique nossa função para sns e tópico.

Todos os instantâneos serão criados em uma programação.

Depois de um tempo, teremos muitos instantâneos - eles precisam ser limpos. Para fazer isso, usaremos outro serviço da AWS - Lambda.

Primeiro, crie uma função que possa ler e excluir instantâneos.

Para fazer isso, criamos uma política no IAM

 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "logs:DeleteSubscriptionFilter", "ec2:DeleteSnapshot", "ec2:DescribeSnapshots", "logs:DeleteLogStream", "logs:CreateExportTask", "logs:DeleteResourcePolicy", "logs:CreateLogStream", "logs:DeleteMetricFilter", "logs:TagLogGroup", "logs:CancelExportTask", "ec2:DescribeVolumes", "logs:DeleteRetentionPolicy", "logs:DeleteLogDelivery", "logs:AssociateKmsKey", "logs:PutDestination", "logs:DisassociateKmsKey", "logs:UntagLogGroup", "logs:DeleteLogGroup", "logs:PutDestinationPolicy", "ec2:DescribeSnapshotAttribute", "logs:DeleteDestination", "logs:PutLogEvents", "logs:CreateLogGroup", "logs:PutMetricFilter", "logs:CreateLogDelivery", "logs:PutResourcePolicy", "logs:UpdateLogDelivery", "logs:PutSubscriptionFilter", "logs:PutRetentionPolicy" ], "Resource": "*" } ] } 

E colocamos essa política em um novo papel.

Vá para lambda e crie uma nova função python.

 import datetime import sys import boto3 def get_volume_snapshots(client, volume_id, SnapshotType): args = { "Filters": [ { "Name": "volume-id", "Values": [volume_id] }, { "Name": "status", "Values": ["completed"] }, { "Name": "tag-key", "Values": ["SnapshotType"]}, { "Name": "tag-value", "Values": [SnapshotType]}, ], "OwnerIds": ["self"] } snapshots = [] while True: resp = client.describe_snapshots(**args) snapshots += resp.get("Snapshots", []) if "NextToken" in resp: args["NextToken"] = resp["NextToken"] else: break return snapshots def delete_snapshot(client, snapshot_id): wait_period = 5 retries = 5 while True: try: client.delete_snapshot(SnapshotId=snapshot_id) return True except Exception as ex: # As the list of snapshot is eventually consistent old snapshots might appear in listed snapshots if getattr(ex, "response", {}).get("Error", {}).get("Code", "") == "'InvalidSnapshot.NotFound": return False # Throttling might occur when deleting snapshots too fast if "throttling" in ex.message.lower(): retries -= 1 if retries == 0: raise ex time.sleep(wait_period) wait_period = min(wait_period + 10 , 30) continue raise ex def lambda_handler(event, context): retentions = {"Day": 5, "Week": 3, "Month": 2} client = boto3.client("ec2") vols = client.describe_volumes() snapshots_deleted = [] for vol in vols['Volumes']: vol_id = vol['VolumeId'] for SnapshotType, retention_count in retentions.items(): snapshots_for_volume = sorted(get_volume_snapshots(client, vol_id, SnapshotType), key=lambda s: s["StartTime"], reverse=True) snapshots_to_delete = [] if retention_count > 0: snapshots_to_delete = [b["SnapshotId"] for b in snapshots_for_volume[retention_count:]] for snapshot_id in snapshots_to_delete: if delete_snapshot(client, snapshot_id): snapshots_deleted.append(snapshot_id) return { "DeletedSnapshots": snapshots_deleted } 

Usamos a função criada acima. Como gatilho, usamos o CloudWatch Event.
essa função passa por todos os volumes, procura todos os volumes de capturas instantâneas concluídas com a tag SnapshotType e remove todas as capturas instantâneas com mais retenções de captura instantânea. Eu tenho os últimos 5 instantâneos diários, 3 semanais e 2 mensais.

Source: https://habr.com/ru/post/pt462601/


All Articles