Elastic Beanstalk 힘 https


12

AWS Elastic Beanstalk를 통해 배포하는 사이트에서 HTTPS를 강제 실행하는 데 문제가 있습니다.

EmberJS를 사용하는 프론트 엔드 애플리케이션입니다. http 트래픽을 https로 리디렉션하는 방법을 알아 내려고 며칠 동안 서클에서 돌아 왔습니다. EC2 머신에서 Amazon Linux AMI를 사용하고 있습니다.

HTTPS를 강제 실행하는 것이 Elastic Beanstalk 내에 있지 않다는 결론에 도달했습니다 (여전히 올바른지 확실하지 않음). Elastic Beanstalk Load Balancer를 통해 HTTP와 HTTPS를 모두 허용하고 서버에서 리디렉션하려고합니다.

내가 문제를 겪고있는 곳입니다. 헤더를 mod_rewrite기반으로 하지 않는 다시 쓰기 규칙에 대한 많은 답변을 찾았 X-Forwarded-Proto지만 찾기 검색에 따라 해당 파일이 EC2 시스템에 없습니다.

또한 .ebextensions디렉토리 내에 구성 파일을 만들려고 시도했지만 작동하지 않았습니다.

내가하려고하는 가장 중요한 것은 http 주소에 도달하려고 할 때 사용자가 https를 지시하도록하는 것입니다. 모든 의견이나 제안은 대단히 감사합니다!

편집 : Python 3.4 (미리 구성된-Docker)를 실행하는 64 비트 데비안 jessie v1.4.1을 사용하고 있습니다.


인터넷은이 문제에 대한 하나의 완전하고 효과적인 해결책에 동의 할 수없는 것 같습니다. 잘하면 당신은 내 게시물에 도움을 얻을 수 있습니다 . 나는 이것을 끝내기 위해 농구대를 뛰어 넘어야했다.
ADTC

답변:


7

환경마다 구성이 다르기 때문에 사용하는 Elastic Beanstalk 환경 ( 지원되는 플랫폼 참조)을 지정해야한다고 생각 합니다.

기본적으로 다음을 사용자 정의해야합니다.

  • Elastic Load Balancer :
    • 포트 80에서 수신 대기하고 EC2 인스턴스 포트 80으로 프록시하십시오.
    • 포트 443에서 수신 대기하고 EC2 인스턴스 포트 443으로 프록시하십시오.
  • EC2 웹 서버 / 프록시 :
    • 포트 80에서 청취하고 HTTPS로 리디렉션하여 응답하십시오.
    • 포트 443에서 수신하고 요청을 처리하십시오.

이를 사용자 정의하려면 CLI 또는을 사용할 수 있습니다 .ebextensions.

AWS Elastic Beanstalk에서 HTTPS 및 HTTP- 리디렉션 활성화 를 확인할 수 있습니다 . Elastic Beanstalk 단일 도커 컨테이너가 HTTPS 및 HTTP (HTTPS로 리디렉션)를 제공하도록 구성하는 방법을 알려줍니다. 필요에 따라 구성을 조정할 수 있습니다.


이봐, 좋은 기사, 나는 이것을 시도하는 과정에 있습니다.
awwester

해당 파일에 인증서를 포함시키지 않는 방법에 대한 아이디어가 있다면 소스 제어에 유지하지 않겠습니까? 우리가로드 한 인증서는 이미 어딘가에 있습니까? 파일 시스템에서 찾을 수없는 것 같습니다
awwester

SSL 인증서 파일을 S3에 넣을 수 있습니다. Elastic Beanstalk가 비공개 S3 객체를 다운로드 할 수 있도록하려면 이것을 읽어보십시오 .
Edward Samuel

ELB SSL 인증서의 경우 AWS 설명서 : Elastic Load Balancing을위한 SSL 인증서를 따를 수 있습니다 . 그런 다음 SSL 인증서 리소스를 arn:aws:iam::123456789012:server-certificate/YourSSLCertificate형식으로 가져올 수 있습니다 .
Edward Samuel

SSL 인증서를 설정했으며 00-로드 밸런서 (실제로는 UI를 통해로드 밸런서 구성을 수행하고 있음)에 들어가는 서버가 있지만 서버에 넣을 위치를 가져올 수없는 것 같습니다 설정 ssl_certificate /opt/ssl/default-ssl.crt;인증서에 대한 정보를 얻을 때, 그것은 "경로"를 제공하지만 단지 "/"입니다
awwester

10

X-Forwarded-ProtoELB에서 설정 한 헤더 를 사용하여로드 밸런서를 건드리지 않고 다소 쉽게 수행 할 수도 있습니다 . 다음은 내가 한 일입니다.

files:
  "/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf":
    mode: "00644"
    owner: root
    group: root
    content: |
      map $http_upgrade $connection_upgrade {
        default        "upgrade";
        ""            "";
      }

      server {
        listen 80;

        gzip on;
        gzip_comp_level 4;
        gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        access_log    /var/log/nginx/access.log;

        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;
        }

        if ($http_x_forwarded_proto = 'http') {
          return 301 https://$host$request_uri;
        }
      }

지금까지 가장 쉬운 솔루션입니다. 충분히 감사 할 수 없습니다!
Chris Martin

그러나 이것은 대부분의 시나리오에서 올바른 방법입니다.
jlegler 2016 년

3

Elastic Beanstalk는 단일 Docker 컨테이너에서 여러 포트를 지원하지 않으므로 제안 된대로 프록시 수준에서이 포트를 처리해야합니다. 그러나로드 밸런서에서 SSL 연결을 종료 할 수 있으므로 EC2 인스턴스는 인증서에 대해 알 필요가 없습니다.

.ebextensions디렉토리에서 두 개의 서버 구성을 포함하는 nginx 프록시 구성을 작성 하십시오 . 프록시 http://docker(기본 구성, 포트 80) 및 https로 리디렉션하는 포트 (포트 8080을 선택).

.ebextensions/01-nginx-proxy.config:

files:
  "/etc/nginx/sites-available/000-default.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      map $http_upgrade $connection_upgrade {
          default        "upgrade";
          ""            "";
      }

      server {
          listen 80;

          gzip on;
          gzip_comp_level 4;
          gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

          access_log    /var/log/nginx/access.log;

          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;
          }
      }

      server {
          listen 8080;

          location / {
              return 301 https://$host$request_uri;
          }
      }

commands:
   00_enable_site:
    command: 'rm -f /etc/nginx/sites-enabled/* && ln -s /etc/nginx/sites-available/000-default.conf /etc/nginx/sites-enabled/000-default.conf'

다음과 같이 설정하는 EB로드 밸런서 및 보안 그룹에 대한 두 번째 구성을 작성하십시오.

  • EC2 인스턴스 :
    • 로드 밸런서에서 포트 80/8080의 트래픽 허용
    • 어디에서나 포트 22의 트래픽 허용 (ssh 액세스, 선택적)
  • 로드 밸런서 :
    • 포트 443 HTTPS를 포트 80 HTTP로 전달
    • 포트 80 HTTP를 포트 8080 HTTP로 전달

.ebextensions/02-load-balancer.config:

"Resources" : {
  "AWSEBSecurityGroup": {
    "Type" : "AWS::EC2::SecurityGroup",
    "Properties" : {
      "GroupDescription" : "Instance security group (22/80/8080 in)",
      "SecurityGroupIngress" : [ {
          "IpProtocol" : "tcp",
          "FromPort" : "80",
          "ToPort" : "80",
          "SourceSecurityGroupId" : { "Ref" : "AWSEBLoadBalancerSecurityGroup" }
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "8080",
          "ToPort" : "8080",
          "SourceSecurityGroupId" : { "Ref" : "AWSEBLoadBalancerSecurityGroup" }
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "22",
          "ToPort" : "22",
          "CidrIp" : "0.0.0.0/0"
        } ]
    }
  },
  "AWSEBLoadBalancerSecurityGroup": {
    "Type" : "AWS::EC2::SecurityGroup",
    "Properties" : {
      "GroupDescription" : "Load balancer security group (80/443 in, 80/8080 out)",
      "VpcId" : "<vpc_id>",
      "SecurityGroupIngress" : [ {
          "IpProtocol" : "tcp",
          "FromPort" : "80",
          "ToPort" : "80",
          "CidrIp" : "0.0.0.0/0"
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "443",
          "ToPort" : "443",
          "CidrIp" : "0.0.0.0/0"
        } ],
      "SecurityGroupEgress": [ {
          "IpProtocol" : "tcp",
          "FromPort" : "80",
          "ToPort" : "80",
          "CidrIp" : "0.0.0.0/0"
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "8080",
          "ToPort" : "8080",
          "CidrIp" : "0.0.0.0/0"
        } ]
    }
  },
  "AWSEBLoadBalancer" : {
    "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
    "Properties" : {
      "Listeners" : [ {
          "LoadBalancerPort" : "80",
          "InstancePort" : "8080",
          "Protocol" : "HTTP"
        }, {
          "LoadBalancerPort" : "443",
          "InstancePort" : "80",
          "Protocol" : "HTTPS",
          "SSLCertificateId" : "arn:aws:iam::<certificate_id>:<certificate_path>"
        } ]
    }
  }
}

(참고 : SSLCertificateId 및 VpcId를 값으로 바꾸는 것을 잊지 마십시오).

로드 밸런서 (HTTP)의 포트 80에있는 모든 트래픽은 EC2 인스턴스에서 포트 8080에 도달하여 HTTPS로 리디렉션됩니다. 로드 밸런서 (HTTPS)의 포트 443에서 트래픽은 도커 프록시 인 EC2 인스턴스의 포트 80에서 제공됩니다.


0

Terraform을 사용하여 ElasticBeanstalk에서 HTTP를 HTTPS로 리디렉션 할 수 있습니다.

방금 추가 리스너 규칙을 추가했습니다.

data "aws_alb_listener" "http" { //Get ARN of Listener on Port-80
  load_balancer_arn = aws_elastic_beanstalk_environment.myapp.load_balancers[0]
  port              = 80
}


resource "aws_alb_listener_rule" "redirect_http_to_https" {
  listener_arn = data.aws_alb_listener.http.arn
  action {
    type = "redirect"
    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
  condition {
    host_header {
      values = ["*.*"]
    }
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.