2013-03-05 27 views

Trả lời

28

Sử dụng phương pháp DescribeInstances cho việc này. Chúng ta hãy xem xét điều này với một số chi tiết.

Bạn cần nhận dụ Ec2Client trước. Cách đơn giản nhất để khởi tạo cho khách hàng:

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

Và sau đó chỉ cần gọi DescribeInstances phương pháp.

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

Bạn có thể nhận danh sách các bộ lọc có sẵn trên trang phương thức API của Amazon DescribeInstances.

Nhưng chờ đợi, điều gì có thể khó khăn ở đây?

  • Lưu ý tên thông số Filters. Trong API nó được gọi là Filter
  • Parameter Values được gọi là khác nhau từ API và nó là một mảng

Vâng, đây là tất cả được mô tả trong tài liệu. Nhưng nếu bạn nhìn vào một số Old API usage samples bạn có thể thấy rằng cú pháp đã thay đổi và điều này có thể thực sự khó để nhận thấy những gì phải được cập nhật trong các ví dụ đó để làm cho mọi thứ hoạt động.

Và để hoàn thành ví dụ, hãy để tôi hiển thị một số kết quả đầu ra đơn giản.

$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

Tôi đã thử ở trên và nhận "Lỗi nghiêm trọng về PHP: Lớp 'Aws \\ Ec2 \\ Ec2Client' không tìm thấy trong /var/www/functions/ec2_instances.php trên dòng 9" .. Dòng 9 là nhà máy $ ec2Client = \ Aws \ Ec2 \ Ec2Client :: ($ config); bit. Tôi đã thực hiện: bao gồm "aws/sdk.class.php"; trên dòng đầu tiên, và sdk nằm trong thư mục con "aws". Tôi đã thử tiền tố với \ aws \ quá và không hoạt động. Lý tưởng nhất là thư mục sdk sẽ nằm ngoài dự án, nhưng tôi đã chuyển nó ở đó nghĩ rằng đó là một vấn đề đường dẫn. Bất kỳ suy nghĩ về những gì để thay đổi? Gist đầy đủ: https://gist.github.com/nodeGarden/db707771faf12f7db47a – mondo

+1

@mondo Xin chào. Tôi nghĩ bạn đang sử dụng [AWS SDK phiên bản 1] (https: // github.com/amazonwebservices/aws-sdk-for-php) Ví dụ về câu hỏi và mã của tôi là dành cho [AWS SDK phiên bản 2] (https://github.com/aws/aws-sdk-php) Tôi đề nghị [cài đặt AWS bằng cách sử dụng nhà soạn nhạc ] (http://docs.aws.amazon.com/aws-sdk-php-2/guide/latest/installation.html). Trân trọng, Victor. –

+0

Nó thực sự là v1. Tôi đã đi với Composer cài đặt, và hoạt động ngay bây giờ. Nó đã được in ra cho một tốt 5 phút bây giờ, và cuối cùng đã bị rơi Chrome. Câu trả lời có thực sự lớn đến thế không? Hay tôi có thể bị mắc kẹt trong một số vòng lặp vô hạn? ... [sửa] Có vẻ như print_r là thủ phạm. Took ra và nó hoạt động. Chỉ in một bản, nhưng tôi chắc rằng tôi có thể sửa nó. – mondo

2

câu trả lời của Victor là rất tốt, nhưng nó đã không làm việc cho tôi vì tôi đã mất tích một dòng:

$reservations=$result->toArray(); 

Amazon PHP SDK 2 trả về đối tượng tật ham ăn mẫu cho nhiều thứ (bao gồm này) và chúng cần được chuyển đổi thành mảng trước khi foreach sẽ hoạt động. Xem thêm thông tin ở đây:

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

+1

Cảm ơn bạn đã bình luận. Tôi đã cập nhật câu trả lời của mình. Mô hình Guzzle có thể được truy cập dưới dạng mảng như thế này '$ reservation = $ result ['Reservations'];' hoặc với 'get()' method '$ reservations = $ result-> get ('Reservation');'. Trong cả hai trường hợp, bạn sẽ nhận được một mảng là kết quả. Cấu trúc của kết quả được mô tả trong API. Trân trọng, Victor –

2

đó là sự giúp đỡ tuyệt vời Victor, hey voidstin, mà không được yêu cầu trong trường hợp của tôi [$ đặt = $ 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

với mục đích để có được danh sách các PublicDnsName bạn có thể sử dụng mã này:

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

bạn sẽ nhận được một cái gì đó như thế này:

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, 
) 
Các vấn đề liên quan