Контейнеры AWS ECS не подключаются, но отлично работают на моем локальном компьютере. - PullRequest
0 голосов
/ 05 июля 2018

У меня есть приложение (работает на http://localhost:8080), которое взаимодействует с API-интерфейсом сервера, работающим на http://localhost:8081.. Я отдельно докертизировал внешний интерфейс и серверную часть и запускаю их через docker-compose локально, работает отлично без каких-либо проблем. Но когда я запускаю его в ECS, клиент не может найти http://localhost:8081(backend).

Я использую группу AutoScaling с Elastic Load Balancer, и оба моих контейнера определены в одном определении задачи. Кроме того, у меня есть бэкэнд, связанный с интерфейсом. Когда я запускаю ssh в своем экземпляре ECS и запускаю docker ps -a, я вижу, что оба моих контейнера работают на правильных портах точно так же, как на моей локальной машине ( Результат docker ps -a ), и я могу успешно пропинговать каждый из них из одного контейнера в другой.

Определение задачи

"CartTaskDefinition": {
   "Type": "AWS::ECS::TaskDefinition",
   "Properties": {
      "ContainerDefinitions": [
       {
          "Name": "cs-cart",
          "Image": "thishandp7/cs-cart",
          "Memory": 400,
          "PortMappings":[
            {
               "ContainerPort": "8080",
               "HostPort": "8080"
            }
          ],
          "Links": [
              "cs-server"
           ]
       },
       {
          "Name": "cs-server",
          "Image": "thishandp7/cs-server",
          "Memory": 450,
          "PortMappings":[
           {
              "ContainerPort": "8081",
              "HostPort": "8081"
           }
          ],
       }
     ]
   }
}

Слушатели в моем ElasticLoadBalancer, Первый слушатель для внешнего интерфейса, а второй - для внутреннего

"Listeners" : [
  {
    "LoadBalancerPort": 80,
    "InstancePort": 8080,
    "Protocol": "http"
  },
  {
    "LoadBalancerPort": 8081,
    "InstancePort": 8081,
    "Protocol": "tcp"
  }
],

EC2 instacne security Group Правила доступа:

"SecurityGroupIngress" : [
 {
   "IpProtocol" : "tcp",
   "FromPort" : 8080,
   "ToPort" : 8080,
   "SourceSecurityGroupId" : { "Ref": "ElbSecurityGroup" }
 },
 {
   "IpProtocol" : "tcp",
   "FromPort" : 8081,
   "ToPort" : 8081,
   "SourceSecurityGroupId" : { "Ref": "ElbSecurityGroup" }
 },
 {
   "IpProtocol" : "tcp",
   "FromPort" : 22,
   "ToPort" : 22,
   "CidrIp" : "0.0.0.0/0"
 }
],

Docker Compose

version: "3.5"

services:
  cart:
    build:
      context: ..
      dockerfile: docker/Dockerfile
      args:
        APP_LOCATION: /redux-saga-cart/
        PORT: 8080
    networks:
      - server-cart
    ports:
      - 8080:8080
    depends_on:
      - server

  server:
    build:
      context: ..
      dockerfile: docker/Dockerfile
      args:
        APP_LOCATION: /redux-saga-shopping-cart-server/
        PORT: 8081
    ports:
      - 8081:8081
    networks:
      - server-cart


networks:
  server-cart:

Быстрое обновление: я пробовал это в сетевом режиме awsvpc с балансировщиком нагрузки приложения. Все еще не работает

Заранее спасибо.

1 Ответ

0 голосов
/ 06 июля 2018

Какой режим Docker Network вы используете (Brdige / Host) в ECS ?. Я не думаю, что localhost будет правильно работать с контейнерами ECS. У меня была та же проблема, поэтому я использовал частный IP-адрес или DNS-имя хоста EC2 для связи в качестве цели временного тестирования. Ex - http://10.0.1.100:8081.

Примечание. Обязательно укажите правило группы безопасности, разрешающее трафик 8081 изнутри EC2 (измените группу безопасности EC2, чтобы разрешить 8081 для того же sgid, что и для источника).

Для производственных развертываний я бы рекомендовал использовать обнаружение служб для определения серверной службы (Consul by Hashicorp) или обнаружения частных служб AWS в ECS.


- Обновление -

Так как вы запускаете оба контейнера под одной и той же задачей def (под одной и той же службой ECS), то, как правило, ECS переносит оба установочных контейнера на один хост. Сделайте что-то вроде следующего.

  1. По умолчанию ECS переносит контейнеры в режиме Bridge в Linux.
  2. У вас должна быть возможность связи каждого контейнера с помощью Docker Gateway IP - 172.17.0.1 в Linux. Так что для вашего случая попробуйте настроить http://172.17.0.1:8081
...