AWS требуется время, чтобы вызвать экземпляр из AMI. Если вы попытаетесь подключиться слишком быстро и слишком часто, окно не сможет ответить. Полный сценарий ниже запускает AMI, определяет IP-адрес и ждет, пока система не будет готова к подключению. Это будет очень хорошо работать для спотовых экземпляров, близких или ниже текущих цен, так как время, необходимое для подключения, может сильно различаться.
Следующий цикл вызвал ошибку отказа в соединении, когда оператор сна был закомментирован, и он начался слишком быстро после запуска экземпляра. Он также потреблял много ресурсов процессора на сервере сценариев и делал огромные журналы ошибок.
`nc -z $ip_address -w 20 22` 1>/dev/null 2>&1; result=$?;
while [ $result -eq 1 ]
do
#echo $ip_address booting
`nc -z $ip_address -w 30 22` 1>/dev/null 2>&1; result=$?;
sleep 30
done
Вот полный скрипт для запуска экземпляра, тегирования его, ожидания его полной загрузки и подключения.
instance_id=$(aws ec2 run-instances --region us-east-1 --count 1 --instance-type $AMItype --image-id $ami --security-group-ids $sg_group --output text --query 'Instances[*].InstanceId' )
aws ec2 create-tags --resources $instance_id --tags "Key=Name, Value=$AMIname
#delay until AWS says instance is running
start_state=0
while [ $start_state -ne 16 ]
do
start_state=$(aws ec2 start-instances --instance-ids $instance_id --query 'StartingInstances[*].PreviousState[*].Code[*]' )
start_state=$(echo $start_state | tr -d '" []')
sleep 10
done
ip_address=$(aws ec2 describe-instances --instance-ids $instance_id --output text --query 'Reservations[*].Instances[*].PrivateIpAddress')
`nc -z $ip_address -w 20 22` 1>/dev/null 2>&1; result=$?;
while [ $result -eq 1 ]
do
#waiting for routing updates and connectivity
`nc -z $ip_address -w 30 22` 1>/dev/null 2>&1; result=$?;
sleep 30
done