Jak uzyskać listę instancji Amazon EC2 pasujących do niektórych filtrów przy użyciu AWS SDK for PHP 2?Jak zdobyć listę instancji EC2 przy pomocy Amazon PHP SDK 2?
Odpowiedz
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 nazywaFilter
- 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;
}
}
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
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 –
ż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>';
}
}
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,
)
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
@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. –
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