在AWS中备份Windows服务器

我们在AWS中有Windows服务器,任务是配置备份。 您可以使用快照,但是这样会导致数据完整性出现问题。 我也想保留每周和每月快照,但是快照的生命周期不提供此功能。 新的AWS Backup服务还不知道如何完成快照,或者我还没有找到如何做。 好吧,我希望所有这些事情在没有我参与的情况下尽可能多地工作。

为了完成我们需要的任务

  1. Windows Server 2008 R2或更高版本运行AWS
  2. SSM代理版本2.2.58.0或更高版本
  3. 适用于Windows PowerShell 3.3.48.0的AWS工具或更高版本
  4. AWS系统管理员
  5. 雅姆
  6. 社交网络
  7. 拉姆达

首先,我们需要服务器角色。 该角色应启用AWS SSM和EBS快照的创建。

转到IAM→策略→创建策略。
转到JSON标签并插入

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

我们在“名称”中按“评论”策略,我们编写类似VssSnapshotPolicy的内容。 保存到

现在创建一个角色。
IAM→角色→创建角色

选择AWS服务→EC2并转到权限。

在这里,我们为SMM添加了AmazonSSMManagedInstanceCore以及我们之前创建的VssSnapshotPolicy的策略。 如果需要,请为我们的角色分配一个标签并为其命名,例如VssSnapshotRole。

然后,我们将此角色分配给所需的服务器。

现在,所有ssm都可以“管理”这些服务器。

现在,我们需要将AWSVssComponents放在服务器上。 为此,请选择“运行”命令,然后单击“运行命令”,查找AWS-ConfigureAWSPackage。

在“命令”参数中,选择“安装”,“名称-AwsVssComponents”(最新版本)。
在目标中,我们选择要备份的系统。

单击运行。

完成后,我们可以从SSM控制台进行备份。

选择运行命令,查找AWSEC2-CreateVssSnapshot。 我们将服务器安装在Target中。 选择选项“排除启动卷”,“仅复制”和“无写入器”。

单击运行。 我们必须创建快照。

对于备份通知,请创建一个SNS主题。 并订阅它。 我正在使用电子邮件通知。

我们创建了允许依次发送邮件的策略

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

并使用此策略创建角色。

为了使过程自动化,我们将使用SSM维护窗口。

单击创建维护窗口。 填写名称,按自己的喜好填写时间表。

我们进入创建的维护窗口,并添加Register RUN命令任务。 填写参数。 在标记中,我写备份的类型(标记键= SnapshotType,值=)。 我有三个可能的参数:日,周,月,以及相应的三个维护时段。 设置“启用SNS通知”,并指明我们在sns和主题方面的角色。

现在将按计划创建所有快照。

一段时间后,我们将有太多快照-需要清理它们。 为此,我们将使用另一个AWS服务-Lambda。

首先,创建一个可以读取和删除快照的角色。

为此,我们在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": "*" } ] } 

我们将这项政策挂上了新的角色。

转到lambda并创建一个新的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 } 

我们使用上面创建的角色。 作为触发,我们使用CloudWatch Event。
此功能遍历所有卷,搜索所有使用SnapshotType标记完成的快照的卷,并删除所有保留更多快照的快照。 我有最近的每日5张,每周3张和每月2张快照。

Source: https://habr.com/ru/post/zh-CN462601/


All Articles