Как найти IP-адрес экземпляра amazon EC2 при перезагрузке

При перезагрузке IP-адрес экземпляра amazon меняется. Как найти новый IP-адрес с помощью java API?


person figaro    schedule 23.09.2011    source источник
comment
Почему бы вам не назначить фиксированный эластичный IP-адрес?   -  person okrasz    schedule 23.09.2011


Ответы (11)


Предполагая, что вы не хотите назначать эластичный IP-адрес (и есть причины, по которым это не всегда решение), просто вызовите DescribeInstances на перезагруженном экземпляре, который вернет кучу информации, включая общедоступный IP-адрес.

Вот документация по Java API AWS EC2 по этой теме.

person Eight-Bit Guru    schedule 23.09.2011
comment
Я проголосовал за вас, восьмибитный гуру. Знаете ли вы какой-либо простой способ получить InstanceID последнего созданного экземпляра для немедленного связывания ElasticIP? Насколько мне известно, для этого требуется анализ возвращаемой информации из ec2-run-instances или анализ JSON с использованием bash с возвратом JSON из aws ec2 run-instances. Попытка избежать дополнительных зависимостей. - person JohnAllen; 19.08.2014
comment
Чтобы пояснить приведенную выше команду DescribeInstances, мне нравится использовать это: aws ec2 describe-instances | grep "Value\|PublicIpAddress" (конечно, вам понадобится установленный aws cli) - person modulitos; 30.03.2016
comment
За что спасибо, добрый анонимный downvoter. Ваша причина немного снизить мою репутацию, наказав мой шестилетний принятый ответ, настолько очевидна, что комментарии не требуются! - person Eight-Bit Guru; 31.01.2017

При перезагрузке IP-адреса экземпляра EC2 не меняются. Обычно они меняются при остановке/запуске загрузочного экземпляра EBS, отличного от VPC.

Смотрите мой ответ на ваш связанный вопрос здесь:

https://stackoverflow.com/questions/7533871/difference-between-rebooting-and-stop-starting-an-amazon-ec2-instance

Тем не менее, вы можете найти частные и общедоступные 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-адреса для конкретной службы или сервер. Их необходимо переназначить экземпляру после остановки/запуска (но не после перезагрузки).

person Eric Hammond    schedule 24.09.2011
comment
Это твердый полный ответ. Wget предоставляет конкретный правильный ответ, и окружающая проза также полезна / полезна. - person WestCoastProjects; 20.02.2015

Общедоступный IPv4-адрес также доступен из экземпляра EC2 следующим образом:

curl checkip.amazonaws.com

И общедоступное имя хоста:

dig -x $(curl -s checkip.amazonaws.com) +short
person holmb    schedule 04.04.2016
comment
это действительно работало лучше. Приведенный выше ответ /public-ipv4 работал до недавнего времени, и я не был уверен, что AWS изменил что-то или ограничение трафика через ELB имело значение, но я получал отчет о своем эластичном IP-адресе в обоих экземплярах. Однако проверка curl сделала это правильно: мой эластичный IP-адрес на одном и случайный назначенный на другом. - person Kris White; 28.09.2016

вот как я сделал это на экземпляре Ubuntu 12.04 EC2 в VPC:

curl ifconfig.me

не уверен, почему, но public-ipv4 не был найден по URL-адресу метаданных

person Amir Aliabadi    schedule 11.02.2014
comment
Работает на CentOS 7. - person Alien Life Form; 16.05.2017

Чтобы получить общедоступный 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());
         }     
    }
}
person Sachin Gaykar    schedule 08.08.2014

У них есть класс util, который облегчает доступ к метаданным EC2. Например

EC2MetadataUtils.getNetworkInterfaces().get(0).getPublicHostname();
EC2MetadataUtils.getNetworkInterfaces().get(0).getPublicIPv4s();
person Igor    schedule 13.07.2015

Предполагая, что вы перезагружаете экземпляр и не запускаете его с нуля, вы можете назначить эластичный IP-адрес, который всегда остается с экземпляром ec2 (если вы не переместите IP-адрес на другой сервер). Это позволяет вам указать весь ваш DNS на этот один IP-адрес и не беспокоиться о том, что перезагрузка вызовет у вас проблемы.

Я думаю, это то, о чем вы спрашиваете, но есть и другие вещи, о которых вы могли бы спрашивать. Внутренний IP-адрес сервера изменяется (если вы перезапустите экземпляр, а не перезагрузитесь), и вы не можете «зарезервировать» его, поэтому вам может потребоваться создать сценарий, чтобы сохранить новый IP-адрес (если вы указываете на него внутренние службы).

надеюсь, это поможет

person Lostsoul    schedule 23.09.2011

Вы можете использовать это.

                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;
                    }
                }
person Viral Prajapati    schedule 12.02.2016

Вы можете использовать приложение CLI CRUD для ресурсов AWS. AWS-CRUD-Manager

Чтобы найти все экземпляры ec2

./awsconsole.py ec2 all

Чтобы найти все данные для одного экземпляра ec2 (включая IP-адреса priv и public)

./awsconsole.py ec2 find -i <id-insta`ce>
person Rafal    schedule 15.10.2018

Я использовал domain=$(hostname | cut -d "." -f1), но получил IP-адрес как ip-1-2-3-4. Вы не можете использовать hostname -i

person DeadlyChambers    schedule 21.06.2021

person    schedule
comment
Это должен быть принятый ответ, а также то, что они говорят в документах. docs.aws.amazon.com/AWSEC2/latest/ Руководство пользователя/ - person jontsai; 12.08.2016
comment
Что за странный IP? Является ли вызов этого неизвестного IP-адреса со своего сервера угрозой безопасности? :D Я предложил редактирование, объясняющее этот IP, и похоже, что оно не было принято. - person Ravindranath Akila; 24.01.2017
comment
@RavindranathAkila нет, вы можете использовать эту команду из своего экземпляра EC2. - person Alex thunder Shevchenko; 11.07.2017
comment
Это больше не работает, очевидно, они обновили API метаданных. - person Dan Pritts; 10.07.2018