2013-03-05 4 views

Odpowiedz

28

Stosować metodę . Omówmy to nieco więcej szczegółów.

Najpierw musisz pobrać instancję Ec2Client. Najprostszy sposób na zainicjowanie klienta:

$config = array(); 
$config['key'] = 'key'; 
$config['secret'] = 'secret'; 
$config['region'] = 'us-east-1'; 
$config['version'] = 'latest'; // Or Specified 
$ec2Client = \Aws\Ec2\Ec2Client::factory($config); 

A następnie po prostu zadzwoń pod numer DescribeInstances.

$result = $ec2Client->DescribeInstances(array(
     'Filters' => array(
       array('Name' => 'instance-type', 'Values' => array('m1.small')), 
     ) 
)); 

Można uzyskać listę dostępnych filtrów na metodzie API stronie Amazon DescribeInstances.

Ale czekaj, co może być trudne?

  • Zanotuj nazwę parametru Filters. W API nazywa Filter
  • Parametr Values nazywa różni się od API i jest tablicą

Tak, to wszystko jest opisane w dokumentacji. Ale jeśli spojrzysz na jakieś Old API usage samples, zobaczysz, że zmieniła się składnia i może to być naprawdę trudne do zauważenia, co trzeba zaktualizować w tych przykładach, aby wszystko działało.

I aby dokończyć przykład, pokażę proste wyniki wyników.

$reservations = $result['Reservations']; 
foreach ($reservations as $reservation) { 
    $instances = $reservation['Instances']; 
    foreach ($instances as $instance) { 

     $instanceName = ''; 
     foreach ($instance['Tags'] as $tag) { 
      if ($tag['Key'] == 'Name') { 
       $instanceName = $tag['Value']; 
      } 
     } 


     echo 'Instance Name: ' . $instanceName . PHP_EOL; 
     echo '---> State: ' . $instance['State']['Name'] . PHP_EOL; 
     echo '---> Instance ID: ' . $instance['InstanceId'] . PHP_EOL; 
     echo '---> Image ID: ' . $instance['ImageId'] . PHP_EOL; 
     echo '---> Private Dns Name: ' . $instance['PrivateDnsName'] . PHP_EOL; 
     echo '---> Instance Type: ' . $instance['InstanceType'] . PHP_EOL; 
     echo '---> Security Group: ' . $instance['SecurityGroups'][0]['GroupName'] . PHP_EOL; 
    } 

} 
+0

Próbowałem wyżej i dostać "PHP Fatal error: Class 'Aws \\ Ec2 \\ Ec2Client' nie znaleziono w /var/www/functions/ec2_instances.php na linii 9" .. Linia 9 będąc $ ec2Client = \ Aws \ Ec2 \ Ec2Client :: factory ($ config); kawałek. Zrobiłem: włącz "aws/sdk.class.php"; w pierwszym wierszu, a sdk znajduje się w podfolderze "aws". Próbowałem przedrostka z \ aws \ też i nie działał. Idealnie folder sdk byłby poza projektem, ale przeniosłem go tam myśląc, że jest to problem związany z pętlami. Wszelkie przemyślenia na temat tego, co zmienić? Pełna treść: https://gist.github.com/nodeGarden/db707771faf12f7db47a – mondo

+1

@mondo Hello. Myślę, że używasz [AWS SDK w wersji 1] (https: // github.com/amazonwebservices/aws-sdk-for-php) Przykład mojego pytania i kodu dotyczy [AWS SDK wersja 2] (https://github.com/aws/aws-sdk-php) Proponuję [zainstalować AWS przy użyciu kompozytu ] (http://docs.aws.amazon.com/aws-sdk-php-2/guide/latest/installation.html). Serdecznie pozdrawiam, Victor. –

+0

To był rzeczywiście v1. Poszedłem z instalacją Composer i działa teraz. Od 5 minut trwa drukowanie i ostatecznie uległa awarii. Czy odpowiedź jest naprawdę tak duża? Czy prawdopodobnie utknąłem w nieskończonej pętli? ... [edit] Wygląda na to, że winowajcą jest print_r. Wyrzuciłem to i działa. Drukuje tylko jeden, ale jestem pewien, że mogę to naprawić. – mondo

2

odpowiedź Victor jest super, ale to nie działa dla mnie, bo brakowało jednej linii:

$reservations=$result->toArray(); 

Amazon PHP SDK 2 zwraca obiekty chlać wzorem dla wielu rzeczy (włącznie z tym) i muszą zostać przekonwertowane na tablice zanim foreach zadziała. Więcej informacji tutaj:

http://guzzlephp.org/api/class-Guzzle.Service.Resource.Model.html

+1

Dziękuję za komentarz. Zaktualizowałem swoją odpowiedź. Guzzle Model może być dostępny jako tablica: '$ reservations = $ result ['Reservations'];' lub 'get()' method '$ reservations = $ result-> get (" Reservations ");'. W obu przypadkach otrzymasz tablicę jako wynik. Struktura wyników jest opisana w interfejsie API. Serdecznie pozdrawiam, Victor –

2

że był wspaniały pomóc Victor, hej voidstin, że nie było konieczne w moim przypadku [$ zastrzeżeń = $ result-> toArray();]

require "aws.phar"; 

use Aws\Ec2\Ec2Client; 
use Aws\Common\Enum\Region; 

$aws = Ec2Client::factory(array(
'key' => 'XXXXXX', //Your key and secret key are found at https://portal.aws.amazon.com/gp/aws/securityCredentials 
'secret' => 'XXXXXX', 
'region' => 'XXXXXX' //This is the server cluster we are connecting to. US_EAST_1 is Northern Virginia. US_WEST_1 is Northern California. US_WEST_2 is Oregon 
)); 

$result = $aws->DescribeInstances(); 

$reservations = $result['Reservations']; 
foreach ($reservations as $reservation) { 
$instances = $reservation['Instances']; 
foreach ($instances as $instance) { 
$instanceName = ''; 
foreach ($instance['Tags'] as $tag) { 
if ($tag['Key'] == 'Name') { 
$instanceName = $tag['Value']; 
} 
} 
echo 'Instance Name: ' . $instanceName . PHP_EOL; 
echo '<br>'; 
echo '---> State: ' . $instance['State']['Name'] . PHP_EOL; 
echo '<br>'; 
echo '---> Instance ID: ' . $instance['InstanceId'] . PHP_EOL; 
echo '<br>'; 
echo '---> Image ID: ' . $instance['ImageId'] . PHP_EOL; 
echo '<br>'; 
echo '---> Private Dns Name: ' . $instance['PrivateDnsName'] . PHP_EOL; 
echo '<br>'; 
echo '---> Instance Type: ' . $instance['InstanceType'] . PHP_EOL; 
echo '<br>'; 
echo '---> Security Group: ' . $instance['SecurityGroups'][0]['GroupName'] . PHP_EOL; 
echo '<br>'; 
echo '-----------------------------------------------------------------------------------------------------'; 
echo '<br>'; 
echo '<br>'; 
} 
} 
1

z celem, aby uzyskać listę PublicDnsName można użyć tego kodu:

use Aws\Ec2\Ec2Client; 

$ec2 = Ec2Client::factory($config); 
$args = [ 
    'Filters' => [ 
     ['Name' => 'tag:Name', 'Values' => ['*{{your-tag}}*']], 
    ] 
]; 
$data = $ec2->DescribeInstances($args)->toArray(); 
$instances = []; 
array_walk_recursive($data, function ($value, $key) use (&$instances) { 
    if ($key === 'PublicDnsName') { 
     $instances[$value] = true; 
    } 
}); 
var_export($instances); 

otrzymasz coś takiego:

array (
    'ec2-*-*-*-*.eu-west-1.compute.amazonaws.com' => true, 
    'ec2-*-*-*-*.eu-west-1.compute.amazonaws.com' => true, 
    'ec2-*-*-*-*.eu-west-1.compute.amazonaws.com' => true, 
    'ec2-*-*-*-*.eu-west-1.compute.amazonaws.com' => true, 
    'ec2-*-*-*-*.eu-west-1.compute.amazonaws.com' => true, 
    'ec2-*-*-*-*.eu-west-1.compute.amazonaws.com' => true, 
)