通过 API 网关安全路由的 ECS 容器未返回,但容器的运行状况检查良好

Posted

技术标签:

【中文标题】通过 API 网关安全路由的 ECS 容器未返回,但容器的运行状况检查良好【英文标题】:ECS containers securely routed via API Gateway not returning but health check on containers is good 【发布时间】:2021-03-28 02:46:41 【问题描述】:

好的,这将是一个长篇,但我想确保我解释一下。我正在尝试做一个概念证明,我们可以通过 ECS 部署使用 API 网关公开的微服务,以便我们可以利用 lambda 授权者和认知。

为了实现这一点,我一直在 Medium 上关注本指南

然而,一旦我部署了我的网关,我就会遇到以下错误:

Cannot GET /node-demo

让我了解一下基础知识,我有一个基本的 express 应用程序,如下所示:

const express = require('express')

const PORT = process.env.PORT || 3000

const app = express()

app.get('/', (request, response) => 
  return response.json(
    data: 
      message: `API is functional`,
    ,
  )
)

app.listen(PORT, () => console.log(`App running on port $PORT`))

Dockerfile 看起来像这样:

FROM mhart/alpine-node:10.16.3

WORKDIR /app

COPY package*.json ./

RUN npm ci

COPY index.js .

CMD ["npm", "start"]

这个 docker 镜像已经被推送到 ECR,我已经创建了一个带有环境变量 PORT => 80 的任务定义

在我的集群上创建了一个运行良好的服务。然后创建了一个 ALB,其目标组指向我的容器,这些都恢复正常!

然后我使用以下内容路由到这些目标:

然后,我的 NLB 指向 ALB,并且我在 ALB 上允许了正确的 IP,因此我们可以通过安全组访问它。 NLB 目标组中的两个 IP 都是健康的

在 API Gateway 中创建 VPC 链接,然后创建如下资源:

然后,我在最后部署带有/node-demo 的 URL 并得到上面的初始错误。要么指南有错误,要么我做错了什么。

【问题讨论】:

添加建议进行一些测试以隔离问题。可以直接调用ECS内部IP吗?如果成功,则问题出在路由上。此外,请检查您的安全组并确保将端口和 IP/子网列入白名单。 打内部 IP 的问题是我在哪里做那个表格? 为什么要同时拥有 ALB 和 NLB? API Gateway -> NLB -> ECS 服务不是更好吗? 我只是从那个指南开始,我会试一试! 啊,我记得为什么,ALB 意味着我可以有多个目标组,然后我可以在不同的 url 下路由,即 /test /demo 等 【参考方案1】:

好消息和坏消息,

好消息,我已经解决了问题。

坏消息,超级简单

只需要添加一个路由到 express 应用,

/node-demo

【讨论】:

以上是关于通过 API 网关安全路由的 ECS 容器未返回,但容器的运行状况检查良好的主要内容,如果未能解决你的问题,请参考以下文章

阿里API网关使用总结

阿里云API网关

部署微服务于容器云平台,API网关应如何选择?

AWS ECS:VPC 终端节点和 NAT 网关

用于返回安全图像 URL 的 Amazon ECS API

云计算API网关遇上容器服务