12

Pragnę uruchomić docker w instancji EC2 API z AWS, i mam Dockerrun.aws.json takiego:AWS Elastic Beanstalk, Dockerrun.aws.json i wiele portów na metę Döcker

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

jak można widzę, mam wiele portów do odsłonięcia, ale elastyczna fasolka ujawnia tylko pierwszą z nich.

Znalazłem to zdanie w dokumentacji: Możesz określić wiele portów kontenera, ale AWS Elastic Beanstalk używa tylko pierwszego do połączenia twojego kontenera z odwrotnym proxy hosta i trasowania żądań z publicznego Internetu.

Moje pytanie brzmi: dlaczego?

Mam uwierzytelnianie, które używa protokołu Oauth2, i muszę korzystać z protokołu HTTPS z oczywistych względów bezpieczeństwa. Z tym ograniczeniem, mogę wybrać tylko HTTP lub HTTPS, ponieważ mogę tylko wystawić port 80 lub 443.

Próbowałem majstrować na przekierowaniach nginx z portami na poziomie instancji EC2, ale nie udało mi się . Jak mogę to zrobić?

Ten stackoverflow użytkownik ma ten sam problem. Exposing multiple ports from Docker within Elastic Beanstalk

Dziękując z góry

Odpowiedz

9

Skontaktowałem się z Centrum Wsparcia Amazon, a ja zdecydowałem się pokazać odpowiedź.

Witam K ...

Z Dockerrun.aws.json skrypty hak Elastic Beanstalk tylko czytać pierwszy port z pliku JSON.

Jest tak, ponieważ w /opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh:

jeżeli [echo $EB_CONFIG_DOCKER_PORT | wc -w -gt 1]; następnie EB_CONFIG_DOCKER_PORT = echo $EB_CONFIG_DOCKER_PORT | awk '{print $1}' ostrzec „Tylko eksponować dyrektywa dopuszcza, stosując pierwszy: $ EB_CONFIG_DOCKER_PORT” fi

Skrypty hak będzie musiał określić losowy port na odwrocie pełnomocnika do przekazania, który następnie przekazuje do portu kontenera Docker . Obecnie można skonfigurować tylko jedno mapowanie portów.

Jeśli chodzi o konfigurację nginx, najszybszym sposobem uzyskania portuwsłuchującego się w środowisko jest utworzenie oddzielnej sekcji serwera w /etc/nginx/conf.d/, np. custom-ssl.conf, który obsługuje uzgadnianie HTTPS z klientem. Oznacza to, że będziesz musiał umieścić swoje certyfikaty SSL w instancji, aby nginx mógł wykonać uzgadnianie SSL. Wrócę do ciebie później z przykładową konfiguracją HTTPS w nginxie w wersji .

W przeciwnym razie, jeśli twoje środowisko jest zbalansowane pod względem obciążenia, możesz po prostu ustawić detektor HTTPS na ELB i pozwolić ELB na zakończenie połączenia SSL .

Tymczasem, jeśli masz inne pytania, nie wahaj się zapytać!

poważaniem,

Sydney Centrum Wsparcia

*

Witam ponownie K ...

Jak już wspomniałem w poprzedniej korespondencji, należy znaleźć załączył próbny plik konfiguracyjny .ebextensions, który skonfiguruje serwer https na nginx, na jedno środowisko Docker instancji. Nie podałeś , daj mi znać, jakiego środowiska pytałeś, więc dołączone .ebextensions będą działać tylko w środowiskach z jedną instancją.

Ten .ebextensions plik konfiguracyjny wykonuje następujące czynności:

  • Dodaje plik konfiguracyjny serwera https dla nginx jako /etc/nginx/sites-enabled/https.conf, który odwrócić proxy sesji przychodzące https do kontenera Docker jako http.

  • Dodaje połączony plik klucza SSL/cert do /etc/pki/tls/certs/my_ssl.crt, wymagany przez powyższy serwer HTTPS.

  • Dodaje dodatkową szczelność reguły do ​​grupy zabezpieczeń EC2 środowiska beanstalk, aby umożliwić przychodzącego TCP: 443 połączeń do instancji

Proszę czuć się swobodnie modyfikować .ebextensions config plik do własnych sprawę użytkowania i umieść to w katalogu .ebextensions/na poziomie katalogu głównego aplikacji, który ma zostać wdrożony w Elastic Beanstalk. Jeśli nie ma tam katalogu, należy go utworzyć.

Aby uzyskać więcej informacji na temat plików .ebextensions konfiguracyjnych, patrz:

Jeśli jesteś na obciążenia zrównoważonego środowiska, a następnie trzeba będzie przesłać certyfikat SSL do IAM za pośrednictwem interfejsu AWS CLI i skonfiguruj swój ELB środowiska Beanstalk, aby umożliwić jego słuchaczowi HTTPS. Instrukcje będzie różny te powyżej:

Proszę dać mi znać, jak idziesz z .ebextensions config plików i dać mi znać, jeśli potrzebujesz dalszej pomocy!

poważaniem,

Sydney Centrum Wsparcia

I dał mi przykład w załączniku. 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