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.

Другие вопросы по тегам