2016-11-28 81 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. 
} 
相關問題