Serverless部署Laravel调用AWS SQS投递任务返回SignatureDoesNotMatch错误
错误根因
你遇到的SignatureDoesNotMatch错误由两个核心配置不匹配导致:
- 区域不匹配:
serverless.yml中指定资源部署在us-east-2区域,SQS队列也创建在该区域,但Laravel队列配置里SQS的请求区域默认设为us-east-1,签名凭证的区域和请求目标区域不一致被AWS拒绝。 - 队列地址未正确解析:报错请求URL中存在未替换的模板占位符
${construct:jobs.queueUrl},说明Laravel队列配置未填入正确的SQS队列地址。
修复步骤
1. 修正Laravel队列配置
编辑项目中config/queue.php的SQS配置段,确保区域和队列参数匹配你的部署配置:
'sqs' => [ 'driver' => 'sqs', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_REGION', 'us-east-2'), // 和serverless.yml的region保持一致 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-2.amazonaws.com/你的AWS账号ID'), 'queue' => env('SQS_QUEUE', 'AlertQueue'), // 对应你在serverless.yml中创建的队列名 ],
无需手动填写AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,Lambda运行时会自动注入执行角色的临时凭证
2. 在serverless.yml中注入环境变量并配置权限
在serverless.yml的provider段补充以下配置,避免硬编码队列信息,同时给Lambda开放SQS操作权限:
provider: name: aws region: us-east-2 # 保留你原来的其他provider配置 # 新增环境变量注入 environment: AWS_REGION: ${self:provider.region} SQS_QUEUE_ARN: !GetAtt AlertQueue.Arn # 新增IAM权限配置 iam: role: statements: - Effect: Allow Action: - sqs:SendMessage - sqs:ReceiveMessage - sqs:DeleteMessage - sqs:GetQueueAttributes Resource: - !GetAtt AlertQueue.Arn - !GetAtt DeadLetterQueue.Arn
3. 清理无效占位符
检查你的.env或者队列配置,删除所有未定义的${construct:jobs.queueUrl}类占位符,直接使用上面注入的环境变量读取队列地址即可。
4. 重新部署生效
运行serverless deploy重新发布服务,配置即可生效。
内容的提问来源于stack exchange,提问作者Isaque Palmieri
相关产品推荐
相关产品推荐

