Как настроить приложение на основе Laravel на AWS ECS с помощью Fargate?

Изменить: Мой первый вопрос был «как связать контейнеры внутри определения задачи на AWS ECS с помощью Fargate?» Но, возможно, я ошибался с самого начала, поэтому я изменил свой вопрос и сохранил содержание ниже:

Я пытаюсь развернуть простое приложение на основе Laravel на AWS через ECS. Моя служба работает должным образом в локальном режиме с использованием файла docker-compose-yml.

Но на AWS я получаю: "nginx: [emerg] host not found in upstream "app" in /etc/nginx/conf.d/default.conf:12" из журнала веб-контейнера.

Вот контейнеры моей службы: веб (nginx), приложение (Laravel), база данных (MySQL) и кеш (redis).

Я понимаю, что все контейнеры в описании задачи используют одно и то же пространство имен, поэтому нет необходимости связывать контейнер (в любом случае мы не можем использовать атрибут ссылок с Fargate).

Вы можете помочь мне найти здесь проблему? Я слепой.

Вот мой рабочий локальный файл docker-compose.yml:

version: '2'
services:

  #  The Application
  app:
    image: 696759765437.dkr.ecr.us-east-1.amazonaws.com/ali-
maison/tribe-migrate
    volumes:
      - /var/www/storage
    env_file: '.env'
    environment:
      - "DB_HOST=database"
      - "REDIS_HOST=cache"

  # The Web Server
  web:
    image: 696759765437.dkr.ecr.us-east-1.amazonaws.com/ali-maison/laravel-web
    ports:
      - 80:80

  # The Database
  database:
    image: mysql:5.6
    volumes:
      - dbdata:/var/lib/mysql
    environment:
      - "MYSQL_DATABASE=homestead"
      - "MYSQL_USER=homestead"
      - "MYSQL_PASSWORD=secret"
      - "MYSQL_ROOT_PASSWORD=secret"

  # redis
  cache:
    image: redis:3.0-alpine

volumes:
  dbdata:

Вот мой веб-контейнер Dockerfile:

FROM nginx:1.10

ADD vhost.conf /etc/nginx/conf.d/default.conf
WORKDIR /var/www

И мой vhost.conf:

server {
    listen 80;
    index index.php index.html;
    root /var/www/public;

    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

person FredRoger    schedule 18.01.2018    source источник
comment
Похоже на связанную проблему в stackoverflow.com/questions/33639138/   -  person randominstanceOfLivingThing    schedule 18.01.2018
comment
Похоже, но кажется, что я не могу применить какие-либо предложения в конфигурации описания моей задачи на ECS. : /   -  person FredRoger    schedule 18.01.2018
comment
с Fargate попробуйте заменить app:9000 на 127.0.0.1:9000   -  person David Lin    schedule 18.05.2018
comment
Удалось ли вам заставить его работать? Вы можете показать мне, как выглядит ваше определение задачи?   -  person Cliff Richard Anfone    schedule 11.07.2018
comment
Какая команда способна использовать Docker Compose для создания такого стека?   -  person Roman Newaza    schedule 12.07.2018
comment
Вы когда-нибудь находили для этого рабочее решение? У меня такая же проблема, и использование localhost тоже не работает.   -  person urchino    schedule 08.08.2018
comment
Каждый из ваших контейнеров входит в собственное определение задачи или все три контейнера входят в одно определение задачи?   -  person bluescores    schedule 09.08.2018
comment
@bluescores для меня есть два контейнера - nginx и php-fpm - и они находятся в одном образе докера и поэтому определены как одна задача в ECS. Может быть, их можно определить как две разные задачи с отдельными контейнерами? Неясно, решит ли это проблему связи, и, поскольку комбинированное изображение работает везде, зачем это нужно?   -  person urchino    schedule 23.08.2018


Ответы (3)


Решение такое:

  1. Убедитесь, что оба контейнера определены в одной задаче, например, nginx-php
  2. используйте localhost: port, например localhost: 9000 для php-fpm

Вторая часть упоминалась выше, но не было четко сказано, что оба контейнера должны выполнять одну и ту же задачу.

Дополнительную информацию можно найти здесь: https://github.com/aws-samples/amazon-ecs-fargate-aspnetcore/blob/master/README.md

person poldek    schedule 20.02.2019

Для других, которые могли столкнуться с этим, у меня была та же проблема, с подключением двух контейнеров, работающих в одной задаче на aws ecs fargate, и я обнаружил, что мне пришлось заменить «app» на «localhost» в vhost.conf, и это сработало. (Об этом упоминалось в некоторых комментариях к другому ответу) Итак, vhost.conf будет выглядеть так:

server {
    listen 80;
    index index.php index.html;
    root /var/www/public;

    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass localhost:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

Я также убедился, что порт 9000 отображен и открыт в контейнере приложения (может быть ненужным)

#  The Application
app:
  image: 696759765437.dkr.ecr.us-east-1.amazonaws.com/ali-maison/tribe-migrate
  volumes:
    - /var/www/storage
  env_file: '.env'
  environment:
    - "DB_HOST=database"
    - "REDIS_HOST=cache"
  ports:
    - 9000:9000
person grizzb    schedule 13.09.2018

Из vhost.conf:

fastcgi_pass app:9000;

Имя хоста app работает для docker-compose, потому что это то, что вы назвали сервисом в docker-compose.yml. docker-compose создает новую сеть для контейнеров, которыми он должен управлять, и эта сеть позволяет контейнерам ссылаться друг на друга по имени хоста без дополнительной настройки.

У Fargate нет этой функции, поэтому "приложение" не разрешится.

Единственный сетевой режим, который в настоящее время позволяет вам использовать Fargate, - это специальный режим AWS под названием awsvpc. Каждая задача, выполняемая в Fargate, получает свой собственный эластичный сетевой интерфейс (ENI), что означает, что каждая задача получает собственный частный IP-адрес. Вы можете дополнительно настроить ENI, чтобы он также имел общедоступный IP-адрес, так же, как вы можете с ENI в экземпляре EC2.


Как разрешить контейнер вашего приложения из контейнера nginx

В Fargate перейдите к определению выполняемой задачи для сервера приложений («Кластер»> вкладка «Задачи»> щелкните идентификатор контейнера в столбце «Задача» для своего сервера приложений). Раздел «Сеть» будет иметь частный IP-адрес.

Замените имя хоста app на этот ip в конфиге:

fastcgi_pass <private_ip>:9000;

person bluescores    schedule 26.01.2018
comment
Жесткое кодирование адреса - действительно плохая практика. Должен быть другой выход. Можем ли мы использовать localhost? - person Roman Newaza; 12.07.2018
comment
Хотя информация о том, почему это не работает, полезна - ваше предлагаемое решение не является хорошим, как указывает @RomanNewaza. Встраивание IP-адреса для конкретной задачи в конфигурацию контейнера - не лучший вариант, поскольку это означает, что контейнер не будет работать где-либо еще или если IP-адрес не согласован между задачами. Использование localhost на порту 9000 для параметра fastcgi_pass приводит для меня к ошибке 502 от nginx. - person urchino; 08.08.2018
comment
Я попытаюсь получить дополнительную информацию от OP и обновить этот ответ. Жесткое кодирование IP-адреса будет работать, но это бесполезно в реальном мире при использовании Fargate (т.е. это плохая практика) - person bluescores; 09.08.2018
comment
Очень важно повторить мысль, высказанную здесь другими. Если контейнеры nginx и php настроены для работы в одной и той же задаче fargate, вам необходимо использовать 127.0.0.1 в качестве IP-адреса для конфигурации nginx для fastcgi_pass, т.е. fastcgi_pass 127.0.0.1:9000; - person Phillip Hartin; 15.02.2020