TL, TRAWS CLI Windows, Batch для ежедневного EBS снимка
Является aws describe-snapshots
список возвращения снимка заказать новейший из самых старых?
В деталях:
Я хочу, чтобы сделать снимок ежедневно EBS с AWS CLI для Windows.
Мой сценарий выполняет эту работу:
- Создать снимок для определенного объема;
- Отметьте моментальный снимок;
- Хранение только максимального количества снимков с тем же тегом и удаление других.
Проблема является точкой 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, как всегда возвращающая моментальные снимки, упорядоченные по последнему слову, поэтому я не решаюсь полагаться на предположение, что оно всегда будет. – jbird