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

Kma*_*hta 15 nginx amazon-ec2 amazon-web-services docker amazon-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"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

我的问题是为什么?

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

我尝试修改ebextensions以使用EC2实例级别的端口进行nginx重定向,但我失败了.我能怎么做 ?

此stackoverflow用户具有相同的问题. 在Elastic Beanstalk中公开Docker的多个端口

提前感谢你

Kma*_*hta 11

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

你好K ...,

使用Dockerrun.aws.json,Elastic 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}' 警告"只允许一个EXPOSE指令,使用第一个:$ EB_CONFIG_DOCKER_PORT"fi

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

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

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

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

最好的祝福,

悉尼支持中心

*

你好再次K ...,

正如我在之前的通信中所提到的,请查找附带的示例.ebextensions配置文件,该文件将在单个实例Docker环境中在nginx上设置https服务器.您没有让我知道您询问的环境,因此附加的.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
Run Code Online (Sandbox Code Playgroud)