AWS Elastic Beanstalk,Dockerrun.aws.json和docker上的多个端口运行

时间:2015-01-08 20:13:12

标签: amazon-web-services nginx amazon-ec2 docker elastic-beanstalk

我希望在使用AWS API的EC2实例中运行一个docker,我有Dockerrun.aws.json这样的:

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

就像你可以看到的那样,我有多个端口要暴露,但弹性beanstalk只暴露它们中的第一个。

我在文档中找到了这句话:您可以指定多个容器端口,但AWS Elastic Beanstalk仅使用第一个容器端口将容器连接到主机的反向代理并从公共Internet路由请求。

我的问题是为什么?

我有一个使用Oauth2协议的身份验证,出于明显的安全原因,我必须使用HTTPS协议。 有了这个限制,我只能选择HTTP或HTTPS,因为我只能暴露端口80或443。

我尝试修改ebextensions以使用EC2实例级别的端口进行nginx重定向,但是我已经失败了。 我该怎么办?

此stackoverflow用户遇到同样的问题。 Exposing multiple ports from Docker within Elastic Beanstalk

提前感谢你

1 个答案:

答案 0 :(得分:11)

我联系了亚马逊支持中心,我选择向您展示答案。

  

你好K ...,

     

使用Dockerrun.aws.json,Elastic Beanstalk钩子脚本只会读取   来自JSON文件的第一个端口。

     

这是因为在/opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh中:

     

if [echo $EB_CONFIG_DOCKER_PORT | wc -w -gt 1];然后     EB_CONFIG_DOCKER_PORT = echo $EB_CONFIG_DOCKER_PORT | awk '{print $1}' 警告&#34;只允许一个EXPOSE指令,使用第一个:   $ EB_CONFIG_DOCKER_PORT&#34;网络

     

钩子脚本必须指定反向的随机端口   代理转发到,然后转发到您的Docker容器   港口。目前只能设置一个端口映射。

     

关于nginx配置,实现最快的方法   端口443监听您的环境是创建一个单独的服务器   /etc/nginx/conf.d/中的部分,例如custom-ssl.conf,用于处理   与客户端进行HTTPS握手。这意味着你必须这样做   将您的SSL证书放在实例上,以便nginx可以   执行SSL握手。我稍后会回复你的样本   nginx中的HTTPS配置。

     

否则,如果您的环境是负载平衡的,您可以简单地   在ELB上设置HTTPS侦听器,让ELB处理SSL   终止。

     

同时,如果您有其他问题,请不要犹豫!

     

致以最诚挚的问候,

     

悉尼支持中心

*

  

你好再见K ...,

     

正如我在之前的信件中提到的那样,请找到   附上了一个样本.ebextensions配置文件,它将设置一个https   nginx上的服务器,在单个实例Docker环境中。你没有   让我知道你在询问哪个环境,所以   附加的.ebextensions仅适用于单实例环境。

     

此.ebextensions配置文件执行以下操作:

     
      
  • 将nginx的https服务器配置文件添加为/etc/nginx/sites-enabled/https.conf,反向代理   传入https会话到Docker容器的http。

  •   
  • 将SSL密钥/证书组合文件添加到上述HTTPS服务器所需的/etc/pki/tls/certs/my_ssl.crt中。

  •   
  • 向Beanstalk环境的EC2安全组添加额外的入口规则,以允许传入的TCP:443连接到实例

  •   
     

请随时修改.ebextensions配置文件以适合您的   用例,并将其放在.ebextensions /目录中   要在Elastic Beanstalk中部署的应用程序的根级别。如果   目录不在那里,请创建它。

     

有关.ebextensions配置文件的更多信息,请参阅:

           

如果您处于负载均衡的环境中,那么您将需要   通过AWS CLI将您的SSL证书上传到IAM,并配置您的   Beanstalk环境的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