Я пытаюсь написать код PHP для отправки сообщения на AWS API-шлюз, используя AWS SDK. Это код, который я написал (с поддельными учетными данными вместо настоящих, конечно, исключительно для этого вопроса):
require_once('/aws/aws-autoloader.php');
$credentials = new Aws\Credentials\Credentials('AWSACCESSKEY', 'AWSSECRETKEYGOESHERE');
$client = new \Aws\ApiGatewayManagementApi\ApiGatewayManagementApiClient([
'endpoint' => 'https://q1w2e3r4t5y.execute-api.us-east-1.amazonaws.com/testing',
'version' => 'latest',
'region' => 'us-east-1',
'credentials' => $credentials
]);
$val = $client->postToConnection(array('ConnectionId' => 'NC0nN3cT10N1d=', 'Data' => 'Hello World'));
var_dump($val);
Но когда я выполняю этот код, я получаю эту ошибку в своих журналах:
2020/05/25 16:14:14 [error] 19787#19787: *20652052 FastCGI sent in stderr: "PHP message: PHP Fatal
error: Uncaught exception 'Aws\ApiGatewayManagementApi\Exception\ApiGatewayManagementApiException'
with message 'Error executing "PostToConnection" on
"https://q1w2e3r4t5y.execute-api.us-east-1.amazonaws.com/@connections/NC0nN3cT10N1d%3D";
AWS HTTP error: Client error: `POST
https://q1w2e3r4t5y.execute-api.us-east-1.amazonaws.com/@connections/NC0nN3cT10N1d%3D`
resulted in a `403 Forbidden` response:
{"message":"Forbidden"}
ForbiddenException (client): Forbidden - {"message":"Forbidden"}'
GuzzleHttp\Exception\ClientException: Client error: `POST
https://q1w2e3r4t5y.execute-api.us-east-1.amazonaws.com/@connections/NC0nN3cT10N1d%3D`
resulted in a `403 Forbidden` response:
{"message":"Forbidden"}
in /var/www/html/project/aws/GuzzleHttp/Exception/RequestException.php:113
Stack trace:
#0 /var/www/html/project/aws/GuzzleHttp/Middleware.php(65):
GuzzleHttp\Exception\RequestException::create(Object(GuzzleHttp\Psr7\Request),
Object(GuzzleHttp\Psr7\Response))
#1 /var/w" while reading response header from upstream, client: 172.31.39.215, server: example.com,
request: "GET /tmp/debug.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:",
host: "example.com"
Вот те же настройки, которые успешно использовались в Postman:
Когда я отправляю это в Postman, я получаю 200 OK и вижу все Я вставил тело в свой слушатель веб-сокета (я использую это Chrome расширение для создания и прослушивания соединения: простой клиент WebSocket ).
Итак, я знаю IAM учетные данные пользователя верны, но по какой-то причине похоже, что AWS PHP SDK не подписывает запрос правильно. Если я удалю вызов postToConnection
, я НЕ получаю сообщение об ошибке, поэтому я знаю, что он не дает сбой при создании самого клиента.
Что мне не хватает? Почему это работает в Postman, а не в AWS PHP SDK?