Как настроить приложение 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" из моего журнала веб-контейнера.

Здесь контейнеры моей службы: web (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;
    }
}

Ответ 1

Из 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 разверните определение своей задачи для сервера приложений (вкладка "Кластеp > Задачи" > щелкните идентификатор контейнера в столбце "Задачи" для вашего сервера приложений). Секция сети будет иметь частный IP-адрес.

Замените имя хоста "app" на этот ip в conf:

fastcgi_pass <private_ip>:9000;