这一节看看如何通过boto3来管理EC2的快照。在实际生产环境中,豆子使用的是AWS提供的解决方案EBS快照调度器,直接导入Cloudformation的堆栈,会自动配置λ函数和DynamoDB数据库,然后我们可以通过标签来进行设置。从学习的角度,我们直接来弄一个超简易的版本。我们可以直接写两个λ函数,一个进行创建,一个进行删除。
首先,设置一个标签标签
接下来创建λ函数
我的角色配置如下
<代码> { “版本”:“2012-10-17”, “声明”:[{ “效应”:“允许”, “行动”( “日志:CreateLogGroup”, “日志:CreateLogStream”, “日志:PutLogEvents” ), “资源”:“在攻击:aws:日志:*:*:*” }, { “效应”:“允许”, “行动”( “ec2: CreateSnapshot”, “ec2: CreateTags”, “ec2: DeleteSnapshot”, “ec2:描述*”, “ec2: ModifySnapshotAttribute”, “ec2: ResetSnapshotAttribute” ), “资源”:“*” } ] }代码>
具体函数如下所示:
<代码>从datetime进口datetime 进口boto3 def lambda_handler(事件、上下文): ec2_client=boto3.client (ec2) #获取所有地区的名字 区域=[地区[' RegionName '] 为地区ec2_client.describe_regions()(“区域”)) #循环每一个地区,找到所有标签了备份的实例 地区的区域: 打印(“在EC2实例地区{0}:“.format(地区)) ec2=boto3。资源(ec2, region_name=地区)=ec2.instances.filter实例( 过滤器=[ {“名称”:“标签:备份”,“值”:['真的']} ] ) #获取时间戳 # ISO 8601的时间戳,即2019 - 01 - 31 t14:01:58 时间戳=datetime.utcnow () .replace(微秒=0).isoformat () #对每一个实例的每一个体积,都创建一个快照 因为我在instances.all (): 在i.volumes.all v (): desc='{0},备份卷{1},{2}创建“.format ( 我。id, v。id、时间戳) 打印(desc) 快照=v.create_snapshot(描述=desc) 打印(“创建快照:“snapshot.id) 代码>
然后在Cloudwatch里面设置一个计划任务,定期执行这个函数
这个是绑定了角色和触发器的示意图
执行之后,可以查看快照
在Cloudwatch里面查看打印的输出日志,可以看见成功执行了
同样的方式,我们可以创建一个λ函数来删除快照
具体的函数如下:
<代码> 进口boto3 def lambda_handler(事件、上下文): # sts返回的是一个字典,通过得到获取当前账号的ownerId,如果失败则返回没有 account_id=boto3.client (sts) .get_caller_identity () . get(“帐户”) ec2=boto3.client (ec2) ”“”:类型:pyboto3。ec2”“” 区域=[地区[' RegionName '] 为地区ec2.describe_regions()(“区域”)) 地区的区域: 打印(“地区:”区域) ec2=boto3。客户端(ec2, region_name=地区) ”“”:类型:pyboto3。ec2”“” 响应=ec2.describe_snapshots (OwnerIds=[account_id]) 快照=反应(“快照”) 打印(快照) #快照是一个很长的列的表,每个元素是一个字典结构;排序指定通过时间来排的序 #下面等同于 # def sortTime (x): #返回x(“开始时间”) # snapshots.sort(关键=sortTime) #快照的日期升序排序 快照。排序(关键=λx: x[“开始时间”]) #删除快照我们要保持(即3最近) 快照=快照(:3) 快照,快照: id=快照(“SnapshotId”) 试一试: 打印(“删除快照:id) ec2.delete_snapshot (SnapshotId=id) 除了例外e: 打印(“快照使用{},跳过。”.format (id)) 继续λ,AWS和Python的自动化管理操作,自动创建快照,删除快照