1

TL, TRAWS CLI Windows, Batch для ежедневного EBS снимка

Является aws describe-snapshots список возвращения снимка заказать новейший из самых старых?

В деталях:

Я хочу, чтобы сделать снимок ежедневно EBS с AWS CLI для Windows.

Мой сценарий выполняет эту работу:

  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 
) 
+2

Команда «описать-снимки» не документирована AWS, как всегда возвращающая моментальные снимки, упорядоченные по последнему слову, поэтому я не решаюсь полагаться на предположение, что оно всегда будет. – jbird

ответ

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 и нажимать его как текст для ввода для остальной части вашего скрипта.

В списке будет указан самый новый моментальный снимок в конце списка, и вы можете быть уверены, что он всегда будет таким.

+0

Отлично! благодаря! – ar099968