2016-07-12 18 views
1

我试图实现的主要目标是遍历我在PHP中运行的EC2实例。AWS PHP SDK中的输出不同于AWSCLI

这真的很容易得到使用bash脚本的数据,如下图所示:

bash脚本:

#!/bin/bash 
export AWS_ACCESS_KEY_ID="AKIDEXAMPLE" 
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" 
aws ec2 describe-instances --region="eu-west-1" --filter "Name=instance-state-name,Values=running" 

击输出:

{ 
    "Reservations": [ 
     { 
      "OwnerId": "58728357357", 
      "ReservationId": "r-0e0283649826935", 
      "Instances": [ 
       { 
        "SecurityGroups": [ 
         { 
          "GroupId": "sg-2fe333148", 
          "GroupName": "WEB" 
         } 
        ], 
        "PublicDnsName": "ec2-53-13-121-72.eu-west-1.compute.amazonaws.com", 
        "Architecture": "x86_64", 
        "LaunchTime": "2016-07-11T08:28:23.000Z", 
        "RootDeviceName": "/dev/sda1", 
        "BlockDeviceMappings": [ 
         { 
          "Ebs": { 

      // ... 

     } 
    ] 
} 

然而,当我尝试下面的例子,使用相同的键,我会看到似乎是不可用的对象 - 或者至少该对象看起来像表示一个空的数据结构。

PHP文件:

<?php 
require __DIR__ . "/vendor/autoload.php"; 

$settings = [ 
    "version" => "latest", 
    "region" => "eu-west-1", 
    "credentials" => [ 
     "key" => "AKIDEXAMPLE", 
     "secret" => "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", 
    ], 
]; 

$client = new \Aws\Ec2\Ec2Client($settings); 
$result = $client->describeInstances([ 
    "Filters" => [ 
     [ 
      "Name" => "instance-state-name", 
      "Value" => "running", 
     ] 
    ], 
]); 

var_dump($result); 

PHP输出:

我究竟在我的意思是这个AWS \结果呢?

class Aws\Result#82 (1) { 
    private $data => 
    array(2) { 
    'Reservations' => 
    array(0) { 
    } 
    '@metadata' => 
    array(4) { 
     'statusCode' => 
     int(200) 
     'effectiveUri' => 
     string(35) "https://ec2.eu-west-1.amazonaws.com" 
     'headers' => 
     array(5) { 
     ... 
     } 
     'transferStats' => 
     array(1) { 
     ... 
     } 
    } 
    } 
} 

我错过了PHP配置中的某些东西吗?请有人能帮助我指出正确的方向吗?

P.S.我在上面的例子中掩盖了API密钥。

+2

首先从问题中删除密钥ID和访问关键,如果他们是在用前一个挑选他们。 – error2007s

+0

你还希望PHP代码应该给你什么输出? – error2007s

+0

@ error2007s我希望至少能看到关于我的实例的_some_数据,就像我对bash示例所做的那样。迭代'$ results'不会给我任何东西 - 第一个元素是一个空数组。示例显示'$ results [“Reservations”]'来保存实例数据,但是我的是空的。 – Greg

回答

0

EC2 :: DescribeInstances需要一个过滤器数组,每个过滤器都有一个字符串Name和一个字符串数组Values。在你的CLI例子中,你提供了Values的东西,而在你的PHP例子中,你提供了一个Value。该字段不被SDK识别,并且将被忽略。有关更多信息,请参阅the SDK API docs

你的PHP应更新为:

<?php 
require __DIR__ . "/vendor/autoload.php"; 

$settings = [ 
    "version" => "latest", 
    "region" => "eu-west-1", 
    "credentials" => [ 
     "key" => "AKIDEXAMPLE", 
     "secret" => "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", 
    ], 
]; 

$client = new \Aws\Ec2\Ec2Client($settings); 
$result = $client->describeInstances([ 
    "Filters" => [ 
     [ 
      "Name" => "instance-state-name", 
      "Values" => ["running"], 
     ] 
    ], 
]); 

var_dump($result); 
+0

'$ result'的值是什么?如果你迭代会发生什么? – Greg

+0

另外,你的建议是不正确的。对于'values'数组是必需的,对于'value'则需要一个字符串。这在您发布的链接中进行了解释。 – Greg