AWS Эластичный бобовый стебель с докером-compose.yml

#amazon-web-services #docker-compose #amazon-elastic-beanstalk #nginx-reverse-proxy

Вопрос:

Я пытаюсь развернуть несколько служб AWS Elastic Beanstalk с помощью Docker running on Amazon Linux 2 платформы. Поскольку в моем файле есть две службы docker-compose.yml :

 version: '3.8'
services:
  beanstalk-flask:
    image: "anotheruserdocker/beanstalk-flask"
    ports:
      - "5000:5000"
  tasks:
    image: "xxxxx.dkr.ecr.us-east-1.amazonaws.com/xxx:xxx"
    ports:
      - "8080:8080"
 

Мне нужно изменить nginx конфигурацию службы, чтобы перенаправить трафик на конкретную службу.
Я следил за документацией, в которой отмечалось, что вы можете переопределить значение по умолчанию nginx.conf своим собственным , и для того, чтобы это сделать, вам нужно поместить свой конфигурационный файл в application source bundle , вот так .platform/nginx/nginx.conf .
Я также включил эту include conf.d/elasticbeanstalk/*.conf; строку, чтобы переопределить ее.
файл nginx.conf:

 # Elastic Beanstalk Nginx Configuration File

user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
worker_rlimit_nofile    32633;
include conf.d/elasticbeanstalk/*.conf;

upstream service_1 {
    server 172.17.0.1:8080;
    keepalive 256;
}

upstream serivce_2 {
    server 172.17.0.1:5000;
    keepalive 256;
}

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    access_log    /var/log/nginx/access.log;


    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

    include  conf.d/*.conf;

    map $http_upgrade $connection_upgrade {
            default       "upgrade";
    }

    server {
        listen 80 default_server;
        gzip on;
        gzip_comp_level 4;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml rss text/javascript;

        access_log    /var/log/nginx/access.log main;

        location / {
            proxy_pass            http://service_1;
            proxy_http_version    1.1;

            proxy_set_header    Connection             $connection_upgrade;
            proxy_set_header    Upgrade                $http_upgrade;
            proxy_set_header    Host                   $host;
            proxy_set_header    X-Real-IP              $remote_addr;
            proxy_set_header    X-Forwarded-For        $proxy_add_x_forwarded_for;
        }

        location /api {
            proxy_pass            http://service_2;
            proxy_http_version    1.1;
        }

        # Include the Elastic Beanstalk generated locations
        include conf.d/elasticbeanstalk/*.conf;
    }
}

 

Как только я загружу приложение source bundle , которое выглядит так:

 docker-compose.yml
.platform/nginx/nginx.conf
 

конфигурация не меняется.
Я что-то упускаю, это ошибка или есть какие-либо другие способы изменить/изменить nginx конфигурацию по умолчанию?
Кроме того, я заметил, что при загрузке nginx.service не находится в запущенном состоянии, можно ли запустить эту службу при загрузке?
Спасибо.

Ответ №1:

Нашел возможное решение.

Во время создания AWS Elastic Beanstalk среды (если вы используете тип развертывания с балансировкой нагрузки) вы можете добавить процессы, которые будет регистрировать балансировщик нагрузки(?).

Как только я добавил процессов (которые работают на 8080 и 5000 порты), я создал дополнительные listener приложения балансировки нагрузки, который прослушивает трафик на порт 5000 (я только сделал это для этого порта, потому что по умолчанию AWS Elastic Beanstalk среды создает слушателя, который перенаправляет трафик на целевую группу экземпляр EC2, который был запущен на указанный 8080 порт) и направляет его целевая аудитория процесс, который запускает его на этот порт.

После выполнения этих шагов это сработало.

Интересно, что я действительно не знаю, как это работало, я подключился к экземпляру EC2 и заметил, что nginx.service он был в inactive состоянии.

Вероятно, я не совсем ясно понимаю, как это работает за кулисами, любые разъяснения были бы весьма признательны.

Спасибо!

P.S.: Как только я получу достаточно очков репутации, я приложу несколько скриншотов предпринятых шагов.

Ответ №2:

Служба Nginx вообще не настроена. С AWS Elastic Beanstalk с докером, работающим на Amazon Linux 2 docker, они предполагают, что вы запускаете Nginx в контейнере.

Это задокументировано здесь: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker.container.console.html#docker-software-config