Как получить список экземпляров EC2 с помощью Amazon PHP SDK 2?

Как получить список экземпляров Amazon EC2, соответствующих некоторым фильтрам, используя AWS SDK для PHP 2 ?

Для этого используйте метод DescribeInstances . Давайте рассмотрим это более подробно.

Сначала вам нужно получить экземпляр Ec2Client. Самый простой способ инициализации клиента:

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

А затем просто вызовите метод DescribeInstances .

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

Вы можете получить список доступных фильтров на странице API API Amazon DescribeInstances .

Но подождите, что здесь может быть сложно?

  • Обратите внимание на имя параметра Filters . В API он называется Filter
  • Values параметров называются отличными от API, и это массив

Да, это все описано в документации. Но если вы посмотрите на некоторые образцы использования старого API, вы увидите, что синтаксис изменился, и это может быть очень трудно заметить, что должно быть обновлено в этих примерах, чтобы заставить все работать.

И чтобы завершить этот пример, позвольте мне показать простой результат результатов.

 $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; } } 

это была чудесная помощь Виктора, эй, voidstin, который не требовался в моем случае [$ reservations = $ 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>'; } } 

Ответ Виктора велик, но он не работал для меня, потому что мне не хватало одной строки:

 $reservations=$result->toArray(); 

Amazon PHP SDK 2 возвращает объекты модели Guzzle для многих вещей (включая это), и их необходимо преобразовать в массивы до того, как foreach будет работать. Подробнее здесь:

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

С целью получения списка PublicDnsName вы можете использовать этот код:

 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); 

Вы получите что-то вроде этого:

 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, )