2016-11-28 77 views
0

我正尝试使用AWS开发工具包获取AWS中所有EC2实例的实例ID。无法联系EC2元数据服务

AmazonEC2 ec2Service = null; 
    String aWSAccessId = "XXXXXXXXXXXXXXXXXXXX"; 
    String aWSSecretKey = "XXXXXXXXXXXXXXXXXXXXX"; 
    if (null != aWSAccessId && !"".equals(aWSAccessId) 
      && null != aWSSecretKey && !"".equals(aWSSecretKey)) { 
     ec2Service = new AmazonEC2Client(new BasicAWSCredentials(aWSAccessId, aWSSecretKey)); 
    } 
    DescribeInstancesResult result = ec2Service.describeInstances(); 
    String instanceid = EC2MetadataUtils.getInstanceId(); 
    String availabilityZone = EC2MetadataUtils.getAvailabilityZone(); 
    System.out.println("availabilityZone-----> "+availabilityZone); 
    System.out.println("instanceid-----> "+instanceid); 
    List<Reservation> reservations = result.getReservations(); 
    System.out.println("reservations-----> "+reservations.toString()); 

    for (Reservation reservation : reservations) 
    { 
     List<Instance> instances = reservation.getInstances(); 
     System.out.println("instances-----> "+instances.size()); 
     for (Instance instance : instances) 
     { 

      System.out.println("Instances----> "+instance.getInstanceId()); 
     } 
    } 

但我无法获取instances.I还试图使用EC2MetadataUtils.java在我的Eclipse IDE中配置SDK来获取详细信息。

EC2MetadataUtils ec2Meta = new EC2MetadataUtils(); 
    String amiId = ec2Meta.getAmiId(); 
    System.out.println("Ec2 Metadata ----amiId---> "+amiId); 

    String availabilityZone = ec2Meta.getAvailabilityZone(); 
    System.out.println("Ec2 Metadata ----AvailabilityZone---> "+availabilityZone); 

    /*String eC2InstanceRegion = ec2Meta.getEC2InstanceRegion(); 
    System.out.println("Ec2 Metadata ----eC2InstanceRegion---> "+eC2InstanceRegion);*/ 

    String instanceId = ec2Meta.getInstanceId(); 
    System.out.println("Ec2 Metadata ----instanceId---> "+instanceId); 

    InstanceInfo instanceInfo = ec2Meta.getInstanceInfo(); 
    System.out.println("Ec2 Metadata "+instanceInfo.getAccountId()); 
    System.out.println("Ec2 Metadata "+instanceInfo.getInstanceId()); 
    System.out.println("Ec2 Metadata "+instanceInfo.getPrivateIp()); 
    System.out.println("Ec2 Metadata "+instanceInfo.getRegion()); 
    System.out.println("Ec2 Metadata "+instanceInfo.getArchitecture()); 
    System.out.println("Ec2 Metadata "+instanceInfo.getInstanceType()); 
    System.out.println("Ec2 Metadata "+instanceInfo.getVersion()); 
    System.out.println("Ec2 Metadata "+instanceInfo.getImageId());  
    String publicKey = EC2MetadataUtils.getPublicKey(); 
    System.out.println("Ec2 Metadata "+publicKey);  
    IAMInfo AMInstanceProfileInfo = EC2MetadataUtils.getIAMInstanceProfileInfo(); 
    System.out.println("Ec2 Metadata "+AMInstanceProfileInfo.lastUpdated); 

    String MacAddress = EC2MetadataUtils.getMacAddress(); 
    System.out.println("Ec2 Metadata "+MacAddress); 

但是,我得到null只为最初的字段,最后我得到下面的错误。

Ec2 Metadata null 
Ec2 Metadata null 
Ec2 Metadata null 

Exception in thread "main" com.amazonaws.SdkClientException: Unable to contact EC2 metadata service. 
+0

完整性检查:您是否正在从EC2实例运行此代码? EC2元数据服务仅在您的实例中可用,并且该服务将获取描述正在运行的实例的元数据:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html –

+0

否,我正在EC2实例之外运行代码。 KIndly让我知道如何在实例外访问EC2的元数据。谢谢。 – Amar

+1

专注于您的第一个代码片段...返回[DescribeInstancesResult]的请求(http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/ec2/model/DescribeInstancesResult.html) 。您可以像预先尝试的那样从预订和实例集合中获取所需的所有内容。从调试开始。 AWS SDK的响应是否成功?是否有任何保留或实例返回响应?如果不是,为什么? (也许是因为您没有为您的AmazonEC2Client指定一个区域?SDK请求将仅返回您请求的区域中的实例。) –

回答

0

安东尼在他的评论中正确地提到,EC2元数据服务仅在正在运行的EC2实例中可用。我有类似的情况,我需要与AWS账户关联的所有EC2实例的区域信息。这就是我如何读取一个实例的区域信息:

List<Instance> ec2Instances = describeInstancesResult.getReservations().stream().map(d -> d.getInstances()).flatMap(l -> l.stream()).collect(Collectors.toList()); 
//describeInstancesResult is the response of describeInstance operation on the aws client generated for a given aws account. 

ec2Instances.stream().forEach((instance) -> { 
    String region = instance.getPlacement().getAvailabilityZone(); 
    //do operations on the region value. 
} 
相关问题