用于每日EBS快照的AWS CLI Windows Batch

时间:2016-10-13 06:56:21

标签: batch-file amazon-web-services amazon-ec2 aws-sdk aws-cli

TL; TR

MBct:5 , LPct:4 是否返回从最旧的最新订购的快照列表?

详细信息:

我希望使用AWS CLI for Windows制作每日EBS快照。

我的脚本执行此操作:

  1. 为特定卷创建快照;
  2. 标记快照;
  3. 仅存储具有相同标记的最大数量的快照,并删除其他快照。
  4. 问题在于第3点。 当我获得快照列表时,我需要从最旧到最新的快照排序,并删除最旧的快照。

    我发现的解决方案很简单,我使用相同标签的快照列表:

    aws describe-snapshots

    现在,假设列表是从最新快照到最早的快照排序,请按照相反的顺序(从最旧到最新)在aws ec2 describe-snapshots --region %AWS_REGION% --output=text --filters "Name=volume-id,Values=%AWS_VOLUME_ID%" "Name=tag:CreatedBy,Values=%TAGVALUE%" --query Snapshots[].SnapshotId>%OUTSNAPSHOTS% 上循环列表,使用sort /r %OUTSNAPSHOTS%跳过一些,并删除快照:

    skip=%AWS_MAX_BACKUPS%

    我的假设是否正确? for /f "tokens=2 skip=%AWS_MAX_BACKUPS%" %%s in ('sort /r %OUTSNAPSHOTS%') do ( aws ec2 delete-snapshot --region %AWS_REGION% --snapshot-id %%s ) 是否返回快照列表,从最旧的最新订购?

    完整代码:

    describe-snapshots

1 个答案:

答案 0 :(得分:1)

您无法保证快照将按日期排序。

您可以通过在命令中添加jq lib来实现这一目标

aws ec2 describe-snapshots --region %AWS_REGION% \
      --filters "Name=volume-id,Values=%AWS_VOLUME_ID%" "Name=tag:CreatedBy,Values=%TAGVALUE%" \
| jq -r '.Snapshots | sort_by(.StartTime)[] | .SnapshotId' > %OUTSNAPSHOTS%

我将查询参数和输出删除为文本,因为我只是将整个JSon作为jq参数推送。 jq将按日期过滤和排序,将获取SnapshotId值并将其作为文本推送到脚本的其余部分。

列表将被命令在列表的末尾有最新的快照,你可以确定它总是这样。