Amazon ec2 如何在重新启动时查找amazon EC2实例的IP地址

Amazon ec2 如何在重新启动时查找amazon EC2实例的IP地址,amazon-ec2,reboot,Amazon Ec2,Reboot,重新启动时,amazon实例的IP地址会更改。如何使用java API查找新的IP地址?假设您重新启动了实例,并且没有从头启动,那么您可以分配一个始终保留在ec2实例中的弹性IP(除非您将IP移动到另一台服务器)。这允许您将所有DNS指向该IP,而不必担心重新启动会导致问题 我想这就是你的要求,但你还可以问其他的问题。服务器的内部IP发生变化(如果您重新启动实例而不是重新启动),并且您无法“保留”它,因此您可能需要创建一个脚本来保留新的IP(如果您的内部服务指向它) 如果您不想分配弹性IP地址(

重新启动时,amazon实例的IP地址会更改。如何使用java API查找新的IP地址?

假设您重新启动了实例,并且没有从头启动,那么您可以分配一个始终保留在ec2实例中的弹性IP(除非您将IP移动到另一台服务器)。这允许您将所有DNS指向该IP,而不必担心重新启动会导致问题

我想这就是你的要求,但你还可以问其他的问题。服务器的内部IP发生变化(如果您重新启动实例而不是重新启动),并且您无法“保留”它,因此您可能需要创建一个脚本来保留新的IP(如果您的内部服务指向它)


如果您不想分配弹性IP地址(这并不总是一个解决方案,这是有原因的),那么只需在重新启动的实例上调用
descripbeinstances
,它将返回一系列信息,包括公共IP地址


以下是有关此主题的详细信息。

重新启动时,EC2实例的IP地址不会更改。它们通常在非VPC EBS引导实例停止/启动时发生更改

请参见我对您相关问题的回答:

也就是说,您可以通过特定语言的API调用找到私有和公共IP地址

如果您在实例本身上,还可以使用简单的HTTP通过用户数据API找到IP地址:

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地址。在停止/启动后(但不是重新启动后),这些需要重新分配给实例。

这是我在VPC中的Ubuntu 12.04 EC2实例上所做的:

curl ifconfig.me

不确定原因,但在元数据url下未找到public-ipv4。要获取实例的公共IP,首先需要获取该实例的实例id。您可以使用以下java代码获取实例的实例id

 List<Instance> instances = runInstancesResult.getReservation().getInstances();

 String instanceId = instances.get(0).toString().substring(13, 23);
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());
         }     
    }
}
List instances=runInstancesResult.getReservation().getInstances();
字符串instanceId=instances.get(0).toString().substring(13,23);
现在,为了获得公共IP,您可以使用以下java代码

 List<Instance> instances = runInstancesResult.getReservation().getInstances();

 String instanceId = instances.get(0).toString().substring(13, 23);
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());
         }     
    }
}
public void fetchInstancePublicIP(){
DescribeInstanceRequest请求=新的DescribeInstanceRequest()。带有InstanceId(“i-d99ae7d2”);
DescribeInstancesResult结果=ec2。describeInstances(请求);
List=result.getReservations();
用于(预订资源:列表){
List instanceList=res.getInstances();
例如(实例:instanceList){
System.out.println(“公共IP:+instance.getPublicIpAddress());
System.out.println(“公共DNS:+instance.getPublicDnsName());
System.out.println(“实例状态:+Instance.getState());
System.out.println(“实例标记:“+Instance.getTags());
}     
}
}

他们有一个util类,可以方便地访问EC2元数据。 比如说

EC2MetadataUtils.getNetworkInterfaces().get(0).getPublicHostname();
EC2MetadataUtils.getNetworkInterfaces().get(0).getPublicIPv4s();
你可以用这个

                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;
                    }
                }
var-ipofnewServer=string.Empty;
while(string.IsNullOrEmpty(ipofnewServer))
{
var statusRequest1=新描述安装请求
{
instanceId=新列表(){instanceId}
};
var result=amazonEc2client.descripbeinstances(statusRequest1);
var status=result.Reservations[0]。Instances.FirstOrDefault();
如果(状态!=null)
{
ipofnewServer=status.PublicIpAddress;
}
}

公共IPv4地址也可从EC2实例获得,如下所示:

curl checkip.amazonaws.com
公共主机名为:

dig -x $(curl -s checkip.amazonaws.com) +short

您可以将CLI CRUD应用程序用于AWS资源。 r

查找所有ec2实例

./awsconsole.py ec2 all
查找一个ec2实例的所有数据(包括IP priv和public)

/awsconsole.py ec2 find-i

你为什么不分配一个固定的弹性IP?我把你选为八位大师。您知道有什么简单的方法可以获取上次创建的实例的InstanceID,以便立即关联ElasticIP吗?据我所知,它需要解析从
ec2运行实例返回的信息
,或者使用bash解析JSON,并从
aws ec2运行实例返回JSON。试图避免额外的依赖关系。为了澄清上面的
descripbeinstances
命令,我喜欢使用以下命令:
aws ec2 description instances | grep“Value\| PublicIpAddress”
(当然,您需要安装aws cli)谢谢,谢谢。你责骂我六岁时接受的答案,从而使我的代表稍受打击,这是显而易见的,不需要任何评论!这是一个可靠的完整答案。“wget”提供了具体的正确答案,周围的文章也很有帮助/有用。这应该是公认的答案,也是他们在文档中所说的。那奇怪的IP是什么?从服务器调用此未知IP是否存在安全威胁我建议编辑一下,解释一下IP,但看起来不是accepted@RavindranathAkila不,您可以在EC2实例中使用此命令。此命令不再有效,他们显然已经更新了元数据API。这实际上效果更好。上面的答案/public-ipv4直到最近才起作用,不确定AWS是否改变了什么,或者限制通过ELB的流量是否起到了作用,但我在这两个实例上都得到了弹性IP的报告。但是卷曲校验正确,一个是我的弹性ip,另一个是随机分配的。适用于CentOS 7