2016-11-28 3 views
0

Я пытаюсь получить идентификаторы экземпляров всех экземпляров EC2 в AWS с использованием AWS SDK.Не удается связаться с службой метаданных 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 для извлечения деталей путем настройки SDK в моей Eclipse IDE.

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) , Вы можете получить все, что вам нужно, из коллекций «Бронирование» и «Экземпляр», как вы уже делали. Начните с отладки. Успешен ли ответ от SDS SDK? Являются ли какие-либо оговорки или случаи возвратами с ответом? Если нет, то почему? (Возможно, потому, что вы не указали регион для своего AmazonEC2Client? Запрос SDK будет возвращать только экземпляры в запрошенном регионе.) –

ответ

0

Энтони правильно упомянул в своих комментариях, что служба метаданных EC2 доступна только из вашего экземпляра EC2. У меня была аналогичная ситуация, когда мне нужна информация о регионе для всех экземпляров EC2, связанных с учетной записью AWS. Вот как я читаю информацию о регионе для примера:

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. 
} 
Смежные вопросы