簡體   English   中英

使用兩個任務部署到 ECS fargate 集群時如何配置 React 應用程序獲取端口

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

我有兩個 docker 圖像在本地部署時可以正常通信,但我不確定如何設置我的應用程序以在它們都部署為同一個 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 應用程序的請求只是 go 直接到 {sameIPaddress}/fooService/{barStr},完全忽略了代理規范。 我可以在瀏覽器中看到請求是通過端口 80 發出的。如果這些請求是在端口 8081 上手動發出的,它們會很好地完成,因此端口可用並且服務正在運行。

我已經在另一個任務上公開了端口 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 - 富圖像

#
# 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 任務端口Foo 端口

ECS Bar任務端口酒吧港口

此問題的解決方案是將代理目標返回到“localhost:8081”。 根據亞馬遜支持:

為了最快地解決您的問題,您可以嘗試將代理配置從“http://server:8081”更改為“http://localhost:8081”,代理應該可以工作。

這是因為當 Fargate 與 awsvpc.network 模式一起使用時,在任務中運行的容器共享相同的 .network 命名空間,這意味着容器可以通過本地主機相互通信。 (例如,當后端容器在端口 8081 監聽時,前端容器可以通過 localhost:8081 訪問后端容器)並且當使用 docker-compose [2] 時,您可以使用主機名與同一 docker-compose 中指定的另一個容器通信文件。 因此,在 Fargate 中使用“http://server:8081”代理后端流量將不起作用,應修改為“http://localhost:8081”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM