При перезагрузке IP-адрес экземпляра amazon меняется. Как найти новый IP-адрес с помощью java API?
Как найти IP-адрес экземпляра amazon EC2 при перезагрузке
Ответы (11)
Предполагая, что вы не хотите назначать эластичный IP-адрес (и есть причины, по которым это не всегда решение), просто вызовите DescribeInstances на перезагруженном экземпляре, который вернет кучу информации, включая общедоступный IP-адрес.
Вот документация по Java API AWS EC2 по этой теме.
ec2-run-instances или анализ JSON с использованием bash с возвратом JSON из aws ec2 run-instances. Попытка избежать дополнительных зависимостей.
- person JohnAllen; 19.08.2014
DescribeInstances, мне нравится использовать это: aws ec2 describe-instances | grep "Value\|PublicIpAddress" (конечно, вам понадобится установленный aws cli)
- person modulitos; 30.03.2016
При перезагрузке IP-адреса экземпляра EC2 не меняются. Обычно они меняются при остановке/запуске загрузочного экземпляра EBS, отличного от VPC.
Смотрите мой ответ на ваш связанный вопрос здесь:
Тем не менее, вы можете найти частные и общедоступные IP-адреса с помощью вызова API для DescribeInstances на вашем конкретном языке.
Если вы находитесь на самом экземпляре, вы также можете найти IP-адреса через API пользовательских данных, используя простой HTTP:
http://instance-data/latest/meta-data/local-ipv4
http://instance-data/latest/meta-data/public-ipv4
Например,
wget -qO- http://instance-data/latest/meta-data/public-ipv4
Эластичные IP-адреса рекомендуются для сохранения согласованного (статического) внешнего IP-адреса для конкретной службы или сервер. Их необходимо переназначить экземпляру после остановки/запуска (но не после перезагрузки).
Общедоступный IPv4-адрес также доступен из экземпляра EC2 следующим образом:
curl checkip.amazonaws.com
И общедоступное имя хоста:
dig -x $(curl -s checkip.amazonaws.com) +short
вот как я сделал это на экземпляре Ubuntu 12.04 EC2 в VPC:
curl ifconfig.me
не уверен, почему, но public-ipv4 не был найден по URL-адресу метаданных
Чтобы получить общедоступный IP-адрес экземпляра, вам сначала нужно получить идентификатор экземпляра этого экземпляра. Вы можете получить идентификатор экземпляра экземпляра, используя следующий код Java.
List<Instance> instances = runInstancesResult.getReservation().getInstances();
String instanceId = instances.get(0).toString().substring(13, 23);
И теперь, чтобы получить общедоступный IP-адрес, вы можете использовать следующий код Java.
public void fetchInstancePublicIP() {
DescribeInstancesRequest request = new DescribeInstancesRequest().withInstanceIds("i-d99ae7d2");
DescribeInstancesResult result= ec2.describeInstances(request);
List <Reservation> list = result.getReservations();
for (Reservation res:list) {
List <Instance> instanceList= res.getInstances();
for (Instance instance:instanceList){
System.out.println("Public IP :" + instance.getPublicIpAddress());
System.out.println("Public DNS :" + instance.getPublicDnsName());
System.out.println("Instance State :" + instance.getState());
System.out.println("Instance TAGS :" + instance.getTags());
}
}
}
У них есть класс util, который облегчает доступ к метаданным EC2. Например
EC2MetadataUtils.getNetworkInterfaces().get(0).getPublicHostname();
EC2MetadataUtils.getNetworkInterfaces().get(0).getPublicIPv4s();
Предполагая, что вы перезагружаете экземпляр и не запускаете его с нуля, вы можете назначить эластичный IP-адрес, который всегда остается с экземпляром ec2 (если вы не переместите IP-адрес на другой сервер). Это позволяет вам указать весь ваш DNS на этот один IP-адрес и не беспокоиться о том, что перезагрузка вызовет у вас проблемы.
Я думаю, это то, о чем вы спрашиваете, но есть и другие вещи, о которых вы могли бы спрашивать. Внутренний IP-адрес сервера изменяется (если вы перезапустите экземпляр, а не перезагрузитесь), и вы не можете «зарезервировать» его, поэтому вам может потребоваться создать сценарий, чтобы сохранить новый IP-адрес (если вы указываете на него внутренние службы).
надеюсь, это поможет
Вы можете использовать это.
var ipofnewServer = string.Empty;
while (string.IsNullOrEmpty(ipofnewServer))
{
var statusRequest1 = new DescribeInstancesRequest
{
InstanceIds = new List<string>() { instanceId }
};
var result = amazonEc2client.DescribeInstances(statusRequest1);
var status = result.Reservations[0].Instances.FirstOrDefault();
if (status != null)
{
ipofnewServer = status.PublicIpAddress;
}
}
Вы можете использовать приложение CLI CRUD для ресурсов AWS. AWS-CRUD-Manager
Чтобы найти все экземпляры ec2
./awsconsole.py ec2 all
Чтобы найти все данные для одного экземпляра ec2 (включая IP-адреса priv и public)
./awsconsole.py ec2 find -i <id-insta`ce>
Я использовал domain=$(hostname | cut -d "." -f1), но получил IP-адрес как ip-1-2-3-4. Вы не можете использовать hostname -i