node.js — Не удается получить ответ лямбда-функции aws в клиенте PHP

Я пытаюсь вызвать простую лямбда-функцию Aws, используя PHP, как указано в документации, но я не получаю желаемого ответа.

PHP Лямбда-клиент

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 лямбда-функция
Здесь нет ничего, кроме этого простого кода, который возвращает «success» при успешном выполнении функции Lambda. Его рабочая находка в консоли Amazon Lambda.

exports.handler = function(event, context){

context.succeed("success");
};

Ответ от Amazon
Я получаю приватный объект данных, к которому у меня нет доступа. И согласно документации, полезная нагрузка должна быть ответом от функции. Но я получаю объект, к которому я снова не могу получить доступ, потому что данные родительского объекта являются частными.

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

)

)

)

)

)

Итак, как мне получить доступ к ответу из лямбда-функции? В чем может быть проблема здесь?

ОБНОВИТЬ

Я могу получить доступ к полезной нагрузке с помощью print_r($response['Payload']);
Но все же его бесполезно, потому что полезная нагрузка идет не так, как ожидается.

6

Решение

Ой! хорошо, я нашел ответ.
Вам нужно позвонить __toString() метод GuzzleHttp\Psr7\Stream Объект, который находится внутри Payload,

Итак, делая print_r($response['Payload']->__toString()); выводит «Success», который является желаемым ответом лямбда-функции и тем, который я искал.

Надеюсь, это поможет кому-то в будущем.

11

Другие решения

Другой способ — позвонить, 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>";
6