AWS API Gateway / AWS Network Load Balancer:请求以 500 InternalServerErrorException 结束,如何指定转发到的端口?

问题描述 投票:0回答:1

我已经为这个问题苦苦挣扎了两天,但无法让它工作。

我有这样的流程:

外部世界 --> AWS API Gateway ---> VPC Link ---> 网络负载均衡器 ---> 我的单个 EC2 实例

我已正确设置 EC2 实例。 “Typescript/ExpressJS”api 服务正在端口

3001

上运行

我还设置了网络负载均衡器和目标组,NLB 正在侦听并将请求转发到目标组(包含 EC2 实例)的端口

3001

我已配置 EC2 实例的安全组:

1. Allow All protocol traffic on All ports from my VPC
 (specified using CIDR notation `171.23.0.0/16`);

2. Allow All protocol traffic on All ports from ANY source (`0.0.0.0/0`);

现在,当我这样做时

curl docloud-backend-xxxxx.elb.ap-northeast-1.amazonaws.com:3001/api/user

api 服务收到请求,我可以看到 EC2 实例中生成的日志。

然后,我还设置了 API 网关,但问题似乎是向 API 网关发出的请求未传递到我的 EC2 实例的端口

3001

在 API 网关配置中,当我设置 VPC Link 并指定目标 NLB 时,API 网关默认会向端口 80 发送请求。

我必须告诉API网关发送请求到

docloud-backend-xxxxx.elb.ap-northeast-1.amazonaws.com:3001

但是,AWS API Gateway 上没有地方可以设置“转发到”端口号。

如何配置?

详细设置如下: 在 AWS API Gateway 方面,我有:

  1. 设置指向我的 VPC 的“VPC 链接”并将“目标 NLB”配置为我的 NLB: enter image description here

  2. 我已配置自定义域: enter image description here

我已经设置了 API 映射: enter image description here

  1. 在REST API的资源上,我配置了代理资源: enter image description here

我已经完成了从 AWS 文档中了解到的所有必要设置,但现在的问题是对 API 网关发出的请求似乎没有传递到我的 EC2 实例。

在API网关的方法测试中,我收到以下错误:

Request: /api/user
Status: 500
Latency: 4282 ms
Response Body
{
  "message": "Internal server error"
}
Response Headers
{"x-amzn-ErrorType":"InternalServerErrorException"}
Logs
Execution log for request 22ac2b9b-e859-474d-aa69-bd8c4bf51b4b
Tue Dec 28 09:53:02 UTC 2021 : Starting execution for request: 22ac2b9b-e859-474d-aa69-bd8c4bf51b4b
Tue Dec 28 09:53:02 UTC 2021 : HTTP Method: GET, Resource Path: /api/user
Tue Dec 28 09:53:02 UTC 2021 : Method request path: {proxy=api/user}
Tue Dec 28 09:53:02 UTC 2021 : Method request query string: {}
Tue Dec 28 09:53:02 UTC 2021 : Method request headers: {}
Tue Dec 28 09:53:02 UTC 2021 : Method request body before transformations: 
Tue Dec 28 09:53:02 UTC 2021 : Endpoint request URI: http://docloud-backend-6ff16c1d637f19bc.elb.ap-northeast-1.amazonaws.com
Tue Dec 28 09:53:02 UTC 2021 : Endpoint request headers: {x-amzn-apigateway-api-id=jeva09t4qc, User-Agent=AmazonAPIGateway_jeva09t4qc, Host=docloud-backend-6ff16c1d637f19bc.elb.ap-northeast-1.amazonaws.com}
Tue Dec 28 09:53:02 UTC 2021 : Endpoint request body after transformations: 
Tue Dec 28 09:53:02 UTC 2021 : Sending request to http://docloud-backend-6ff16c1d637f19bc.elb.ap-northeast-1.amazonaws.com
Tue Dec 28 09:53:07 UTC 2021 : Execution failed due to configuration error: There was an internal error while executing your request
Tue Dec 28 09:53:07 UTC 2021 : Method completed with status: 500


从浏览器的开发模式中,我可以看到向端点发出的 2 个请求

/api/user
。一个是预检请求,以
200
成功结束,另一个是“实际”请求,给出
500
InternalServerErrorException 
错误:

enter image description here

enter image description here

我认为请求已从 API 网关传输到 NLB,但它到达端口

80
而不是
3001

如何设置正确?

amazon-web-services amazon-ec2 aws-api-gateway amazon-vpc amazon-elb
1个回答
0
投票

配置并读取该 NLB 网络接口的流日志后,很明显 API Gateway 没有向 NLB 发送任何流量;这就是我在 2024 年 12 月解决问题的方法:

  • 创建新的私有子网
  • 创建一个位于私有子网中的新 NLB
  • 在API网关控制台创建新的VPC链接
  • 使用新的 NLB 域名更新 API Gateway API
  • 确保安全组适用于 NLB 和 EC2 实例;
© www.soinside.com 2019 - 2024. All rights reserved.