【问题标题】:HTTPS on Elastic Beanstalk (Docker Multi-container)Elastic Beanstalk 上的 HTTPS(Docker 多容器)
【发布时间】:2017-10-14 14:40:34
【问题描述】:

在使用多容器 Docker 环境在 Amazon Elastic Beanstalk 上设置 HTTPS/SSL 时,我一直在环顾四周,但没有找到很多关于最佳实践的内容。

在单容器配置方面有很多东西,但在多容器方面则没有。

我的 Dockerrun.aws.json 看起来像这样:

{
  "AWSEBDockerrunVersion": 2,
  "volumes": [
      {
          "name": "app-frontend",
          "host": {
              "sourcePath": "/var/app/current/app-frontend"
          }
      },
      {
          "name": "app-backend",
          "host": {
              "sourcePath": "/var/app/current/app-backend"
          }
      }
  ],
    "containerDefinitions": [
        {
            "name": "app-backend",
            "image": "xxxxx/app-backend",

            "memory": 512,
            "mountPoints": [
                {
                    "containerPath": "/app/app-backend",
                    "sourceVolume": "app-backend"
                }
            ],
            "portMappings": [
                {
                    "containerPort": 4000,
                    "hostPort": 4000
                }
            ],
            "environment": [
                {
                    "name": "PORT",
                    "value": "4000"
                },
                {
                    "name": "MIX_ENV",
                    "value": "dev"
                },
                {
                    "name": "PG_PASSWORD",
                    "value": "xxxx"
                },
                {
                    "name": "PG_USERNAME",
                    "value": "xx"
                },
                {
                    "name": "PG_HOST",
                    "value": "xxxxx"
                }


            ]
        },
        {
            "name": "app-frontend",
            "image": "xxxxxxx/app-frontend",
            "memory": 512,
            "links": [
                "app-backend"
            ],
            "command": [
                "npm",
                "run",
                "production"
            ],
            "mountPoints": [
                {
                    "containerPath": "/app/app-frontend",
                    "sourceVolume": "app-frontend"
                }
            ],
            "portMappings": [
                {
                    "containerPort": 3000,
                    "hostPort": 80
                }
            ],
            "environment": [
                {
                    "name": "REDIS_HOST",
                    "value": "xxxxxx"
                }
            ]
        }
    ],
    "family": ""
}

到目前为止,我的想法是我需要将一个 nginx 容器加入其中,以便代理这两个服务并处理诸如将不同的域名映射到不同的服务之类的事情。

我会按照通常的方式设置 nginx 并正常配置 SSL,还是有更好的方法,就像我看到的使用 .ebextensions 方法 (http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/https-singleinstance-docker.html) 的单个容器一样?

【问题讨论】:

    标签: amazon-web-services nginx docker amazon-ebs


    【解决方案1】:

    这更像是一个想法(我实际上并没有这样做,也不确定它是否可行)。但是这些组件似乎都可用于创建一个 ALB,该 ALB 可以根据路径规则将流量引导到一个进程或另一个进程。

    根据http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options-general.html 提供的选项,我认为可以通过.ebextensions 配置文件完成以下操作:

    1. 使用 aws:elasticbeanstalk:environment:process:default 确保默认应用程序端口和运行状况检查设置为您想要的方式(假设端口 80 在这种情况下是您的默认设置。
    2. 使用aws:elasticbeanstalk:environment:process:process_name 创建一个backend 进程,该进程将转到您的第二个服务(在本例中为端口4000)。
    3. 使用aws:elbv2:listenerrule:backend 为您的后端创建一个规则,该规则将使用/backend/* 之类的内容作为路径。
    4. 使用使用此新后端规则的aws:elbv2:listener:443(例如http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-applicationloadbalancer.html)创建 SSL 侦听器。

    我不确定是否需要为aws:elbv2:listener:default 的默认侦听器创建其他规则。似乎默认值可能只匹配 /*,所以在这种情况下,发送到 /backend/* 的任何内容都会发送到 4000 端口容器,而其他任何内容都会发送到 3000 端口容器。

    【讨论】:

    • 感谢您的信息 - 将尝试并报告!
    【解决方案2】:

    你肯定需要一个 nginx 容器,因为多容器 ELB 设置默认不提供一个简单的事实。您在 ELB 上看到带有这些 .ebextension 配置的单个容器设置的原因是,对于这种类型的设置,ELB 确实提供了 nginx。

    拥有自己的 nginx 容器的好处是您不需要前端容器(假设您正在提供静态文件)。您可以编写我们的 nginx 配置,以便直接提供静态文件。

    这是我的 Dockerrun 文件:

    {
      "AWSEBDockerrunVersion": 2,
      "volumes": [
          {
              "name": "dist",
              "host": {
                  "sourcePath": "/var/app/current/frontend/dist"
              }
          },
          {
            "name": "nginx-proxy-conf",
            "host": {
                "sourcePath": "/var/app/current/compose/production/nginx/nginx.conf"
            }
          }
      ],
      "containerDefinitions": [
        {
          "name": "backend",
          "image": "abc/xyz",
          "essential": true,
          "memory": 256,
        },
        {
          "name": "nginx-proxy",
          "image": "nginx:latest",
          "essential": true,
          "memory": 128,
          "portMappings": [
            {
              "hostPort": 80,
              "containerPort": 80
            }
          ],
          "depends_on": ["backend"],
          "links": [
            "backend"
          ],
          "mountPoints": [
            {
              "sourceVolume": "dist",
              "containerPath": "/var/www/app/frontend/dist",
              "readOnly": true
            },
            {
              "sourceVolume": "awseb-logs-nginx-proxy",
              "containerPath": "/var/log/nginx"
            },
            {
              "sourceVolume": "nginx-proxy-conf",
              "containerPath": "/etc/nginx/nginx.conf",
              "readOnly": true
            }
          ]
        }
      ]
    }
    

    我还强烈建议使用 AWS 服务来设置您的 SSL:Route 53 和证书管理器。它们一起玩得很好,如果我理解正确,它允许您在负载平衡级别上应用 SSL。

    【讨论】:

      猜你喜欢
      • 2018-06-20
      • 2019-02-28
      • 2017-07-26
      • 2017-12-26
      • 2017-05-07
      • 2018-12-05
      • 2019-10-09
      • 1970-01-01
      • 2017-07-04
      相关资源
      最近更新 更多