2012-12-17 44 views
4

我試圖通過標籤,通過PHP檢索EC2實例。我可以使用標籤創建服務器,我可以使用標籤數據檢索服務器,但如果我想要執行的操作是通過其中一個標籤進行檢索,則無法找到示例。PHP和AWS - 通過標籤檢索EC2實例

這工作:

if ($server_group != '') 
     $filter[] = array('Name' => 'tag-value','Value' => $server_group); 

$response = $ec2->describe_instances(array('Filter' => $filter)); 

然而,問題是,它會發現,我分配給變量$ server_group,不管它是正確的標籤或沒有價值的任何標記。當然,我可以簡單地小心如何分配標籤值,但這不是防彈的。

替代語法在文檔解釋說:

舉例:這裏僅列出了已分配標記目的= X,指定資源:

Filter.1.Name=tag:Purpose 
Filter.1.Value.1=X 

然而,他們給沒有例子。我認爲它會是:

$filter[] = array('Filter.1.Name','Value' => 'tag:Group'); 
$filter[] = array('Name' => 'Filter.1.Value.1','Value' => $server_group); 

但是,這似乎不工作 - 我什麼都沒有回來。

有沒有人這樣做?有一個他們可以分享的工作示例嗎?我可能沒有在Google上提出正確的問題 - 很多關於如何創建標籤的例子,但不知道如何檢索它們。

+0

獲取整個列表,並在本地將其過濾 – Guy

回答

4

我們最近需要編寫一個腳本來輕鬆關閉我們的QA環境中的所有EC2實例。我們使用環境標籤來表示DEV,PRD或QA環境。下面是一個代碼片段,以證明我們如何通過API過濾:

<?php 
$aws = \Aws\Common\Aws::factory(array(
      'key' => $key, 
      'secret' => $secret, 
      'region' => $region 
     )); 

$ec2 = $aws->get('ec2'); 
$args = array(
     'Filters' => array(
       array('Name' => 'tag:Environment', 
         'Values' => array('QA') 
       ) 
     ) 
    ); 
$results = $ec2->describeInstances($args); 
$reservations = $results['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']; 
      } 
     } 

     if ($instance['State']['Name'] == \Aws\Ec2\Enum\InstanceStateName::RUNNING){ 
      $shutdownInstances['InstanceIds'][] = $instance['InstanceId']; 
     } 
    } 

} 
$results = $ec2->stopInstances($shutdownInstances); 

$hipURL = "http://api.hipchat.com/v1/rooms/message?auth_token=$token&room_id=$roomId&from=$from&message=QA%20has%20been%20told%20to%20shutdown."; 
$result = file_get_contents($hipURL); 

我們使用這個在cron作業,以保證QA每個夜晚變得關機,因爲沒有人是通宵使用它,它爲我們節省了幾元錢沒有它運行。

重寫你發現所有用途的標籤與X的值的篩選:

'Filters' => array(
    array('Name' => 'tag:Purpose', 
     'Values' => array('X') 
) 
)