【问题标题】:Cannot get aws lambda function response in PHP client无法在 PHP 客户端中获得 aws lambda 函数响应
【发布时间】:2016-07-26 21:40:25
【问题描述】:

我正在尝试按照文档中的说明使用 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);

?>

Node.js Lambda 函数 这只有这个简单的代码,它在成功执行 Lambda 函数时返回“成功”。它在 Amazon Lambda 控制台中的工作发现。

exports.handler = function(event, context){

    context.succeed("success");
};

来自亚马逊的回应 我得到了一个无法访问的私有数据对象。根据文档,有效负载应该是函数的响应。但是,我得到了一个对象,我又无法访问它,因为父对象数据是私有的。

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
                                        (
                                        )

                                )

                        )

                )

        )

)

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

更新

我可以使用print_r($response['Payload']); 访问有效负载 但是,它仍然没用,因为 Payload 没有按预期来。

【问题讨论】:

    标签: php node.js amazon-web-services aws-lambda


    【解决方案1】:

    哦!好吧,我找到了答案。 您需要调用GuzzleHttp\Psr7\Stream 内部的GuzzleHttp\Psr7\Stream 对象的__toString() 方法@。

    所以,执行print_r($response['Payload']-&gt;__toString()); 会打印“成功”,这是 Lambda 函数的预期响应,也是我正在寻找的响应。

    希望这对将来的人有所帮助。

    【讨论】:

    • 是的,让我头疼不已。谢谢老兄。
    • 谢谢。花了一个多小时才找到这个。
    【解决方案2】:

    另一种方法是调用流对象的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>";
    

    【讨论】:

      【解决方案3】:
      require_once 'aws/aws-autoloader.php';
      use Aws\Lambda\LambdaClient;
      $client = LambdaClient::factory([
          'version' => 'latest',
          'region'  => 'us-east-1',
          'credentials' => [
              'key'    => 'YOUR_AWS_ACCESS_KEY_ID',
              'secret' => 'YOUR_AWS_SECRET_ACCESS_KEY',
           ]
      ]);
      
      $result = $client->invoke([
          // The name your created Lamda function
          'FunctionName' => 'calculation',
      ]);
      
      var_dump((string)$result->get('Payload'));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-25
        • 1970-01-01
        • 1970-01-01
        • 2018-08-01
        • 2019-07-31
        • 2020-07-29
        • 1970-01-01
        相关资源
        最近更新 更多