【发布时间】:2013-02-20 10:49:24
【问题描述】:
如何使用AWS SDK for PHP 2 获取与某些过滤器匹配的 Amazon EC2 实例列表?
【问题讨论】:
标签: php amazon-ec2
如何使用AWS SDK for PHP 2 获取与某些过滤器匹配的 Amazon EC2 实例列表?
【问题讨论】:
标签: php amazon-ec2
为此使用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')),
)
));
您可以在 Amazon DescribeInstances API 方法页面上获取可用过滤器列表。
但是等等,这里有什么困难?
Filters。在 API 中,它被称为 Filter
Values与API调用不同,是一个数组是的,这一切都在文档中进行了描述。但是,如果您查看一些 Old API usage samples,您会发现语法发生了变化,这可能很难注意到该示例中必须更新哪些内容才能使事情正常运行。
为了完成这个例子,让我展示一些简单的结果输出。
$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 模型对象,并且需要在 foreach 工作之前将它们转换为数组。更多信息在这里:
http://guzzlephp.org/api/class-Guzzle.Service.Resource.Model.html
【讨论】:
$reservations = $result['Reservations']; 这样的数组或使用 get() 方法 $reservations = $result->get('Reservations'); 访问。在这两种情况下,您都会得到一个数组作为结果。 API 中描述了结果的结构。热烈的问候,维克多
这对维克多很有帮助, 嘿 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>';
}
}
【讨论】:
为了获取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,
)
【讨论】: