AWS - скрипт для создания снимков EC2 и автоматического их переименования
В настоящее время я пытаюсь настроить скрипт (используя AWS CLI с сервера Ubuntu), который будет делать следующее:
Создайте снимок каждого существующего тома. Эти тома уже имеют тег NAME (например, SERVER1, SERVER1DATA, SERVER2, SERVER2DATA и т. Д.).
Переименуйте эти снимки, сделанные с тем же тегом NAMES (чтобы затем на консоли AWS я мог отфильтровать их по дате и мог легко их идентифицировать).
Автоматическое переименование - моя главная проблема.
Я играл с командами ec2-description-volume, ec2-create-snapshot и ec2addtag, но мои сценарии не так хороши. До сих пор я был в состоянии настроить это, создав список с VOLUME NAME и NAME TAG (эти параметры затем принимаются ec2addtag), но мне пришлось бы вручную обновлять этот список каждый раз, когда я добавляю или удаляю том в среде,
Любая помощь будет принята с благодарностью.
4 ответа
Я не уверен, что полностью понимаю ваш вопрос, но если вам нужно создать список ваших томов вместе с тегами имен, то может сработать что-то вроде этого:
aws ec2 describe-tags --query "Tags[*].{Name:Value,ResourceId:ResourceId}" --filters "Name=key,Values=Name" --filters "Name=resource-type,Values=volume" --output json
По сути, это говорит: "Дайте мне идентификатор ресурса и значение тега" имя "для каждого ресурса типа" Громкость ". В этом случае я указал json в качестве вывода. Вы также можете указать" текст "или" таблица ". "в зависимости от ваших потребностей.
Другой подход:
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.
Как вы можете видеть, команды CLI могут быть сложными для чтения, а фильтрация и запросы немного сложны. (В этих примерах используется последняя версия интерфейса командной строки AWS)
Что касается извлечения идентификатора снимка из вашей команды create-snapshot, вы можете сделать это без использования awk/sed/grep/etc. используя несколько функций CLI (запрос и вывод).
Например:
$ 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 вместо "text" он возвращает возвращенный идентификатор снимка с двойными кавычками в соответствии со стандартом JSON.
Некоторое время назад я написал этот сценарий bash, чтобы сделать именно это для меня. По сути, вы устанавливаете его на каждый экземпляр EC2, для которого вы хотите выполнить резервное копирование, и при условии, что вы даете ему закрытый ключ, файл сертификата и инструменты API EC2, он автоматически обнаружит идентификатор экземпляра, подключенные к нему тома и создать снимок для каждого тома.
Вы должны пометить тома Name
а также Device
, Name
это просто удобное имя, которое появляется в описании снимка. Device
Это фактическое имя устройства на сервере. /dev/sdf
например. Наконец, он будет вращать ваши снимки, как только будет достигнут предопределенный лимит. По умолчанию установлено значение 50. При создании 51-го снимка самый старый снимок будет удален.
#!/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.