【问题标题】:AWS CLI Windows Batch for daily EBS snapshot用于每日 EBS 快照的 AWS CLI Windows Batch
【发布时间】:2016-10-13 06:56:20
【问题描述】:

TL;TR

aws describe-snapshots返回的快照列表是从新到旧排序的吗?

详情:

我想用AWS CLI 为 Windows 制作每日 EBS 快照。

我的脚本执行以下操作:

  1. 为特定卷创建快照;
  2. 标记快照;
  3. 仅存储最大数量的具有相同标签的快照并删除其他快照。

问题是第 3 点。 当我得到快照列表时,我需要将列表从最旧到最新排序并删除最旧的快照。

我找到的解决方法很简单,我用相同标签的快照列表:

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返回的快照列表,从新到旧排序吗?

完整代码:

@echo OFF

:: Configuration Begin
SET AWS_BACKUP_NAME=Foo
SET AWS_MAX_BACKUPS=5
SET AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
SET AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
SET AWS_REGION=eu-west-1
SET AWS_VOLUME_ID=id-XXXXXXXXXXXXXX
:: Configuration End

:: Current path
SET CURRPATH=%cd%\

:: Get the current date/time according to os
set X=
for /f "skip=1 delims=" %%x in ('wmic os get localdatetime') do if not defined X set X=%%x

:: Set date parts
set DATE_YEAR=%X:~0,4%
set DATE_MONTH=%X:~4,2%
set DATE_DAY=%X:~6,2%
set DATE_HOUR=%X:~8,2%
set DATE_MINUTE=%X:~10,2%
set DATE_SECOND=%X:~12,2%
set DATE_FRACTIONS=%X:~15,6%
set DATE_OFFSET=%X:~21,4%

:: Set the snapshot description with AWS_BACKUP_NAME and current date/time
set SNAPSHOT_DESCRIPTION=%AWS_BACKUP_NAME%-Backup-%DATE_YEAR%-%DATE_MONTH%-%DATE_DAY%_%DATE_HOUR%-%DATE_MINUTE%-%DATE_SECOND%-%DATE_FRACTIONS%

:: Set a file for the aws-cli output
set OUTCREATESNAPSHOT="%CURRPATH%%SNAPSHOT_DESCRIPTION%.txt"

:: 1. Create the snapshot
aws ec2 create-snapshot --region %AWS_REGION% --output=text --description %SNAPSHOT_DESCRIPTION% --volume-id %AWS_VOLUME_ID% --query SnapshotId>%OUTCREATESNAPSHOT%

:: Get the snapshot id from output file
set /p SNAPSHOTID=<%OUTCREATESNAPSHOT%

:: Set the snapshot with a tag
set TAGVALUE=AutomatedBackup%AWS_BACKUP_NAME%

:: 2. Add the tag on the snapshot
aws ec2 create-tags --region %AWS_REGION% --resource %SNAPSHOTID% --tags Key=CreatedBy,Value=%TAGVALUE%

:: Set a file for the aws-cli output
set OUTSNAPSHOTS="%CURRPATH%%AWS_VOLUME_ID%_SNAPSHOTS.txt"

:: Get the snapshots with the current tag
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%

:: 3. Loop on the reverses list but skip the first AWS_MAX_BACKUPS and delete the others
for /f "tokens=2 skip=%AWS_MAX_BACKUPS%" %%s in ('sort /r %OUTSNAPSHOTS%') do (
    aws ec2 delete-snapshot --region %AWS_REGION% --snapshot-id %%s
)

【问题讨论】:

  • AWS 没有记录 describe-snapshots 命令总是返回按最新到最旧排序的快照,所以我会犹豫是否相信它总是会这样的假设。

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


【解决方案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 值并将其作为文本推送到脚本其余部分的输入。

列表将按照列表末尾的最新快照进行排序,您可以确定它将始终如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-10
    • 2017-10-22
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    相关资源
    最近更新 更多