Я хотел бы автоматически назначить EIP экземпляру при его запуске. Я знаю, что могу написать сценарий, чтобы остановить / запустить экземпляр и назначить EIP, который я хочу, с помощью инструментов EC2, но это зависит от того, когда я остановлю / запустил сервер. В случае сбоя EC2 или аппаратного сбоя, когда Amazon останавливает / запускает мой экземпляр, EIP не будет переназначен.
Я задавал кому-то этот вопрос раньше, и они загадочно упомянули, что это можно сделать с помощью сценария изнутри коробки после загрузки. Затем они отключились, поэтому я не мог следить.
Есть ли способ привязать EIP к экземпляру во время загрузки?
Вы можете сделать это примерно так, в /etc/rc.local на рассматриваемом сервере:
ec2-associate-address --private-key /root/private_key.pem --cert /root/public_key.pem <eip-address> -i `curl http://169.254.169.254/latest/meta-data/instance-id
Используйте VPC, и вам не придется беспокоиться об этой проблеме.
Вот bash, который я написал, чтобы изменить EIP на любом экземпляре VPC, используя понятный Name = "tag", вы также можете указать регион по умолчанию или добавить его в команду.
#change vpc instance public IP address (EIP -> NIC|INSTANCE)
#usage "changeip [instance friendly tag=Name] [region]"
#example "changeip my.instnace us-west-1"
#dafault region is us-west-1 (you must include --region for $region default)
#for VPC instances only
function changeip {
if [[ ! $1 ]]; then
echo 'Error : You must provide tag name for instance'
echo 'Example: changeip [friendly name]'
return
fi
if [[ $2 ]]; then
region='--region '$2
echo 'Using region '$2
else
region='--region us-west-1' #sets default region
echo 'Using default '$region
fi
name=$1
instance=$(ec2-describe-instances $region | grep Name | grep $name | cut -f3)
if [[ ! $instance =~ ^('i-'[A-Za-z0-9]*)$ ]]; then
echo 'Error : Getting the instance id'
echo $instance
return
fi
echo 'Applying to '$1 '=> '$instance
echo 'Please wait....'
ip_new=$(ec2-allocate-address $region -d vpc | cut -f2)
if [[ ! $ip_new =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
echo 'Error : Getting a new IP address'
echo $ip_new
return
fi
new_idas=$(ec2-describe-addresses $region $ip_new | cut -f 5) >> /dev/null
if [[ ! $new_idas =~ ^('eipalloc-'[A-Za-z0-9]*)$ ]]; then
echo 'Error : Getting New IP allocation id eipalloc'
echo $new_idas
return
fi
ip_old=$(ec2-describe-addresses $region | grep $instance | cut -f2)
if [[ ! $ip_old =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
echo 'Error : Getting old IP address'
echo $ip_old
return
fi
id_dis=$(ec2-describe-addresses $region $ip_old | cut -f 6)
if [[ ! $id_dis =~ ^('eipassoc-'[A-Za-z0-9]*)$ ]]; then
echo 'Error : Dissasociating Old IP'
echo $id_dis
return
fi
id_release=$(ec2-describe-addresses $region $ip_old | cut -f 5) >> /dev/null
if [[ ! $new_idas =~ ^('eipalloc-'[A-Za-z0-9]*)$ ]]; then
echo 'Error : Release Old IP'
echo $id_release
return
fi
ec2-disassociate-address $region -a $id_dis >> /dev/null
sleep 8
ec2-release-address $region -a $id_release >> /dev/null
ec2-associate-address $region -i $instance -a $new_idas >> /dev/null
echo 'SUCCESS!'
echo 'Old = '$ip_old
echo 'New = '$ip_new
}
Согласитесь с Эриком, такой вариант неразумный с точки зрения безопасности. Другой вариант - иметь другую машину с учетными данными, отвечающую за ответы на запросы от других машин. Например: Машина с моими учетными данными - EC2-1. Вы запускаете, возможно, 2 машины для запуска ваших веб-серверов, EC2-2 и EC2-3. При начальной загрузке они могут «сигнализировать» об этом EC2-1, который, в свою очередь, запустит вызов API, чтобы связать EC2-2 и EC2-3 с двумя эластичными IP-адресами. Таким образом, вы должны сделать EC2-1 ОЧЕНЬ безопасным, и вы не подвергнетесь риску с другими машинами.
Лучший,
Симона