You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中使用AWS SDK调用API Gateway遇403/410错误求助

问题分析与解决步骤

一、初始403 Forbidden错误原因与修复

  • 路径大小写不匹配:AWS API Gateway路径大小写敏感,Postman使用的路径段为大写,而环境变量中对应部分为小写,导致签名计算的路径与实际API路径不一致,签名验证失败返回403。该问题已通过调整路径大小写解决,错误转为410。
  • 若后续再遇403,可排查以下点:
    • 凭证一致性:检查APIGATEWAY_ACCESS_KEY和APIGATEWAY_SECRET_KEY与Postman使用的是否完全一致,无多余空格;若Laravel缓存了配置,执行php artisan config:clear刷新。
    • 请求头缺失:Postman可能自动添加了Content-Type等必要头,而代码未设置会导致签名计算的请求内容与实际发送不一致。

二、410 Gone错误原因与解决方法

410表示目标WebSocket连接资源已不存在,常见原因及处理:

  • 连接ID无效/过期:WebSocket连接在客户端断开、超时(API Gateway默认2小时)或主动关闭后,连接ID会失效。需确认Laravel中使用的connectionId是当前活跃连接的ID,而非旧测试ID。
  • 环境配置问题:检查API Gateway的Test阶段(URL中的/Test/)是否正确配置了WebSocket路由,且@connections端点的IAM权限设置正确。

代码优化建议

补充必要请求头,增加错误捕获排查:

use Aws\Credentials\Credentials;
use Aws\Signature\SignatureV4;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request as GuzzelReques;

$url = env('APIGATEWAY_URL') . "/@connections/" . $request->connectionId;
$region = env('AWS_DEFAULT_REGION');
$json = json_encode(["message" => "devolviendo prueba"]);

$credentials = new Credentials(env('APIGATEWAY_ACCESS_KEY'), env('APIGATEWAY_SECRET_KEY'));

// 明确添加Content-Type头,保证签名计算与请求内容一致
$headers = [
    'Content-Type' => 'application/json',
];

$client = new Client();
$request = new GuzzelReques('POST', $url, $headers, $json);
$s4 = new SignatureV4("execute-api", $region);
$signedrequest = $s4->signRequest($request, $credentials);

try {
    $responseApi = $client->send($signedrequest);
} catch (\GuzzleHttp\Exception\ClientException $e) {
    // 打印响应体内容,便于排查具体错误
    error_log($e->getResponse()->getBody()->getContents());
    throw $e;
}

额外排查步骤

  1. 验证连接ID状态:在API Gateway控制台的WebSocket连接管理中,查看该connectionId是否存在且处于活跃状态。
  2. 检查IAM权限:确保Access Key对应的IAM用户/角色拥有execute-api:Invoke权限,示例策略:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:你的AWS账号ID:api-id/Test/POST/@connections/*"
        }
    ]
}
  1. 确认阶段部署状态:检查Test阶段是否部署了最新的WebSocket API配置,未部署会导致端点不可用。

内容的提问来源于stack exchange,提问作者Andres Ospina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:22:42