AWS Elastic Beanstalk, Dockerrun.aws.json и несколько портов для запуска докеров

Я хочу запустить докер в экземпляре EC2 с API AWS, и у меня есть Dockerrun.aws.json, как это:

{
  "AWSEBDockerrunVersion": "1",
  "Authentication": {
    "Bucket": "<BUCKET>",
    "Key": ".dockercfg"
  },
  "Image": {
    "Name": "<NAME>:<TAG>",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "80"
    },
    {
      "ContainerPort": "443"
    }
  ]
}

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

Я нашел это предложение в документации: вы можете указать несколько портов контейнера, но AWS Elastic Beanstalk использует только первый, чтобы подключить ваш контейнер к обратному прокси-серверу хоста и запросам маршрута из общедоступного Интернета.

Мой вопрос: почему?

У меня есть аутентификация, использующая протокол Oauth2, и я должен использовать протокол HTTPS для очевидных соображений безопасности. С этим ограничением я могу выбрать только HTTP или HTTPS, потому что я могу показывать только порт 80 или 443.

Я попытался переработать ebextensions, чтобы сделать nginx перенаправления с портами на уровне экземпляров EC2, но я потерпел неудачу. Как я могу сделать?

Этот пользователь stackoverflow имеет ту же проблему. Предоставление нескольких портов из Docker внутри эластичного бобового стека

Благодарим вас заранее

Ответ 1

Я связался с Центром поддержки Amazon, и я решил показать вам ответ.

Привет, K...,

С Dockerrun.aws.json, скрипты с эластичным Beanstalk будут только читать первый порт из файла JSON.

Это происходит потому, что в /opt/elasticbeanstalk/hooks/appdeploy/pre/ 04run.sh:

если [ echo $EB_CONFIG_DOCKER_PORT | wc -w -gt 1]; тогда   EB_CONFIG_DOCKER_PORT = echo $EB_CONFIG_DOCKER_PORT | awk '{print $1}' warn "Разрешена только одна директива EXPOSE с использованием первого: $EB_CONFIG_DOCKER_PORT" fi

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

Что касается конфигурации nginx, то самый быстрый способ достичь порт 443, слушающий вашу среду, - создать отдельный сервер раздел в /etc/nginx/conf.d/, например. custom-ssl.conf, который обрабатывает Рукопожатие HTTPS с клиентом. Это означает, что вам придется поместите свои сертификаты SSL на экземпляр, чтобы nginx мог выполнить SSL-квитирование. Я вернусь к вам позже с образцом Конфигурация HTTPS в nginx.

В противном случае, если ваша среда сбалансирована по нагрузке, вы можете просто настроить прослушиватель HTTPS на ELB и позволить ELB обрабатывать SSL прекращение.

Между тем, если у вас есть другие вопросы, пожалуйста, не стесняйтесь спрашивать!

С уважением,

Центр поддержки Сиднея

*

Привет снова K...,

Как я уже упоминал в своей предыдущей переписке, добавлен пример файла конфигурации .ebextensions, который установит https сервер на nginx, в среде экземпляра Docker. Ты не дайте мне знать, в какой среде вы спрашивали, поэтому привязанные .ebextensions будут работать только в средах с одним экземпляром.

Этот файл конфигурации .ebextensions выполняет следующие действия:

  • Добавляет конфигурационный файл https-сервера для nginx как /etc/nginx/sites -enabled/https.conf, который обращает прокси-серверы входящий https-сеанс в контейнер Docker как http.

  • Добавляет объединенный файл SSL/cert в файл /etc/pki/tls/certs/my _ssl.crt, требуемый сервером HTTPS выше.

  • Добавляет дополнительное правило входа в группу безопасности EC2 среды Beanstalk, чтобы разрешить входящие соединения TCP: 443 с экземпляром

Пожалуйста, не стесняйтесь изменять конфигурационный файл .ebextensions в соответствии с вашими требованиями. и поместите это в каталог .ebextensions/на корневого уровня вашего приложения, которое будет развернуто в Elastic Beanstalk. Если каталог не существует, то создайте его.

Подробнее о файлах конфигурации .ebextensions см. ниже:

Если вы находитесь в среде с балансировкой нагрузки, тогда вам нужно будет загрузите свой сертификат SSL в IAM через CLI AWS и настройте Beanstalk environment ELB, чтобы включить его слушателя HTTPS. инструкции будут отличаться от приведенных выше:

Пожалуйста, дайте мне знать, как вы работаете с конфигурационным файлом .ebextensions и сообщите мне, если вам потребуется дополнительная помощь!

С уважением,

Центр поддержки Сиднея

И он дал мне пример в приложении. 01-Nginx-ssl.config

files:
  "/etc/nginx/sites-enabled/https.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      server {
        listen  443 ssl;
        ssl_certificate_key /etc/pki/tls/certs/my_ssl.crt;
        ssl_certificate /etc/pki/tls/certs/my_ssl.crt;
        ssl_protocols       SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;

        location / {
          proxy_pass          http://docker;
          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;
        }
      } 

  "/etc/pki/tls/certs/my_ssl.crt":
    mode: "000400"
    owner: root
    group: root
    content: |
      <Your key/cert pair goes here>


Resources:
  AllowSSL: 
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: {Ref : AWSEBSecurityGroup}
      IpProtocol: tcp
      ToPort: 443
      FromPort: 443
      CidrIp: 0.0.0.0/0