无法使用 awsvpc 网络类型与 ECS Fargate 上同一任务中的另一个容器通信

Posted

技术标签:

【中文标题】无法使用 awsvpc 网络类型与 ECS Fargate 上同一任务中的另一个容器通信【英文标题】:Cannot talk to another container inside same task on ECS Fargate using awsvpc networking type 【发布时间】:2021-03-30 04:34:42 【问题描述】:

我在同一个 ECS 任务中运行标准 SPA 前端应用和节点服务器。

当同一任务中的 2 个容器相互连接时,我所读到的关于 awsvpc 的所有内容都可以使用 localhost

但是,通过这种设置,我似乎无法将数据从我的节点服务器返回到我的 UI。我所有的请求都会立即失败。我已经断言它实际上是在尝试在我的实际计算机上点击 localhost

浏览器故障: https://pasteboard.co/JFJLnLO.png

出于测试目的,我公开了端口8080 以查看我是否可以直接与节点服务器交互并且可以按预期工作。我只是无法让 UI 与之对话。

任何帮助将不胜感激

编辑:

我的任务定义如下所示:

  "containerDefinitions": [
    
      "essential": true,
      "image": "[my-account-id].dkr.ecr.eu-west-1.amazonaws.com/[my-account]/app-ui:latest",
      "name": "app-ui",
      "logConfiguration": 
        "logDriver": "awslogs",
        "options": 
          "awslogs-group": "/ecs/app-ui",
          "awslogs-region": "eu-west-1",
          "awslogs-stream-prefix": "ecs",
          "awslogs-create-group": "true"
        
      ,
      "portMappings": [
        
          "containerPort": 3000,
          "hostPort": 3000,
          "protocol": "tcp"
        
      ]
    ,
    
      "essential": true,
      "image": "[my-account-id].dkr.ecr.eu-west-1.amazonaws.com/[my-account]/app-api:latest",
      "name": "app-api",
      "logConfiguration": 
        "logDriver": "awslogs",
        "options": 
          "awslogs-group": "/ecs/app-api",
          "awslogs-region": "eu-west-1",
          "awslogs-stream-prefix": "ecs",
          "awslogs-create-group": "true"
        
      ,
      "portMappings": [
        
          "containerPort": 8080,
          "hostPort": 8080,
          "protocol": "tcp"
        
      ]
    
  ],
  "cpu": "256",
  "executionRoleArn": "arn:aws:iam::[my-account-id]:role/AWSServiceRoleECS",
  "family": "app",
  "memory": "512",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"]



  [1]: https://i.stack.imgur.com/S7zl3.png

【问题讨论】:

你的任务定义是什么样的? @dpwrussell 我已将我的任务定义添加到帖子中^^ 你能解释一下你如何调用8080端口的api吗?您有显示浏览器调用 localhost:8080 的屏幕截图吗?所以你以某种方式在容器内运行浏览器? 啊,我明白了。我完全傻了,对不起。我必须将公共 dns 打包为 UI 的 env var。我明白你在说什么。这是一个漫长的夜晚:') 没问题。如果您不介意,我会提供答案以供将来参考。 【参考方案1】:

基于 cmets。

该问题是由于在浏览器的客户端调用localhost api端点引起的。这将在客户端计算机上解析为localhost,而不是在 ECS 任务中。当从 ECS 任务内部而不是任务外部调用 API 时,localhost 将起作用。

要从客户端调用 API 端点,需要常规公共 IP 或公共 DNS,而不是 localhost

【讨论】:

如果您查看我的另一个问题,我将不胜感激 - ***.com/questions/65384116/…

以上是关于无法使用 awsvpc 网络类型与 ECS Fargate 上同一任务中的另一个容器通信的主要内容,如果未能解决你的问题,请参考以下文章

无法访问 AWS ECS EC2 实例中的端口

AWS ECS Fargate 和端口映射

aws-vpc 容器无法访问互联网

ECS:容器的 TaskExecutionRole

如何链接在 AWS ECS 任务中运行的 2 个容器

如何在 Amazon EC2 容器服务 (ECS) 中使用不安全的 docker 注册表?