千家信息网

利用lambda函数自动创建EBS快照和删除快照

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,利用lambda函数自动创建EBS快照和删除快照此文章参考了AWS中国区关于构建自动化EBS快照周期的官方文档,参考链接"https://amazonaws-china.com/cn/blogs/ch
千家信息网最后更新 2025年01月23日利用lambda函数自动创建EBS快照和删除快照

利用lambda函数自动创建EBS快照和删除快照

此文章参考了AWS中国区关于构建自动化EBS快照周期的官方文档,参考链接"https://amazonaws-china.com/cn/blogs/china/construct-ebs-life-circle-management/" 本文与之不同的是,本文没有使用dynamoDB服务,仅通过lambda完成了EBS的快照备份。当然,自动快照一定要搭配自动删除功能使用,否则快照容量越来越大,无形中增加了企业的IT成本。

使用阿里云和腾讯云的平台的时候,一直觉得自动快照策略是云厂商最基本的功能,所以在接手aws云项目后还保持着这种思维定式。直到我负责的一个aws 云上项目迁移完毕后,真正开始做快照备份时,才发现AWS 中国区平台上并没有创建快照策略的功能,而是要自己写Lambda函数,然后通过Cloudwatch event去触发...此处省略1千字...

  • 创建/删除快照的步骤:为需要打快照的EBS磁盘打上tag---->创建策略和运行lamda函数的角色---->创建函数---->添加触发器和日志

快照创建自动化


  • 1、对需要做快照的 EBS 卷打上标签,标签至少要有两组;
KeyValue说明
Name用户自定义不能包含中文字符
SnapshotSnapshot必须项,且Key为Snapshot
  • 2、创建策略和角色
    step1:进入IAM控制台,创建策略,选择json格式并输入如下字符串(代表该账号对EC2有查看信息和操作快照的功能)
    {"Version": "2012-10-17","Statement": [    {        "Effect": "Allow",        "Action": [            "logs:*"        ],        "Resource": "*"    },    {        "Effect": "Allow",        "Action": "ec2:Describe*",        "Resource": "*"    },    {        "Effect": "Allow",        "Action": [            "ec2:CreateSnapshot",            "ec2:DeleteSnapshot",            "ec2:CreateTags",            "ec2:ModifySnapshotAttribute",            "ec2:ResetSnapshotAttribute"        ],        "Resource": [            "*"        ]    }]}

点击查看策略,可以看到该json文件是指定对EC2和Log服务的部分权限。输入策略名称lambda_ebs_snapshot和描述后点击保存。

step2、创建角色
选择受信任的实体为(lambda)--->设置策略为(lambda_ebs_snapshot)--->创建标签--->输入角色名称和描述后点击保存。

注意:此处的信任实体必须选择lambda,否则后续使用该角色调用lambda函数时会发生权限未认证的错误。
  • 3、创建函数
    step1、进入lambda控制台,点击左侧函数,点击右上角的新建函数。
    进入到创建函数页面,输入函数名称为my_ebs_snapshots、和运行平台Python3.6、权限这里选择现有角色、点击现有角色,选择刚才创建的角色lambda_ebs_snapshots,点击创建。

    step2、函数创建完成后,进入到配置阶段。
    前面操作都无误的情况下,此处可以看到我们的lambda函数对Log和EC2都有操作权限。

    点击下方在线编辑代码,输入自动备份ebs快照的代码。
    import boto3import os,timefrom botocore.exceptions import ClientErrorfrom datetime import datetime, timedelta, timezoneclient = boto3.client('ec2')ec2 = boto3.resource('ec2')def lambda_handler(event, context):os.environ['TZ'] = 'Asia/Shanghai'time.tzset()i=time.strftime('%X %x %Z')     # set volume id, get volume who has a tag-key is 'Snapshot'describe_volumes=client.describe_volumes(Filters=[{'Name': 'tag-key','Values': ['Snapshot',]      }])volume_id_list = []for vol in describe_volumes['Volumes']:volume_id_list.append(vol.get('VolumeId'))    # set snapshotfor volume_id in volume_id_list:volume = ec2.Volume(volume_id)for tags in volume.tags:if(tags.get('Key') == 'Name'):volume_name = tags.get('Value')description = volume_name + ' volume snapshot is created at ' + i  try:response = client.create_snapshot(Description=description,VolumeId=volume_id)except:print('Create Snapshot occured error, Volume id is ' + volume_id)else:print('Snapshot is created succeed, Snapshot id is ' + response.get('SnapshotId'))
  • 4、创建触发器
    step1、点击左侧CloudWatch Event,开始配置。如下表示每天晚上23:00开始触发执行函数。

完成后,点击添加。
step2、接下来开始配置CloudWatch log,点击添加。

以上步骤均完成后,点击右上角保存。

附:Lambda函数执行日志

快照删除自动化


此处以保留6天快照数据为例,大家可以根据实际情况进行测试和调整。my_ebs_snapshot_delete函数代码如下:

import reimport boto3import os,timefrom botocore.exceptions import ClientErrorfrom datetime import datetime, timedelta, timezoneclient = boto3.client('ec2')ec2 = boto3.resource('ec2')def lambda_handler(event, context):    s=0    os.environ['TZ'] = 'Asia/Shanghai'    time.tzset()    # i=time.strftime('%X %x %Z')    i=time.strftime('%x %Z')    j=((datetime.now()-timedelta(days=7)).strftime('%x %Z'))    print (j)     # set volume id, get volume who has a tag-key is 'Snapshot'    describe_volumes=client.describe_volumes(        Filters=[            {                'Name': 'tag-key',                'Values': ['Snapshot',                ]            }        ]    )    volume_id_list = []    for vol in describe_volumes['Volumes']:        volume_id_list.append(vol.get('VolumeId'))    # set snapshot    for volume_id in volume_id_list:        volume = ec2.Volume(volume_id)        #print (volume_id)        for tags in volume.tags:            if(tags.get('Key') == 'Name'):                volume_name = tags.get('Value')        #description = volume_name + ' volume snapshot is created at ' + i        for snapshot in volume.snapshots.all():                match=re.findall(j,snapshot.description)                if match:                     s=s+1                    print(snapshot.description)                    snapshot.delete()    print ('符合条件的快照个数为'+str(s))

为了便于测试函数执行结果,建议大家在函数页面内配置测试事件,这样就不需要频繁修改触发器来完成触发了。

0