【问题标题】:How to get list of EC2 instances with Amazon PHP SDK 2?如何使用 Amazon PHP SDK 2 获取 EC2 实例列表?
【发布时间】:2013-02-20 10:49:24
【问题描述】:

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

【问题讨论】:

    标签: php amazon-ec2


    【解决方案1】:

    为此使用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;
        }
    
    }
    

    【讨论】:

    • 我已尝试上述方法并得到“PHP 致命错误:第 9 行的 /var/www/functions/ec2_instances.php 中未找到类 'Aws\\Ec2\\Ec2Client'”..第 9 行是 $ec2Client = \Aws\Ec2\Ec2Client::factory($config);少量。我已经完成了:包括“aws/sdk.class.php”;在第一行,sdk 位于子文件夹“aws”中。我也尝试使用 \aws\ 作为前缀,但没有奏效。理想情况下,sdk 文件夹将位于项目之外,但我将其移至那里,认为这是一个路径问题。关于改变什么的任何想法?完整要点:gist.github.com/nodeGarden/db707771faf12f7db47a
    • @mondo 你好。我认为您正在使用AWS SDK version 1 我的问题和代码示例适用于AWS SDK version 2 我建议install AWS using composer。热烈的问候,维克多。
    • 确实是 v1。我安装了 Composer,现在可以使用了。它已经打印了 5 分钟,最终导致 Chrome 崩溃。反响真的那么大吗?还是我可能陷入了无限循环? ... edit 看起来 print_r 是罪魁祸首。把它拿出来就可以了。只打印一个,但我相信我可以解决这个问题。
    • 当我尝试上面的代码时得到这个 致命错误:未捕获的异常 'GuzzleHttp\Ring\Exception\RingException' 并带有消息 'cURL 错误 60:SSL 证书问题:无法获取本地颁发者证书' D:\proiecte\PHP\www\wpec2\vendor\aws\aws-sdk-php\src\Common\AwsClient.php 第 275 行 GuzzleHttp\Exception\RequestException:cURL 错误 60:SSL 证书问题:无法获取本地颁发者第 51 行 D:\proiecte\PHP\www\wpec2\vendor\guzzlehttp\guzzle\src\Exception\RequestException.php 中的证书
    • 我注意到的一件事是,在最新的更新(来自亚马逊方面)中,不是来自 API,现在您可以仅将这个 PHP api 方法应用于您连接的区域。
    【解决方案2】:

    Victor 的回答很棒,但它对我不起作用,因为我漏掉了一行:

    $reservations=$result->toArray();
    

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

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

    【讨论】:

    • 感谢您的评论。我已经更新了我的答案。 Guzzle 模型可以像 $reservations = $result['Reservations']; 这样的数组或使用 get() 方法 $reservations = $result->get('Reservations'); 访问。在这两种情况下,您都会得到一个数组作为结果。 API 中描述了结果的结构。热烈的问候,维克多
    【解决方案3】:

    这对维克多很有帮助, 嘿 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>';
    }
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2021-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-09
        • 2016-12-23
        • 1970-01-01
        • 2011-08-22
        相关资源
        最近更新 更多