Назад | Перейти на главную страницу

AWS - Скрипт для создания снимков состояния EC2 и их автоматического переименования

В настоящее время я пытаюсь настроить сценарий (используя AWS CLI с сервера Ubuntu), который будет делать следующее:

Автоматическое переименование - моя главная проблема.

Я играл с командами 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-го снимка самый старый будет удален.