首页 > 解决方案 > API 网关可以代理到 HTTP 服务器而不是 json 吗?

问题描述

我正在尝试使用 AWS API Gateway 作为私有 HTTP 服务的身份验证解决方案,但在设置它时遇到了麻烦。

我有一个虚拟 node.js 服务在私有 VPC 中运行,前面有一个内部网络负载均衡器(注意:它很健康)。

然后我设置了一个 API 并在本指南中配置了一个 VPC 链接:https ://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started-with-private-integration.html

get 方法的资源 URL 指向内部网络负载均衡器的 DNS 名称。

当我导航到 API 网关 URL(例如https://ABC123.execute-api.us-west-2.amazonaws.com/prod/)时,我能够获得服务器的 HTML 响应(见下文) . 但是,javascript 文件返回一个403 Forbidden. 我希望这与路径设置有关。

除了返回单个响应(即 json API 响应)之外,有没有办法配置 API 网关以返回包含 HTML、css 和 js 资源的完整应用程序?


这是运行应用程序的虚拟代码:

// server.js
var express = require('express'),
app = express(); 
app.use('/', express.static('/home/ubuntu/static/'));
app.listen(8080);

索引页面 - 这是我点击 API 网关时加载的页面

<!-- static/index.html -->
<html>
<body>
<h1>Hello world!</h1>
<p>This is some text.</p>
<script src="./app.js"></script>
</body>
</html>

索引页

这个 JS 加载失败(403)并且没有执行。

// static/app.js
console.log('Logging from app.js');
alert('WOOT!');

控制台输出

标签: amazon-web-servicesaws-api-gatewayamazon-vpc

解决方案


您可以在 AWS 的 Lambda 面板中验证您的函数是否被调用(并正确配置)。如果您的 API Gateway 配置正确,它应该显示为您的 lambda 函数的触发器:

lambda 配置

之后,您可以在监控选项卡上查看 lambda 的统计信息和日志:

lambda 监控

您需要一个事件处理函数,将 API Gateway 请求重定向到 express 应用程序上的相应资源,这意味着您需要实现某种中间层以将 API Gateway 请求正确映射到您的 express 方法/路径/参数/文件。

AWS Lambda 是在 API Gateway、SNS、Alexa Skills 等服务上发生事件时调用的函数。我会尝试设置aws-serverless-express,或使用其他一些服务,例如 Elastic Beanstalk 或 ECS


推荐阅读