我正在部署集成 Stripe 支付的 NodeJS 后端。当前端用户单击“结帐”按钮时,后端 API 只需调用 Stripe SDK 创建结帐会话,然后用户将被重定向到 Stripe 结帐页面。我在本地测试了它,一切都按预期工作。
当启动服务以在 ALB 后面的 EC2 上运行容器时,前端能够在大多数端点上顺利地对后端进行 API 调用。但是,它无法连接到 Stripe。单击结帐按钮后,什么也没有发生。等待了一段时间后,我检查了运行任务的日志,得到了以下输出:
[Nest] 28 - 06/01/2024, 4:54:13 AM ERROR [ExceptionsHandler] Request aborted due to timeout being reached (80000ms)
Error: Request aborted due to timeout being reached (80000ms)
at /app/node_modules/stripe/cjs/RequestSender.js:326:37
at processTicksAndRejections (node:internal/process/task_queues:95:5)
为了解决这个问题,我删除了负载均衡器,只在端口 5000 上运行一个 EC2 实例。我将任务定义中的网络模式从
awsvpc
更改为 bridge
并进行静态端口映射,然后运行单个任务。令我惊讶的是,前端可以无缝到达结帐端点。当我在 ECS 上启动服务时将 ALB 放置在 EC2 实例后面时,就会出现问题。
EC2 实例默认放置在公共子网中,以从 ECR 中提取镜像。因此,我认为问题一定与安全组有关。这是我的安全组配置:
那么当 EC2 实例位于 ALB 之后时,有没有办法解决这个问题?
您的 ALB 似乎不允许从公共互联网连接到其端口 443 (HTTPS)。如果它不起作用,您将不得不分享您的 ALB 侦听器规则和目标组配置如何。
好处是底层EC2安全组的入站规则允许ALB的安全组。然而,由于整个端口范围都被开放,它太宽松了。