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
- Windows Server 2008 R2 ou posterior executando a AWS
- Agente SSM versão 2.2.58.0 ou posterior
- Ferramentas da AWS para Windows PowerShell 3.3.48.0 ou posterior
- AWS System Manager
- Iam
- SNS
- 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:
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.