在PHP客户端无法获取aws lambda函数响应

Par*_*eog 6 php amazon-web-services node.js aws-lambda

我试图在文档中使用PHP作为指示调用一个简单的Aws Lambda函数,但我没有得到所需的响应.

PHP Lambda客户端

require './aws/aws-autoloader.php';
use Aws\Lambda\LambdaClient;

$client = LambdaClient::factory(array(
            'version' => "latest",
            'credentials' => array(
                'key' => '*******',
                'secret' => '*******'
            ),
            'region' => '*******'
        ));

$response = $client->invoke([
    'FunctionName' => 'myLambda', // REQUIRED
    'InvocationType' => 'RequestResponse',
    'Payload' => '{"key":"value"}',
        ]);

echo "<pre>";
print_r($response);
print_r($response->data);

?>
Run Code Online (Sandbox Code Playgroud)

Node.js Lambda函数 除了这个简单的代码,它在成功执行Lambda函数时返回"成功".它的工作在亚马逊Lambda控制台找到.

exports.handler = function(event, context){

    context.succeed("success");
};
Run Code Online (Sandbox Code Playgroud)

亚马逊的回复 我收到了一个我无法访问的私有数据对象.根据文档,Payload应该是函数的响应.但是,我得到一个Object,我无法访问,因为父对象数据是私有的.

Aws\Result Object
(
    [data:Aws\Result:private] => Array
        (
            [Payload] => GuzzleHttp\Psr7\Stream Object
                (
                    [stream:GuzzleHttp\Psr7\Stream:private] => Resource id #6
                    [size:GuzzleHttp\Psr7\Stream:private] => 
                    [seekable:GuzzleHttp\Psr7\Stream:private] => 1
                    [readable:GuzzleHttp\Psr7\Stream:private] => 1
                    [writable:GuzzleHttp\Psr7\Stream:private] => 1
                    [uri:GuzzleHttp\Psr7\Stream:private] => php://temp
                    [customMetadata:GuzzleHttp\Psr7\Stream:private] => Array
                        (
                        )

                )

            [StatusCode] => 200
            [FunctionError] => 
            [LogResult] => 
            [@metadata] => Array
                (
                    [statusCode] => 200
                    [effectiveUri] => https://lambda.*********.amazonaws.com/2015-03-31/functions/myLambda/invocations
                    [headers] => Array
                        (
                            [content-type] => application/json
                            [date] => Wed, 06 Apr 2016 12:33:05 GMT
                            [x-amzn-remapped-content-length] => 0
                            [x-amzn-requestid] => ******-*****-*****-****-*******************
                            [content-length] => 9
                            [connection] => keep-alive
                        )

                    [transferStats] => Array
                        (
                            [http] => Array
                                (
                                    [0] => Array
                                        (
                                        )

                                )

                        )

                )

        )

)
Run Code Online (Sandbox Code Playgroud)

那么,我如何从Lambda函数访问响应?这可能是什么问题?

UPDATE

我能够通过使用print_r($response['Payload']); But,仍然无用而访问Payload ,因为Payload未按预期进行.

Par*_*eog 11

哦! 好吧,我找到了答案.你需要调用其中__toString()GuzzleHttp\Psr7\StreamObject 方法Payload.

因此,print_r($response['Payload']->__toString());打印"成功",这是Lambda函数的期望响应,以及我正在寻找的那个.

希望这可以帮助将来的某个人.


小智 8

另一种方法是调用getContents()流对象,如下所示:

$result = $client->invoke(array(
          // FunctionName is required
          'FunctionName' => 'myService-beta-hello',
          'InvocationType' => 'RequestResponse',
            'LogType' => 'Tail',
            'Payload' => '{"key1":"value1", "key2":"value2","key3":"value3"}',
            //'Qualifier' => 'string',
                ));
print "<pre>";
print_r($result);
print_r($result['Payload']->getContents());
print "</pre>";
Run Code Online (Sandbox Code Playgroud)