我们在AWS中有Windows服务器,任务是配置备份。 您可以使用快照,但是这样会导致数据完整性出现问题。 我也想保留每周和每月快照,但是快照的生命周期不提供此功能。 新的AWS Backup服务还不知道如何完成快照,或者我还没有找到如何做。 好吧,我希望所有这些事情在没有我参与的情况下尽可能多地工作。
为了完成我们需要的任务
- Windows Server 2008 R2或更高版本运行AWS
- SSM代理版本2.2.58.0或更高版本
- 适用于Windows PowerShell 3.3.48.0的AWS工具或更高版本
- AWS系统管理员
- 雅姆
- 社交网络
- 拉姆达
首先,我们需要服务器角色。 该角色应启用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:
我们使用上面创建的角色。 作为触发,我们使用CloudWatch Event。
此功能遍历所有卷,搜索所有使用SnapshotType标记完成的快照的卷,并删除所有保留更多快照的快照。 我有最近的每日5张,每周3张和每月2张快照。