4

我正在尝试通过 PHP 按标签检索 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 中问过正确的问题 - 有很多关于如何创建标签的示例,但不是如何通过它们检索的示例。

4

1 回答 1

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')
  )
)
于 2013-06-20T20:11:23.530 回答