高能!实现全自动EBS备份[中国区]
我们总是希望机器能为人类多做些事儿,再多做些,再多做些...现在利用cloudwatch + 无服务器化函数Lambda,我们可以实现指定ec2实例磁盘的全自动备份...通过这个教程,我们可以初步感受到无服务器化(serverless)的魅力...懒人福音,大神利器。
-- D.C
内容较多,耐心加载...
要实现全自动这个骚操作,我们会用到两个aws服务:
-
CloudWatch
-
lambda
逻辑关系是: CloudWatch -> lambda -> 备份/删除操作
为lambda创建Policy和Role
我们知道aws对安全是控制得很严的,什么服务有权调用什么服务,那是要用Role里面的Policy来规定的。所以首先我们就要为lambda创建Policy和Role。
- 创建Policy:进入IAM 控制界面,点击左侧的 Policies, 再点击蓝色按钮 Create policy, 点击标签切换到 JSON, 填入以下代码,点击 Review policy。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:*"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "ec2:Describe*",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ec2:*Snapshot*"
],
"Resource": [
"*"
]
}
]
}
- 将这个Policy命名为 Snapshot,描述随便写比如
used to access cw log + ec2 for lambda functions
,点击 Create policy。
- 创建Role:点击左侧导航栏的 Roles, 点击右侧 Create role, 选中 AWS service, Lambda, 点击 Next:Permissions。
- 接着在搜索框搜索刚刚我们创建的策略
Snapshot
, 选中,点击 Next Tags。
-
接着打tag帮助日后回忆,随便打,点击 Next:Review。
-
命名为 LambdaSnapshot, 点击 Create role。
- 这样,一个拥有访问CloudWatch Log和对EC2操作权限的角色,就为lambda创建好了。
创建Lambda函数
所有对EC2的信息获取,判断,对EBS的备份,删除过期备份等等功能,都是通过aws的无服务器化服务lambda
函数来完成的,我们以后会用的越来越多的。
- 在aws console搜索
lambda
,点击进入,然后点击左侧导航栏的 Functions, 再点击右侧窗口的 Create function。
- 保持默认 Author from scratch, 下面的Function name写入
CreateSnapshot
, Runtime 选择Python 3.6
,点击 Create function
- 接着就进入到写函数的界面,把下面的代码贴到默认的
lambda_function.py
中。这段代码的作用是遍历所有的ec2,如果发现ec2上打的tag的key是AutoBackup
且value为yes
的,就为这台EC2的磁盘自动创建snapshot。
import json
import urllib.parse
import boto3
from datetime import datetime,timedelta
print('Loading function')
ec2 = boto3.resource('ec2')
def lambda_handler(event, context):
instances = ec2.instances.filter(Filters=[{'Name': 'tag:AutoBackup', 'Values': ['yes',]}]).all()
for instance in instances:
print("Find AutoSnapshot tagged intance:", instance.id)
for volume in instance.volumes.all():
print("Create snapshot for volume: "+volume.id)
ec2.create_snapshot(VolumeId=volume.id, Description=instance.private_dns_name+" "+volume.id)
- 下拉到 Execution role 这里,修改 Existing role 为我们之前创建的角色 LambdaSnapshot,这样一来我们创建的这个lambda函数就拥有了访问CWL(CloudWatch Log) 和EC2的权限了哦。点击 Save 保存。
- 同理,再创建一个函数名字叫
PurgeSnapshot
,Python 3.6
,角色也设置为 LambdaSnapshot ,点击 Save 保存。
这段代码的意思是找到tag的Key是AutoBackup
,Value是yes
的ec2机器,再找到这台ec2上磁盘对应的snapshot,判断是否过期(是否超过10分钟),过期则将其删除(Purge)。
如果需要修改Purge的周期,可以在代码中修改timedelta
函数里面的参数,比如说:如果要设置Purge 12个小时前的快照,可以把minutes=10
改成hours=12
;如果要设置Purge 7天前的快照,可以改成days=7
。
一般来说,如果我要每周备份一次,那么就可以将删除周期设置成days=8
,保险一点。
import json
import urllib.parse
import boto3
from datetime import datetime,timedelta
print('Loading function')
ec2 = boto3.resource('ec2')
def lambda_handler(event, context):
instances = ec2.instances.filter(Filters=[{'Name': 'tag:AutoBackup', 'Values': ['yes',]}]).all()
for instance in instances:
print("Find AutoSnapshot tagged intance:", instance.id)
for volume in instance.volumes.all():
print("Find Volume:" ,volume.id)
snapshots = ec2.snapshots.filter(Filters=[{'Name': 'volume-id', 'Values': [volume.id]}]).all()
for snapshot in snapshots:
if (datetime.utcnow()-snapshot.start_time.replace(tzinfo=None))>timedelta(minutes=10):
print ("find old snapshot and delete: ", snapshot.id)
snapshot.delete()
else:
print ("newer snapshot: ", snapshot.id)
- 这样,两个lambda函数就创建好了。
CloudWatch event设定周期触发
虽然我们设定了一‘备’一‘删’两个函数,但是还缺少一个周期性的触发器,用来触发这两个动作,那么调用CloudWatch Event这个服务就在合适不过啦。
- 在aws console搜索
cloudwatch
,点击进入,然后点击左侧导航栏 Events 下的 Rules。这里我们要新建两条规则:一条是用来周期触发“备份”,一条则是用来周期触发“删除”。点击 Create rule。
- 选中 Schedule, Fixed rate of 5 Minutes, 意思是每5分钟执行一次,执行什么呢?右侧的 Target - Add target, 下拉菜单选择 Lambda function, 下面再选择 CreateSnapshot 这个函数, 点击 Configure details。(注意:因为这里是测试所以设置 5 分钟,如果实际使用,可以设置 7 Days)
-
名字命名为 AutoBackup, Description随便写比如
AutoBackup for ec2 with AutoBackup tag which value is yes
, 点击Create rule 。 -
如法炮制,再添加一条规则,Fixed rate of 1 Minutes, lambda函数选择 PurgeSnapshot,命名为 DeleteOldSnapshot,Description随便写比如
AutoDelete old snapshot of ec2 with AutoBackup tag which value is yes
。(注意:因为这里是测试所以设置 1 分钟,如果实际使用,可以设置 1 Days)
- 这样就创建了两个定期触发规则了。
给EC2穿上tag马甲
万事俱备,只差马甲了。给我们要自动备份的ec2打上标签吧!
- 选中ec2,点击Actions - Instance Settings - Add/Edit Tags。
- 添加tag, key 为
AutoBackup
,Value为yes
, 点击 Save。
查看EBS磁盘
我们先回忆一下整个过程:
-
每隔 5 分钟,对
AutoBackup
标签值为yes
的ec2的磁盘做一次备份; -
每隔 1 分钟,查看
AutoBackup
标签值为yes
的ec2的磁盘snapshot,如果是 10 分钟前创建的,那就将其删除。 -
回到ec2控制界面,进入EBS下的Snapshots,可以看到每隔 5 分钟,系统就会自动对我指定的ec2进行打snapshot的操作。
- 再过 10 分钟,我们就会发现第一个创建的snapshot已经被删除了。
CloudWatch Log查看日志
- 我们可以回到 CloudWatch ,点击左侧 Logs 下面的 Log Groups,可以找到两个对应的日志文件夹(姑且这么理解吧 x_x )。
- 点击
/aws/lambda/PurgeSnapshot
进去,点击日志文件就可以看到详细的信息哦~
抛砖引玉
各位客官请扪心自问:哪个备份周期最适合我呢???
温馨提示,涉及修改的地方有:
-
PurgeSnapshot代码里面的
timedelta(minutes=10)
-
CloudWatch Event的两条Rule中的
Fixed rate of xxx
-
为你的ec2打上标签
AutoBackup
,需要定期备份的为yes
,不需要的为no
PS: lambda调用的成本灰常灰常低,每 100 万个请求 ¥1.36, 可忽略不计!
成功,建立在人的社会属性之上。