12

desidero eseguire uno scaricatore di porto in un'istanza EC2 con AWS API, e ho una Dockerrun.aws.json come questo:AWS Elastic Beanstalk, Dockerrun.aws.json e più porte su corsa finestra mobile

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

Come si può vedi, ho più porte da esporre, ma il beanstalk elastico espone solo il primo di esse.

Ho trovato questa frase nella documentazione: È possibile specificare più porte del contenitore, ma AWS Elastic Beanstalk utilizza solo il primo per collegare il contenitore al proxy inverso dell'host e instradare le richieste da Internet pubblica.

La mia domanda è perché?

Ho un'autenticazione che utilizza il protocollo Oauth2 e devo utilizzare il protocollo HTTPS per ovvi motivi di sicurezza. Con questa restrizione, posso solo scegliere HTTP o HTTPS, perché posso solo esporre la porta 80 o 443.

ho provato ad armeggiare ebextensions a fare redirezioni nginx con porte a livello di istanze EC2, ma ho fallito . Come posso fare?

Questo utente StackOverflow ha lo stesso problema. Exposing multiple ports from Docker within Elastic Beanstalk

Ringraziandovi anticipatamente

risposta

9

Ho contattato il supporto tecnico di Amazon, e ho scelto di mostrare la risposta.

Ciao K ...,

Con Dockerrun.aws.json, script gancio elastico Beanstalk sarà letto solo la prima porta dal file JSON.

Questo perché in /opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh:

se [echo $EB_CONFIG_DOCKER_PORT | wc -w -gt 1]; poi EB_CONFIG_DOCKER_PORT = echo $EB_CONFIG_DOCKER_PORT | awk '{print $1}' avvertono "Solo una ESPORRE direttiva è consentito, utilizzando la prima: $ EB_CONFIG_DOCKER_PORT" fi

Gli script hook dovranno specificare una porta casuale per l'inverso proxy per trasmettere al, che poi in avanti alla porta del contenitore Docker. Attualmente è possibile configurare solo una mappatura delle porte.

Per quanto riguarda la configurazione di nginx, il modo più rapido per raggiungere una porta 443 ascoltando il vostro ambiente è quello di creare una sezione separata del server in /etc/nginx/conf.d/ esempio custom-ssl.conf, che gestisce l'handshake HTTPS con il client. Ciò significa che sarà necessario posizionare i certificati SSL sull'istanza in modo che nginx possa eseguire l'handshake SSL. Ti ricontatterò in un secondo momento con una configurazione di esempio di HT233 in nginx.

In caso contrario, se l'ambiente è un equilibrato carico uno, si può semplicemente impostare un ascoltatore HTTPS sulla ELB, e lasciare che l'ELB gestire la terminazione SSL .

Nel frattempo, se avete altre domande, non esitate a chiedere!

Con i migliori saluti,

Sydney Support Center

*

Ciao di nuovo K ...,

Come ho già detto nel mio precedente corrispondenza, si prega di trovare allegato un file di configurazione .ebextensions che configurerà un server https su nginx, in un ambiente Docker a istanza singola. Non hai fammi sapere di quale ambiente stavi indagando, quindi l'allegato .ebextensions funzionerà solo su ambienti a singola istanza.

Questo .ebextensions file di configurazione esegue le seguenti:

  • Aggiunge il file di configurazione del server HTTPS per nginx come /etc/nginx/sites-enabled/https.conf, che i proxy la sessione https in entrata inversa al contenitore Docker come http.

  • Aggiunge un file/cert combinata delle chiavi SSL in /etc/pki/tls/certs/my_ssl.crt, richiesta dal server HTTPS sopra.

  • Aggiunge una regola di ingresso in più per gruppo di protezione EC2 dell'ambiente di Beanstalk per consentire TCP in entrata: 443 collegamenti con l'istanza

non esitate a modificare il file di configurazione le .ebextensions per soddisfare il vostro caso uso e posizionarlo all'interno della directory .ebextensions al livello root della propria applicazione da distribuire in Elastic Beanstalk. Se la directory non c'è, quindi si prega di crearla.

Per ulteriori informazioni sui file di configurazione .ebextensions, vedere:

Se siete su un ambiente equilibrato carico, allora si avrà bisogno di caricare il tuo certificato SSL per IAM tramite la CLI AWS e configura il tuo ELB dell'ambiente Beanstalk per abilitare il relativo listener HTTPS. Le istruzioni saranno diversi a quelli di cui sopra:

Si prega di farmi sapere come si va con il file di configurazione .ebextensions, e fatemi sapere se avete bisogno di ulteriore assistenza!

Con i migliori saluti,

Sydney Support Center

E mi ha dato un esempio in allegato. 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 
Problemi correlati