如何使用Amazon PHP SDK 2获取EC2实例列表


How to get list of EC2 instances with Amazon PHP SDK 2?

如何使用AWS SDK for PHP 2获得匹配一些过滤器的Amazon EC2实例列表?

使用descripbeinstances方法。让我们用更多的细节来讨论这个。

您需要首先获得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')),
        )
));

你可以在Amazon descripbeinstances API方法页面上获得可用过滤器的列表。

等等,这里有什么困难呢?

  • 参数名称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;
    }
}

Victor的回答很好,但是对我来说行不通,因为我少了一行:

$reservations=$result->toArray();

Amazon PHP SDK 2为许多事情返回Guzzle Model对象(包括这个),并且在foreach工作之前需要将它们转换为数组。更多信息在这里:

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

这对Victor很有帮助,[$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>';
}
}

为了获得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,
)