Elastic Beanstalk上的HTTPS(Docker Multi-container)

时间:2017-05-15 17:49:56

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

在使用多容器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 )?

2 个答案:

答案 0 :(得分:1)

这更像是一个想法(我实际上并没有这样做,也不确定它是否有用)。但是这些组件似乎都可以创建一个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侦听器。
  5. 我不确定是否需要为aws:elbv2:listener:default的默认侦听器创建其他规则。看起来默认值可能只匹配/*所以在这种情况下,发送到/backend/*的任何内容都将转到端口4000容器,其他任何内容都会转到端口3000容器。

答案 1 :(得分:1)

你肯定需要一个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和Certificate manager。它们可以很好地协同工作,如果我理解正确,它允许您在负载平衡级别上应用SSL。