В настоящее время я пытаюсь настроить сценарий (используя AWS CLI с сервера Ubuntu), который будет делать следующее:
Создайте снимок каждого существующего тома. У этих томов уже есть тег NAME (например, SERVER1, SERVER1DATA, SERVER2, SERVER2DATA и т. Д.).
Переименуйте эти снимки, сделанные с тем же тегом NAMES (чтобы в консоли AWS я мог отфильтровать их по дате и легко идентифицировать их).
Автоматическое переименование - моя главная проблема.
Я играл с командами ec2-describe-volume, ec2-create-snapshot и ec2addtag, но мои сценарии не так хороши. До сих пор мне удалось настроить это, создав список с ИМЯ тома и ИМЯ ТЭГ (эти параметры затем принимаются ec2addtag), но мне придется вручную обновлять этот список каждый раз, когда я добавляю или удаляю том в среде. .
Любая помощь будет принята с благодарностью.
Я не уверен, что полностью понимаю ваш вопрос, но если вы хотите создать список ваших томов вместе с тегами имен, может сработать что-то вроде этого:
aws ec2 describe-tags --query "Tags[*].{Name:Value,ResourceId:ResourceId}" --filters "Name=key,Values=Name" --filters "Name=resource-type,Values=volume" --output json
В основном это говорит: «Дайте мне идентификатор ресурса и значение тега« name »для каждого ресурса типа« Volume ». В этом случае я указал json в качестве вывода. Вы также можете указать« text »или« table » "в зависимости от ваших потребностей.
Другой подход:
aws ec2 describe-volumes --query "Volumes[*].{ID:VolumeId}" --output text
Это вернет список ваших томов. Если вы отправите это в текстовый файл, файл будет просто содержать список идентификаторов томов - по одному на строку.
Затем вы можете получить тег имени для каждого тома в списке примерно так:
aws ec2 describe-tags --query "Tags[*].{Name:Value,ResourceId:ResourceId}" --filters "Name=key,Values=Name" --filters "Name=resource-type,Values=volume" --filters "Name=resource-id,Values=vol-2e293949" --output json
По сути, это означает: «Дайте мне идентификатор ресурса и значение имени тега для указанного идентификатора vol-2e293949.
Как видите, команды интерфейса командной строки могут быть трудными для чтения, а фильтрация и запросы - немного сложными. (В этих примерах используется последняя версия AWS CLI)
Что касается извлечения идентификатора снимка из вашей команды create-snapshot, вы можете сделать это без использования awk / sed / grep / etc. с помощью нескольких функций интерфейса командной строки (запрос и вывод).
Например:
$ SNAP_ID=`aws ec2 create-snapshot --cli-input-json file://$temp_file --query 'SnapshotId' --output text`
$
$ echo "snap id: "$SNAP_ID
snap id: snap-aaaabbbb
$
$ aws ec2 create-tags --resources $SNAP_ID --tags Key=Name,Value=$SOME_NAME
$
Обратите внимание, что при выводе json вместо «текста» возвращаемый идентификатор снимка заключен в двойные кавычки в соответствии со стандартом JSON.
#!/bin/bash
aws ec2 describe-volumes --query "Volumes[*].{ID:VolumeId}" --output text > /tmp/volumes
for i in $(cat /tmp/volumes); do
aws ec2 create-snapshot --volume-id $i | awk {'print $2'} | grep snap* | sed 's/\"//g'|sed 's/\,//g' > /tmp/snapname
SNAPENAME=$(cat /tmp/snapname)
TAGNAME=$(aws ec2 describe-tags --query "Tags[*].{Name:Value,ResourceId:ResourceId}" --filters "Name=key,Values=Name" --filters "Name=resource-type,Values=volume" --filters "Name=resource-id,Values=$i" --output text | awk '{ print $1 }')
sleep 5
aws ec2 create-tags --resources $SNAPENAME --tags Key=Name,Value=$TAGNAME >/dev/null
done
Это немного беспорядочно и, возможно, излишне долго, но оно делает то, что требуется: создает снимок всех доступных томов и (если у них есть теги NAME) затем переименовывает их с этими тегами NAME.
Некоторое время назад я написал этот сценарий bash сделать именно это для меня. По сути, вы устанавливаете его на каждый экземпляр EC2, резервную копию которого вы хотите создать, и предоставляя ему закрытый ключ, файл сертификата и инструменты API EC2, он сам обнаружит идентификатор экземпляра, прикрепленные к нему тома и создать снимок для каждого тома.
Вы должны пометить тома Name
и Device
. Name
- это просто удобное имя, которое появляется в описании снимка. Device
это фактическое имя устройства на сервере. /dev/sdf
например. Наконец, он будет вращать ваши снимки после достижения предопределенного предела. По умолчанию - 50. При создании 51-го снимка самый старый будет удален.