Получение идентификатора вновь запущенного экземпляра с помощью ec2-api-tools

Я запускаю экземпляр EC2, вызывая ec2-run-instances из простого сценария bash и хочу выполнить дальнейшие операции с этим экземпляром (например, связать эластичный IP-адрес), для чего мне нужен идентификатор экземпляра.

Команда похожа на ec2-run-instances ami-dd8ea5a9 -K pk.pem -C cert.pem --region eu-west-1 -t c1.medium -n 1, и ее вывод:

RESERVATION r-b6ea58c1    696664755663    default
INSTANCE    i-945af9e3    ami-dd8ea5b9    pending    0    c1.medium    2010-04-15T10:47:56+0000    eu-west-1a    aki-b02a01c4    ari-39c2e94d   

В этом примере i-945af9e3 — это идентификатор, который мне нужен.

Итак, мне нужен простой способ проанализировать идентификатор из того, что возвращает команда - как бы вы это сделали? Мой AWK немного заржавел... Не стесняйтесь использовать любой инструмент, доступный в типичном Linux-компьютере. (Если есть способ получить его напрямую с помощью инструментов EC2-API, тем лучше. Но на самом деле нет команды EC2, чтобы, например, вернуть идентификатор самого последнего запущенного экземпляра.)


person Jonik    schedule 15.04.2010    source источник


Ответы (5)


Завершая ваш правильный ответ, вот сценарий оболочки, который создает экземпляр, запускает некоторые команды и удаляет экземпляр. Он использует awk так же, как и ваш.

#!/bin/sh

# Creates an Amazon EC2 virtual machine (an instance) and runs some
# shell commands on it before terminating it. Just an example.
# Stephane Bortzmeyer <[email protected]>

# Parameters you can set.
# Choose an AMI you like (ami-02103876 is a Debian "lenny")
AMI=ami-02103876
# Create your key pair first, for instance on the Web interface
KEY=test-b
KEYDIR=.
# The user name to use depends on the AMI. "root" is common but check
# the documentation of the AMI.
USERNAME=root
# Needs to be a legal Unix group of commands
COMMANDS="(uname -a; df -h; cat /etc/debian_version)"
MAX_CONNECTS=4
MAX_TESTS=6

# If you want to change from the default region, set the environment
# variable EC2_URL for instance 'export
# EC2_URL=https://ec2.eu-west-1.amazonaws.com' to use the 'eu-west-1'
# region

# Also, be sure your default security group allows incoming SSH.

if [ "${EC2_PRIVATE_KEY}" = "" ] || [ "${EC2_CERT}" = "" ]; then
    echo "You need to have X.509 certificate and private key locally, and to set the environment variables EC2_PRIVATE_KEY and EC2_CERT to indicate their locations" 1>&2
    exit 1
fi

start=$(ec2-run-instances --key ${KEY} $AMI)
if [ $? != 0 ]; then
    echo "Machine did not start" 1>&2
    exit 1
fi

AMI_E=$(echo "$start" | awk '/^INSTANCE/ {print $3}')
if [ "$AMI_E" != "$AMI" ]; then
    echo "AMI does not match (got $AMI_E instead of $AMI), the machine probably did not start" 1>&2
    exit 1
fi
INSTANCE=$(echo "$start" | awk '/^INSTANCE/ {print $2}')

# I do not find a way to block until the machine is ready. We

# apparently have to poll.
OVER=0
TESTS=0
while [ $OVER != 1 ] && [ $TESTS -lt $MAX_TESTS ]; do
    description=$(ec2-describe-instances ${INSTANCE})
    STATE=$(echo "$description" | awk '/^INSTANCE/ {print $6}')
    NAME=$(echo "$description" | awk '/^INSTANCE/ {print $4}')
    if [ "$NAME" = "" ]; then
        echo "No instance ${INSTANCE} available. Crashed or was terminated." 1>&2
        exit 1
    fi
    if [ $STATE = "running" ]; then
        OVER=1
    else
        # I like bc but 'echo $(( TESTS+=1 ))' should work, too. Or expr.
        TESTS=$(echo $TESTS+1 | bc)
        sleep 2
    fi
done
if [ $TESTS = $MAX_TESTS ]; then
    echo "${INSTANCE} never got to running state" 1>&2
    ec2-terminate-instances ${INSTANCE}
    exit 1
fi
echo "$INSTANCE is running, name is $NAME"
# The SSH server does not seem reachable immediately. We again have to poll
OVER=0
TESTS=0
while [ $OVER != 1 ] && [ $TESTS -lt $MAX_CONNECTS ]; do
    ssh -o "StrictHostKeyChecking no" -i ${KEYDIR}/${KEY}.pem ${USERNAME}@$NAME "${COMMANDS}"
    if [ $? != 255 ]; then
        # It means we connected successfully (even if the remote command failed)
        OVER=1
    else
        TESTS=$(echo $TESTS+1 | bc)
        sleep 3
    fi
done
if [ $TESTS = $MAX_CONNECTS ]; then
    echo "Cannot connect to ${NAME}" 1>&2
fi
ec2-terminate-instances ${INSTANCE}
person bortzmeyer    schedule 13.10.2011

Хорошо, по крайней мере, что-то вроде этого должно работать:

instance_id=$(ec2-run-instances ami-dd8ea5a9 [...] | awk '/INSTANCE/{print $2}') 

По общему признанию, я был немного ленив, думая, что быстрее спросить на SO, чем заново изучать некоторые основы AWK... :-)

Изменить: упрощенное использование AWK, как предложил Деннис. Кроме того, использование $() вместо `` для ясности и избавление от промежуточной переменной.

person Jonik    schedule 15.04.2010
comment
Нет необходимости в grep: `awk '/INSTANCE/{print $2}' - person Dennis Williamson; 15.04.2010
comment
Спасибо @Dennis - теперь стало немного чище - person Jonik; 15.04.2010
comment
Я не могу заставить ваш awk работать в Ubuntu bash. instance_id=$((ec2-run-instances ami-2b0b1442 -O aws-access-key-id -W aws-secret-access-key -k my-key -g default -t m1.small | awk '/INSTANCE/ {print $2}') | awk '/INSTANCE/{prin $2}') ; эхо $instance_id ›› ~/instance_id.txt - person Dennis; 14.06.2014
comment
Я вижу ошибку в печати, время редактирования истекло, не удалось закончить. Также обнаружено, что в комментариях нельзя использовать клавишу ‹RETURN›. - person Dennis; 14.06.2014
comment
Когда я заменил команды «egrep и cut» снизу, это сработало. - person Dennis; 14.06.2014

В качестве альтернативы ec2-run-instances вы можете создать один экземпляр ec2 и получить InstanceId одной строкой с помощью awscli экземпляры запуска:

export MyServerID=$(aws ec2 run-instances --image-id AMI --count 1 --instance-type t2.micro --key-name "my_ssh_key" --security-group-ids sg-xxx --subnet-id subnet-yyy --query 'Instances[0].InstanceId' --output text)
person Alexey Vazhnov    schedule 30.10.2018

Нет необходимости использовать awk:

# create the instance and capture the instance id
echo "Launching instance..."
instanceid=$(ec2-run-instances --key $pemkeypair --availability-zone $avzone $ami | egrep ^INSTANCE | cut -f2)
if [ -z "$instanceid" ]; then
    echo "ERROR: could not create instance";
    exit;
else
    echo "Launched with instanceid=$instanceid"
fi

из http://www.hulen.com/post/22802124410/unattended-amazon-ec2-install-script

person user2305615    schedule 12.05.2013

person    schedule
comment
Ссылка на потенциальное решение всегда приветствуется, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы у ваших коллег-пользователей представление о том, что это такое и зачем оно там. Всегда цитируйте наиболее релевантную часть важной ссылки на случай, если целевой сайт недоступен или навсегда отключится. Учтите, что не более чем ссылка на внешний сайт является возможной причиной почему и как некоторые ответы удалены?. - person Tunaki; 09.11.2016
comment
#получить идентификатор экземпляра cat sample.json | jq '.Instances[0].InstanceId'|sed -e 's/^//' -e 's/$//' #check instances запущен или нет cat status.json | jq '.InstanceStatuses[0].InstanceState.Name'|sed -e 's/^//' -e 's/$//' - person Aakash Kag; 09.11.2016
comment
Чтобы запустить приведенную выше команду, установите jq, а затем сохраните ответ json в файле, а затем попробуйте... ссылка на установку для jq уже опубликована в моем ответе выше. - person Aakash Kag; 09.11.2016
comment
Пожалуйста, отредактируйте свой ответ, указав эту информацию, вместо того, чтобы публиковать комментарии. - person Tunaki; 09.11.2016