λ,AWS和Python的自动化管理操作,自动创建快照,删除快照

  

这一节看看如何通过boto3来管理EC2的快照。在实际生产环境中,豆子使用的是AWS提供的解决方案EBS快照调度器,直接导入Cloudformation的堆栈,会自动配置λ函数和DynamoDB数据库,然后我们可以通过标签来进行设置。从学习的角度,我们直接来弄一个超简易的版本。我们可以直接写两个λ函数,一个进行创建,一个进行删除。

  

首先,设置一个标签标签

  

λ,AWS和Python的自动化管理操作,自动创建快照,删除快照

  

接下来创建λ函数

  

λ,AWS和Python的自动化管理操作,自动创建快照,删除快照

  

我的角色配置如下

  
 <代码> {
  “版本”:“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里面设置一个计划任务,定期执行这个函数

  

λ,AWS和Python的自动化管理操作,自动创建快照,删除快照

  

这个是绑定了角色和触发器的示意图

  

λ,AWS和Python的自动化管理操作,自动创建快照,删除快照

  

执行之后,可以查看快照
λ,AWS和Python的自动化管理操作,自动创建快照,删除快照

  

在Cloudwatch里面查看打印的输出日志,可以看见成功执行了

  

λ,AWS和Python的自动化管理操作,自动创建快照,删除快照

  

同样的方式,我们可以创建一个λ函数来删除快照
λ,AWS和Python的自动化管理操作,自动创建快照,删除快照

  

具体的函数如下:

  
 <代码>
  进口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的自动化管理操作,自动创建快照,删除快照