使用两个任务部署到 ECS fargate 集群时如何配置 React 应用程序获取端口

How to configure port of React app fetch when deploying to ECS fargate cluster with two tasks

我有两个 docker 图像在本地部署时通信良好,但我不确定如何设置我的应用程序以正确地从 React 应用程序调用 fetch() 到正确的端口其他应用程序,当它们都作为任务部署在同一 ECS 集群上时。

我的 React 应用程序使用简单的 fetch('/fooService/' + barStr) 类型调用,而我的其他应用程序在端口 8081 上公开了一个 /fooService/{barStr} 端点。

对于本地部署和本地docker,我使用setupProxy.js指定代理:

const { createProxyMiddleware } = require("http-proxy-middleware");
module.exports = function(app) {
    app.use(createProxyMiddleware('/fooService',
        { target: 'http://fooImage:8081',
            changeOrigin: true
        }
        ));
}

不过,在 ECS 中,这似乎什么都不做。当图像启动时,我看到了 setupProxy 运行,但是来自我的 React 应用程序的请求直接转到 {sameIPaddress}/fooService/{barStr},完全忽略了代理规范。我可以在浏览器中看到请求是通过端口 80 发出的。如果这些请求是手动在端口 8081 上发出的,它们会很好地完成,所以端口可用并且服务是 运行ning.

我已经在另一个任务上暴露了端口 8081,我可以从外部毫无问题地访问它,我只是不清楚如何设计我的 React 应用程序以指向它,因为我不一定知道什么在任务启动之前,我将分配 IP 地址。如果我使用相对路径,我不能指定端口。

在此上下文中指定我的提取请求的目的地的惯用方法是什么?

编辑:如果相关,这里是 docker 图像的配置方式。它们是在 dockerhub 上自动构建的,如果我将它们部署在我的本地 docker 实例中,它们可以正常工作。

docker-compose.yaml

version: "3.8"
services:
  fooImage:
    image: myname/foo-image:0.1
    build: ./
    container_name: server
    ports:
      - '8081:8081'
  barImage:
    image: myname/bar-image:0.1
    build: ./bar
    container_name: front
    ports:
      - '80:80'
    stdin_open: true
    tty: true

Dockerfile - foo image

#
# Build stage
#
FROM maven:3.8.5-openjdk-18-slim AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package


FROM openjdk:18-alpine
COPY --from=build /home/app/target/*.jar /usr/local/lib/app.jar
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "/usr/local/lib/app.jar"]

Dockerfile - 条形图

FROM node:17-alpine

WORKDIR /app

COPY package.json ./
COPY package-lock.json ./

RUN npm install

COPY . .

CMD ["npm", "start"]

ECS Foo 任务端口

ECS Bar任务端口

此问题的解决方案是 return 代理目标为“localhost:8081”。根据亚马逊支持:

For quickest resolve your issue, you can try to change your proxy configuration from "http://server:8081" to "http://localhost:8081" and the proxy should work.

那是因为当 Fargate 与 awsvpc 网络模式一起使用时,Task 中的容器 运行 共享相同的网络命名空间,这意味着容器可以通过 localhost 相互通信。 (例如,当 back-end 容器侦听端口 8081 时,front-end 容器可以通过 localhost:8081 访问 back-end 容器)而当使用 docker-compose [2] 时,您可以使用与同一 docker-compose 文件中指定的另一个容器通信的主机名。因此在 Fargate 中使用“http://server:8081”代理 back-end 流量将不起作用,应修改为“http://localhost:8081”。“