Elastic Beanstalk에서 https를 강제하는 방법은 무엇입니까?


79

Elastic Beanstalk의 무료 사용 계층에서 https를 강제 할 수없는 것 같습니다.

상태 확인에 실패하지 않고 Amazon Elastic Beanstalk에서 https를 강제하는 방법 에서 다음 제안을 시도했습니다.

이 Apache 재 작성 규칙 사용

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/status$ 
RewriteCond %{REQUEST_URI} !^/version$ 
RewriteCond %{REQUEST_URI} !^/_hostmanager/ 
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

시도하면 http 요청이 내가 원하는대로 https로 리디렉션되지 않습니다. 대신 http 페이지가 정상적으로로드됩니다. 또한 동일한 결과로 X-Forwarded-Port 헤더를 사용하려고 시도했습니다.

다음 재 작성 규칙도 시도했습니다.

RewriteCond %{SERVER_PORT} 80
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

그리고이 규칙은 리디렉션 루프를 발생시킵니다. 따라서 아파치 다시 쓰기 규칙이 Elastic Load Balancer 헤더 X-Forwarded-Port 및 X-Forwarded-Proto를 선택하지 않는 것처럼 보이지만 리디렉션 루프도 제가 원하는 것이 아닙니다.

도와주세요. 저는 AWS, Elastic Beanstalk를 처음 사용하며 Apache 규칙에 익숙하지 않습니다. 여기서 어디로 가야할지 모르겠습니다. 감사.


잠자기 후 다시 쓰기 규칙이 X-Forwarded-Proto 헤더를 감지하는 것으로 보입니다. 이유는 확실하지 않지만 지금은 작동합니다.
— landland

1
인터넷은이 문제에 대한 하나의 완전하고 작동하는 해결책에 동의 할 수없는 것 같습니다. 내 게시물에서 도움을받을 수 있기를 바랍니다 . 마침내이 문제를 해결하기 위해 농구를 뛰어 넘어야했습니다.
— ADTC 2017

누구든지 www를 www가 아닌 ​​RewriteEngine On <If "-n '% {HTTP : X-Forwarded-Proto}'&& % {HTTP : X-Forwarded-Proto}! = 'https'로 리디렉션하도록 어떻게 변경할 수 있는지 알 수 있습니까? "> RewriteRule (. *) https : // % {HTTP_HOST} % {REQUEST_URI} [R, L] </ If>
— Mahendra Garg

답변:


178

이 답변은로드 밸런서 보안 그룹에서 이미 https를 활성화하고 SSL 인증서를로드 밸런서에 추가했으며로드 밸런서에서 포트 80과 443을 모두 전달하고 Route 53을 사용하여 Elastic Beanstalk 환경에서 도메인 이름을 가리켰다 고 가정합니다. (또는 동등한 DNS 서비스).

참고 :이 답변은 Apache를 사용하는 Elastic Beanstalk 환경을위한 것입니다. Docker 기반 배포에서는 작동하지 않을 수 있습니다.

프로젝트 디렉토리 .config에있는 파일.ebextensions 중 하나에 다음을 추가 하기 만하면됩니다 .

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            RewriteEngine On
            <If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
            RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
            </If>

설명

이것은 Elastic Beanstalk 외부에서 적당히 간단합니다. 일반적으로 다음과 같은 Apache 재 작성 규칙을 추가합니다.

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

또는이 경우와 같이로드 밸런서 뒤에있는 경우 :

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

그러나 이러한 구성은 <VirtualHost>블록 내에서만 작동합니다 . RewriteCond를 <If>블록으로 변경하면 블록 외부에서 제대로 작동 <VirtualHost>하여 독립형 Apache 구성 파일에 넣을 수 있습니다. CentOS의 표준 Apache 설정 (ElasticBeanstalk 설정 포함)에는 /etc/httpd/conf.d/*.conf이 파일을 저장하는 파일 경로와 일치 하는 모든 파일 이 포함됩니다.

-n '%{HTTP:X-Forwarded-Proto}'조건 의 일부는로드 밸런서 뒤에 있지 않은 경우 리디렉션을 방지하므로로드 밸런서 및 https가있는 프로덕션 환경과 단일 인스턴스이고 https가없는 스테이징 환경간에 구성을 공유 할 수 있습니다. 모든 환경에서로드 밸런서와 https를 사용하는 경우에는 필요하지 않지만 사용하는 것은 문제가되지 않습니다.

내가 본 나쁜 솔루션

나는이 문제에 대한 많은 나쁜 해결책을 보았고,이 해결책이 왜 필요한지 이해하기 위해 그것들을 살펴볼 가치가 있습니다.

  1. Cloudfront 사용 : 일부 사람들은 Elastic Beanstalk 앞에서 캐시되지 않은 Cloudfront 설정을 사용하여 HTTP에서 HTTPS로 리디렉션 할 것을 제안합니다. 이로 인해 완전히 적절하지 않은 완전히 새로운 서비스 (따라서 복잡성이 추가됨)가 추가됩니다 (Cloudfront는 CDN이며 고유 한 동적 콘텐츠에 HTTPS를 강제하는 데 적합한 도구가 아닙니다). Apache 구성은이 문제에 대한 일반적인 솔루션이며 Elastic Beanstalk는 Apache를 사용하므로 이것이 우리가 가야 할 방식입니다.

  2. SSH를 서버에 연결하고 ... : 이것은 Elastic Beanstalk의 관점과 완전히 반대이며 많은 문제가 있습니다. 자동 확장으로 생성 된 모든 새 인스턴스에는 수정 된 구성이 없습니다. 복제 된 환경에는 구성이 없습니다. 합리적인 환경 변경 세트의 수에 관계없이 구성이 지워집니다. 이것은 정말 나쁜 생각입니다.

  3. Apache 구성을 새 파일로 덮어 쓰기 : 이것은 올바른 솔루션 영역에 들어가지만 Elastic Beanstalk가 서버 설정의 측면을 변경하면 유지 관리에 악몽을 남깁니다 (매우 잘할 수 있음). 또한 다음 항목의 문제를 참조하십시오.

  4. Apache 구성 파일을 동적으로 편집하여 몇 줄을 추가하십시오. 이것은 괜찮은 아이디어입니다. 이 문제는 Elastic Beanstalk가 기본 Apache 구성 파일의 이름을 변경하면 작동하지 않으며 예상치 못한 상황에서이 파일을 덮어 쓸 수 있다는 것입니다. https://forums.aws.amazon.com/thread .jspa? threadID = 163369


3
훌륭한 대답입니다. 이것은 완벽하게 작동했습니다. 아직 내 프로젝트에 .ebextensions 디렉토리가 없었으므로 하나를 만들고 임의로 이름이 지정된 .conf 파일에 구성을 넣었습니다. Elastic Beanstalk 콘솔의 설정에서 일반 포트를 비활성화 상태로 유지할 수 있었는데 이상적으로 보입니다.
— Tyler

4
이것은 환상적인 대답입니다. 정말 페이지의 맨 위에 있어야합니다. @landland이 답변을 수락해야합니다.
— gtd

1
훌륭하고 깨끗한 대답은 나를 위해 원활하게 작동했습니다. R=301영구 리디렉션을 보내기 위해 추가 했습니다.
— LoicAG

1
투표 할 수있는 찬성표가 하나 밖에 없어서 후회합니다. 큰 문제는 AWS 포럼이 이에 대한 잘못된 답을 가지고 있다는 것입니다!
— Cfreak

2
어떤 이유로 이것은 나를 위해 작동하지 않는 것 같습니다. ssl_rewrite.conf파일이 생성됩니다 (확인 eb ssh)하지만 리디렉션이 발생하지 않습니다. : S
— mb21

16

편집 :이 답변을 좋아하지만 이제는 매우 오래되었습니다 . AWS는 이 답변의 일부를 쓸모 없게 만드는 새로운 서비스 (예 : Certificate Manager )를 마련했습니다. 또한 .ebextensionsApache와 함께 폴더를 사용하면 위에서 설명한 것처럼이 리디렉션을보다 깔끔하게 처리 할 수 ​​있습니다.

S3에서 웹 사이트를 호스팅하는 경우이 답변의 일부가 여전히 유용 할 수 있습니다.


이것은 나를 위해 일했습니다.

  1. aws콘솔 명령을 사용하여 AWS에 인증서를 업로드합니다 . 명령 구조는 다음과 같습니다.

    aws iam upload-server-certificate --server-certificate-name CERTIFICATE_NAME --certificate-body "file://PATH_TO_CERTIFICATE.crt" --private-key "file://YOUR_PRIVATE_KEY.pem" --certificate-chain "file://YOUR_CERTIFICATE_CHAIN.ca-bundle" --path /cloudfront/
    
  2. Elastic Beanstalk 애플리케이션에서 구성 -> 네트워크 계층 -> 로드 밸런싱 으로 이동하고 기어 아이콘을 클릭 합니다 .

  3. 보안 리스너 포트 를 443 으로 선택하십시오 . 프로토콜 을 HTTPS 로 선택합니다 . SSL 인증서 ID에 대해 2 단계CERTIFICATE_NAME 에서 선택합니다 . 구성을 저장하십시오.

  4. 콘솔로 이동합니다 . EC2 인스턴스를 클릭합니다 . Load Balancers를 클릭합니다 . 부하 분산기를 클릭합니다. 인스턴스를 클릭 하고 아래로 스크롤하여 해당로드 밸런서에 할당 된 EC2 인스턴스를 확인합니다. EC2 인스턴스의 이름이 애플리케이션 URL과 같거나 가까운 경우로드 밸런서 의 DNS 이름 을 기록해 둡니다. 형식이어야합니다.awseb-e-...

  5. 콘솔로 돌아갑니다 . CloudFront를 클릭 합니다. 배포 만들기를 클릭합니다 . 웹 배포를 선택합니다 .

  6. 배포를 설정합니다. Origin Domain Name 을 5 단계 에서 찾은로드 밸런서 DNS 이름으로 설정합니다 . HTTP를 HTTPS 로 리디렉션 하도록 뷰어 프로토콜 정책 을 설정합니다 . 설정 앞으로 쿼리 문자열 에 예 . 설정 대체 도메인 이름 (CNAME이) 의 URL (들)은 응용 프로그램에 사용할. 2 단계 에서 업로드 한 SSL 인증서 를로 설정 합니다 . 배포판을 만드십시오.CERTIFICATE_NAME

  7. CloudFront에서 배포 이름을 클릭합니다. 클릭 기원을 , 당신의 기원을 클릭하여 선택하고 편집을 . Origin Protocol Policy 가 Match Viewer 인지 확인합니다 . 돌아 가세요. 동작을 클릭 하고 원본을 선택한 다음 편집을 클릭 합니다. Forward Headers 를 Whitelist로 변경 하고 Host를 추가 합니다. 저장.

참고 : 더 긴 가이드도 썼습니다 .


정확히이 작업을 수행했지만 "요청을 충족 할 수 없습니다."라는 메시지가 표시됩니다. "CloudFront에서 오리진에 연결할 수 없습니다.", 호스트 헤더를 화이트리스트에 추가 한 경우에만 해당됩니다. 전달 헤더를 없음으로 설정하면 작동하지만 https로 리디렉션되지 않고 모든 http 요청은 http로 유지됩니다. 이견있는 사람?
— Vlad 2015

@Adam 여기에 전체 elasticbeanstalk.conf 파일을 붙여 넣을 수 있습니까? 아니면 그것의 링크를 줘?
— thekosmix apr

@thekosmix elasticbeanstalk.conf위 가이드의 설정을 재정의하지 않는 한 파일이 실제로 여기에서 작동해서는 안됩니다.
— Adam Link

하지만로드 밸런서 내의 ec2 인스턴스 (그들의 DNS)는 일시적이지 않습니까? 나는 당신이 완전히 결함이있는 솔루션에 대해 너무 많은 찬성표를 가지고 있는지 잘 모르겠습니다.
— themihai

@themihai 실제로는 맞지 않습니다. 솔루션은 EC2 DNS 또는 IP (임시)를 사용하지 않습니다. 가져 오는 DNS URL은 환경에 고정되어 있습니다. EC2 단계는 환경을 CloudFront 배포에 연결하는 6 단계에서 사용할 DNS URL을 가져 오는 것입니다. 위의 솔루션은 이제 1 년이 되었기 때문에 작동하지 않을 수 있지만 게시했을 때 확실히 작동했습니다.
— Adam Link

6

가장 많이 찬성 된 것은 나를 위해 작동하지 않습니다 .. <If> 지시문은 Apache 2.4+에서만 작동하지만 ElasticBeanstalk 에는 버전 2.2.x가 있습니다.

따라서 위와 동일한 조언을 따르십시오. 다음 콘텐츠로 .ebextensions / https_rewrite.config라는 파일을 생성합니다.

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            LoadModule rewrite_module modules/mod_rewrite.so
            RewriteEngine On
            # This will enable the Rewrite capabilities
            RewriteCond %{HTTPS} !=on
            # This checks to make sure the connection is not already HTTPS
            RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

이것은 나를 위해 일하는 것 같습니다.

이 파일을 WAR 파일로 빌드하는 방법에 대해서는이 답변을 참조하십시오.


1
이 답변에 대한 추가 참고 사항 : <if> 블록은 2.4에서 새로 추가되었으며 2.2에서는 작동하지 않으므로 여기에서 볼 수 없습니다.
— fivedogit

EB PHP 솔루션 스택 이제 모든 사용 아파치 2.4+
— 앤디 맥 클러 기지

5

새로운 Application Load Balancer를 사용하면 이제이 작업을 매우 간단하게 수행 할 수 있습니다.

EB 환경을 설정할 때이 중 하나를 설정해야합니다 (내가 믿는 클래식로드 밸런서가 여전히 기본값 임). 일단 환경이 생성되면 유형을 변경할 수 없으므로 다시 생성하십시오.

이 작업이 완료되면 EC2 설정->로드 밸런서로 이동합니다. EB 환경 용으로 생성 한로드 밸런서를 클릭합니다. 이 작업을 수행하기 전에 HTTPS 리스너를 설정했는지 확인해야하므로 SSL 인증서를 사용하여 HTTPS 443에서 수신하고 80에서 HTTP를 사용하여 트래픽을 인스턴스로 전달해야합니다.

그런 다음 HTTP를 수신하는 새 리스너를 추가하고 "Redirect to :"기본 작업을 추가합니다. HTTPS를 프로토콜로, 443을 포트로, "Original host, path, query"를 옵션으로, 마지막으로 301을 HTTP 응답 코드로 설정했는지 확인하십시오.

이 리스너가 추가되면 HTTPS 및 HTTP 연결을 모두 허용하도록 EC2로드 밸런서 보안 그룹을 업데이트하십시오. 리스너에 작은 경고 기호가 표시되어이를 상기시켜줍니다!

크리스


고마워, 내 www. 경로이지만 네이 키드 도메인은 아닙니다. 그 이유에 대한 제안이 있습니까?
— Chris

4

편집 : Zags 솔루션 이 더 일반적이고 정확합니다. 내 것보다 권장합니다 (python env에만 해당)

다음은 wsgi.conf를 해킹하거나 CloudFront를 사용하지 않는 깨끗하고 빠른 솔루션입니다.

.ebextensions / some_file.config에서 :

# Redirect HTTP to HTTPS
  "/etc/httpd/conf.d/https_redirect.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      <Directory /opt/python/current/app/>
      RewriteEngine on
      RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
      RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
      </Directory>

너무 쉬운 것 같지만 잘 작동하는 것 같습니다.

또한 "HTTPS가 아님"대신 HTTP를 명시 적으로 리디렉션하고 있습니다.


그래서 하나의 EBS 환경에서이 작업을 수행했습니다. /etc/httpd/conf.d/https_redirect.conf가 존재하며 https로 리디렉션됩니다. 문제는 두 번째 환경에서 발생하며 정확히 동일한 방식으로 설정되며 /etc/httpd/conf.d/https_redirect.conf 파일이 없습니다. 어떤 아이디어?
— Nitzan Wilnai

@NitzanWilnai이 /etc/httpd/conf.d/https_redirect.conf존재하지 않아도,보고 대답
— 아나톨리 바실리 예프

1
/etc/httpd/conf.d에 파일을 추가하는 것은 좋은 생각이었습니다. 이것은 일반적인 솔루션 ( stackoverflow.com/a/38751749/2800876 )에 도달하는 데 도움이되었습니다
— Zags

4

2018 년에로드 밸런서로 Elastic Beantalk를 리디렉션하려고합니다. 위의 답변 중 어느 것도 내 환경에서 작동하지 않습니다. 내가 말한 몇 가지 문제 :

  1. 가장 많이 투표 한 답변을 시도했지만 내 바람둥이는 버전 2.7입니다. 지원하지 않습니다.

  2. container_commands를 사용하고 00_applications 설정을 복사했습니다. AWS는이를 무시합니다.

그래서 마침내 https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat-proxy.html 을 읽고 작동했습니다.

내가하는 일은 다음과 같습니다.

폴더 구조를 다시 만들었습니다.

.ebextensions 
 - httpd
  -conf.d
   -ssl.conf

그리고 이것은 ssl.conf의 내용입니다.

<VirtualHost *:80>
  RewriteEngine on
  RewriteCond %{HTTP:X-Forwarded-Proto} =http
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  <Proxy *>
    Order Allow,Deny
    Allow from all
  </Proxy>
  ProxyPass / http://localhost:8080/ retry=0
  ProxyPassReverse / http://localhost:8080/
  ProxyPreserveHost on

  ErrorLog /var/log/httpd/elasticbeanstalk-error_log
</VirtualHost>

이것이 도움이되기를 바랍니다.


https로 리디렉션되지만 서버를 찾을 수 없다고 표시됩니다. 나는 스프링 MVC 웹 응용 프로그램 사용하고
— ponraj

이것을 nginx: [emerg] unknown directive "<VirtualHost" 추가 한 후 EB 로그에가 있습니다. 이 행동을 본 다른 사람이 있습니까?
— Fabian


3

위의 답변 중 어느 것도 나를 위해 일하지 않았지만 일부는 나를 위해 일한 답변을 알아내는 데 도움이되었습니다. 또한 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat에 도움이 된 아래 URL을 발견했습니다. -platform.html

2 개의 파일 httpd.conf 00_application.conf를 변경하기 위해 위의 URL에서 언급 한 파일 구조를 만들었습니다.

인스턴스에서 전체 httpd.conf를 복사하여 위 링크에 언급 된 폴더 구조 아래의 .ebextention 아래 코드에 넣습니다. 그런 다음 프로젝트의 해당 파일에 아래 줄을 추가하십시오.

LoadModule rewrite_module modules/mod_rewrite.so

00_application.conf에 대해 동일한 작업을 수행하고 인스턴스에서 복사하여 httpd / conf.d / elasticbeanstalk / 00_application.conf 아래의 .ebextention 아래에있는 코드베이스에 배치합니다. 이제이 파일을 편집하고 VirtualHost 사이에 아래를 추가합니다.

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

이제 코드를 배포하면 작동합니다.


2

Elastic Beantalk에서는 AWS가 해당 구성을 덮어 쓰도록 구성을 추가하기 만하면 웹 서버 구성을 덮어 쓰고 자신의 구성을 제출할 수 있습니다.

경로 아래에 다음 파일을 추가하기 만하면됩니다. .ebextensions \ httpd \ conf.d

파일 내용 :

<VirtualHost *:80>
   LoadModule rewrite_module modules/mod_rewrite.so

   RewriteEngine On
   RewriteCond %{HTTP:X-Forwarded-Proto} !https
   RewriteCond %{HTTP_USER_AGENT} !ELB-HealthChecker
   RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

   <Proxy *>
     Order deny,allow
     Allow from all
   </Proxy>

   ProxyPass / http://localhost:8080/ retry=0
   ProxyPassReverse / http://localhost:8080/
   ProxyPreserveHost on

   ErrorLog /var/log/httpd/elasticbeanstalk-error_log

</VirtualHost>

'.ebextensions'는 AWS의 표준 구성 폴더이고 나머지는 덮어 쓰려는 파일과 폴더를 가리 킵니다. 파일이나 폴더가 존재하지 않으면 간단하게 만드십시오.


2

나는 이것을 알아내는 데 어려움을 겪었으므로 해결책 을 찾은 후 다른 사람을 돕기 위해 해결책 에 대한 자세한 설명을 작성했습니다 . 이는 Tomcat 8, Apache2 및 Spring Boot 앱에만 해당됩니다. AWS 랩 github 에는 정말 유용한 ebextension 예제가 있습니다 .

나를 위해 일한 요약 :

  1. /src/main/webapp/.ebextensions/httpd/conf.d/elasticbeanstalk.conf에 파일을 생성합니다.
  2. "LoadModule rewrite_module modules / mod_rewrite.so"를 포함하도록주의하면서 재 작성 조건 / 규칙을 추가합니다.
  3. AWS EBS에 배포

다음은 Spring Boot 앱 의 예 입니다.


1

Elastic Beantalk에 대한 다음 구성이 있습니다 (Tomcat 8 Java 8을 실행하는 64 비트 Amazon Linux 2016.09 v2.3.1). .ebextensions 디렉터리를 만들고 다시 쓰기 조건이있는 .config YAML 파일을 추가했습니다.

위에서 설명한 Zagas 솔루션 (매우 복잡함)은 저에게 적합하지 않습니다.

  1. "If"조건을 알 수 없기 때문에
  2. Apache 2.2 때문에 httpd.conf 파일에 mod_rewrite.so가 포함되어 있지 않습니다.

이 솔루션 은 나에게 더 의미가 있지만 작동하지 않습니다. 아무 일도 일어나지 않고 "conf.d"디렉토리에서 "ssl_rewrite.conf"파일을 볼 수 없습니다.

세 번째로 시도한 해결책은 ".ebextendsion"디렉토리에 "run.config"및 "ssl_rewrite.conf"파일을 추가하는 것이 었습니다.

run_config 포함

container_commands:
copy-config:
command: "cp .ebextensions/ssl_rewrite.conf /etc/httpd/conf.d"

ssl_rewrite.conf는 다음을 포함합니다.

LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

ssl_rewrite.conf는 "conf.d"디렉토리 아래에 생성되지만 http에서 https 로의 리디렉션이 작동하지 않습니다.

저에게 유일한 해결책은 "/etc/httpd/conf.d/elasticbeanstalk/00_application.conf"에 다음 줄을 추가하는 것입니다.

<VirtualHost *:80>
......
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
......
</VirtualHost>

그러나 이것은 임시 해결책이며 시스템이 교체되면 내 https 리디렉션이 사라집니다.


"머신이 교체되면 내 https 리디렉션이 사라졌습니다." ELB가 새 인스턴스에 응용 프로그램을 배포 할 때 자동으로 파일을 작성하기 위해 Zags의 답변에 표시된 것과 동일한 트릭을 사용할 수 있다고 생각합니다. 기본적으로 아래에 파일 경로, 아래 files:에 파일 내용을 제공 content: |하고 적절한 모드, 소유자 및 그룹을 설정하십시오. 그러면 ELB가 자동으로 파일을 생성합니다.
— ADTC 2011

이 파일을 현재 인스턴스에 직접 쓰는 대신 응용 프로그램의 일부로 배포하기 위해 위의 방법을 사용했습니다. SSH를 통해 파일이 있는지 확인했습니다. 그러나 내 설정이 귀하의 설정과 매우 가까웠음에도 불구하고 작동하지 않았습니다. Tomcat 8 Java 8을 실행하는 64 비트 Amazon Linux 2016.03 v2.1.1 하지만 파일은 원래 전혀 존재하지 않았습니다. 새로 생성되었습니다. . /etc/httpd/conf.d/elasticbeanstalk.conf대신 편집해야합니까 ?
— ADTC 2011

1

누군가가 여전히 어려움을 겪고있는 경우를 대비하여 :

얼마 동안 어려움을 겪었고 마침내 모든 AWS 구성이 포함 된 GitHub (AWS 팀에서 제공)를 찾았으며 아래 예제는 Apache 2.2 용 HTTP> HTTPS 리디렉션에서 작동합니다. (Apache 2.4 및 Nginx에 대한 구성은 아래 링크를 참조하십시오).

Apache 2.2

  1. 앱의 루트 디렉토리에 파일을 생성합니다. YOUR_PROJECT_ROOT / .ebextensions / httpd / conf.d / elasticbeanstalk.conf (IntelliJ / Java를 사용하는 경우 최종 .WAR 아티팩트에 추가되었는지 확인하십시오)

  2. 가상 호스트에서 리디렉션을 활성화하려면 다음 줄을 추가하십시오.

    <VirtualHost *:80>
        LoadModule rewrite_module modules/mod_rewrite.so
        RewriteEngine On
        RewriteCond %{HTTP:X-Forwarded-Proto} !https
        RewriteCond %{HTTP_USER_AGENT} !ELB-HealthChecker
        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    
        <Proxy *>
            Order deny,allow
            Allow from all
        </Proxy>
    
        ProxyPass / http://localhost:8080/ retry=0
        ProxyPassReverse / http://localhost:8080/
        ProxyPreserveHost on
    
        ErrorLog /var/log/httpd/elasticbeanstalk-error_log
    </VirtualHost>
    

Apache 2.4 및 Nginx에 대한 더 많은 예제를 보려면 다음 GitHub 저장소를 방문하십시오.

https://github.com/awsdocs/elastic-beanstalk-samples/tree/master/configuration-files/aws-provided/security-configuration/https-redirect/java-tomcat

또한 더 많은 유용한 구성과 예제를 사용할 수 있습니다.

문안 인사


1

환경 변수를 통해 HTTPS 활성화

Elastic Beanstalk에도 있지만로드 밸런서를 사용하지 않는 (따라서 인증서를 직접 할당 할 수없는) 개발 및 스테이징 환경이 아닌 프로덕션 환경에만 HTTPS를 적용해야했습니다.

환경 변수를 사용합니다 USE_HTTPS. 로 설정된 ssl_rewrite.conf경우에만 파일을 복사합니다 .USE_HTTPStrue

.ebextensions / files / ssl_rewrite.conf

RewriteEngine On
<If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</If>

.ebextensions / https.config

files:
  "/home/ec2-user/https_setup.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash

      echo "USE_HTTPS env var: ${USE_HTTPS,,}"
      outfile=/etc/httpd/conf.d/ssl_rewrite.conf
      if [ "${USE_HTTPS,,}" == "true" ]; then
        echo "Configure SSL rewrite"
        cp .ebextensions/files/ssl_rewrite.conf $outfile
        chmod 644 $outfile
        chown root:root $outfile
      else
        [ -f $outfile ] && rm $outfile
        echo "Do not use SSL"
        exit 0
      fi

container_commands:
  01_https_setup:
    command: "/home/ec2-user/https_setup.sh"

을 변경하는 경우 USE_HTTPS변경 사항을 적용하려면 애플리케이션을 다시 배포해야합니다. 원하는 경우 파일 에서 echo명령을 제거 할 수도 있습니다 https.config.


1

AWS에는 이에 대한 몇 가지 설명서 도 있습니다 .

애플리케이션로드 밸런서를 사용하는 경우 파일 http-to-https.config을 .ebextensions폴더에 추가 한 후 다음 구성을 추가합니다 ( https 인증서의 ARN을 입력하는 것을 잊지 마십시오 ).

참고 : EB 콘솔을 통해 포트 443에 리스너를 아직 추가하지 않았는지 확인하십시오. 그렇게 한 경우 .config 파일을 추가하기 전에 리스너를 삭제하십시오.

Resources:
  AWSEBV2LoadBalancerListener:
    Type: 'AWS::ElasticLoadBalancingV2::Listener'
    Properties:
      DefaultActions:
        - Type: redirect
          RedirectConfig:
            Protocol: HTTPS
            Port: '443'
            Host: '#{host}'
            Path: '/#{path}'
            Query: '#{query}'
            StatusCode: HTTP_301
      LoadBalancerArn:
        Ref: AWSEBV2LoadBalancer
      Port: 80
      Protocol: HTTP
  AWSEBV2LoadBalancerListenerHTTPS:
    Type: 'AWS::ElasticLoadBalancingV2::Listener'
    Properties:
      Certificates:
        - CertificateArn: Replace with Certificate ARN
      DefaultActions:
        - Type: forward
          TargetGroupArn:
            Ref: AWSEBV2LoadBalancerTargetGroup
      LoadBalancerArn:
        Ref: AWSEBV2LoadBalancer
      Port: 443
      Protocol: HTTPS 

이를 위해 LB를 사용하는 이점은 구성이 nginx, apache 등과 같이 사용하는 서버에 대해 무관하다는 것입니다.


1

여기 에서 도움이 될 답변을 찾았습니다 .

내가 한 것은 애플리케이션로드 밸런서 기본 프로세스 /index.php대신 상태 확인 경로 를 만드는 것뿐이었습니다 /.


0

.htaccess 파일을 루트 폴더에 넣지 않는 이유는 무엇입니까? 이렇게하면 간단히 테스트하고 디버깅 할 수 있습니다. .zip에 포함하면 자동으로 모든 인스턴스에 다시 배포됩니다.

간단히 사용 .htaccess:

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

0

가장 많이 득표 한 답변은 이제 조금 오래되었습니다. A Paul의 대답은 실제로 정답입니다. 그의 답변에 제공된 링크는 AWS에서 제공 한 것입니다 (따라서 Elastic Beanstalk에서 애플리케이션을 실행할 때 HTTP에서 HTTPS로 리디렉션하도록 Apache 구성을 재정의하는 것이 권장되는 방법입니다).

주목해야 할 매우 중요한 한 가지가 있습니다. 둘 이상의 웹앱을 배포하는 경우 웹앱 중 하나에 .ebextensions 폴더를 추가하면 작동하지 않습니다. 지정한 구성 중 Non가 작성 또는 생성되고 있음을 알 수 있습니다. Elastic Beanstalk 환경에 여러 웹 앱을 배포하는 경우 AWS에서이 문서를 읽어야합니다. Java Tomcat 합니다. Elastic Beanstalk에 여러 WAR 파일 배포

일반적으로 WAR 파일을 배포하기 위해 eb 명령을 실행하기 전에 다음 구조가 필요합니다.

MyApplication.zip
├── .ebextensions
├── foo.war
├── bar.war
└── ROOT.war

.ebextentions 폴더가 각 WAR 파일에있는 경우 완전히 무시되고 구성 변경이 수행되지 않음을 알 수 있습니다.

이것이 다른 사람에게 도움이되기를 바랍니다.


0

우리는 X-Forwarded-Proto제대로 처리하여 백엔드에서 문제를 해결했습니다 .

이것은 Grails 설정이지만 아이디어에 도움이 될 것입니다.

    grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
    grails.plugin.springsecurity.portMapper.httpPort = 80
    grails.plugin.springsecurity.portMapper.httpsPort = 443
    grails.plugin.springsecurity.secureChannel.secureHeaderName = 'X-Forwarded-Proto'
    grails.plugin.springsecurity.secureChannel.secureHeaderValue = 'http'
    grails.plugin.springsecurity.secureChannel.insecureHeaderName = 'X-Forwarded-Proto'
    grails.plugin.springsecurity.secureChannel.insecureHeaderValue = 'https'
    grails.plugin.springsecurity.secureChannel.definition = [
        [pattern: '/**', access: 'REQUIRES_SECURE_CHANNEL']
    ]

0

이 질문에 대한 또 다른 두 가지 답변을 확장하려면 https://stackoverflow.com/a/43026082/8775205 , https://stackoverflow.com/a/42035023/8775205 . ELB를 사용하여 AWS에 서비스를 배포하고 단계별 가이드가 필요한 스프링 부트 사용자의 경우 프로젝트의 src / main / webapp / .ebextensions / httpd / conf.d / 아래에 ****. conf 파일을 추가 할 수 있습니다. .

src
--main
----java
----resources
----webapps
------.ebextensions
--------httpd
----------confd
------------****.conf

****. conf는 다음과 같습니다. 단일 인스턴스가있는 테스트 사이트가 있으므로 제외 조건을 추가합니다.

<VirtualHost *:80>
   LoadModule rewrite_module modules/mod_rewrite.so

   RewriteEngine On
   RewriteCond %{HTTP:X-Forwarded-Proto} !https
   RewriteCond %{HTTP_USER_AGENT} !ELB-HealthChecker 
   RewriteCond %{HTTP_HOST} !testexample.com #excludes test site
   RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

   <Proxy *>
     Order deny,allow
     Allow from all
   </Proxy>

   ProxyPass / http://localhost:8080/ retry=0
   ProxyPassReverse / http://localhost:8080/
   ProxyPreserveHost on

   ErrorLog /var/log/httpd/elasticbeanstalk-error_log

</VirtualHost>

그런 다음 위의 구성을 선택하려면 pom.xml의 maven-war-plugin 아래에 "리소스"를 추가해야합니다.

<plugin>
     <groupId>org.apache.maven.plugins</groupId>  
     <artifactId>maven-war-plugin</artifactId>  
     <configuration>  
         <webResources>
             <resource>  
               <!-- some other resource configured by yourself-->
             </resource> 
             <resource>
                <directory>src/main/webapps/.ebextensions</directory>
                 <targetPath>.ebextensions</targetPath>
                 <filtering>true</filtering>
             </resource> 
         </webResources>  
     </configuration>  
     <version>2.1.1</version>
 </plugin>

마지막으로 코드를 커밋하고 푸시하고, AWS codebuild 및 codepipeline이 리포지토리에서 코드를 가져와 beanstalk 환경에 배포 할 때까지 기다리거나 단순히 프로젝트를 war 파일에 압축하여 AWS beanstalk 환경에 업로드합니다.


0

AWS는 헤더에 unserscore (_)를 허용하지 않지만 (-)를 사용할 수 있으므로 헤더 변수에서 밑줄을 제거합니다. 예 : -header_var_val = "some value" 를 headervarval = "some value" 로 바꿉니다 . 그것은 나를 위해 작동합니다.


-4

로드 밸런싱 된 환경을 사용하는 경우 AWS Elastic Beanstalk 환경에 대한 HTTPS 구성 지침을 따를 수 있습니다. 마지막에 HTTP 포트를 비활성화 할 수 있습니다.

현재 AWS 프리 티어 에는 EC2 마이크로 인스턴스와 동일한 ELB (Elastic Load Balancing) 시간이 포함되어 있습니다.


7
이렇게하면 HTTPS 만 활성화하고 적용하지는 않습니다. 적용은 모든 HTTP 요청을 HTTPS로 자동 리디렉션하는 것을 의미합니다.
— Bastian Venthur 2015

-4

이것은 쉬운 해결책입니다

  1. EC2 인스턴스에 ssh
  2. /etc/httpd/conf.d/wsgi.conf의 내용을 응용 프로그램의 기본 폴더에있는 wsgi.conf라는 로컬 파일에 복사합니다.
  3. wsgi.conf의 로컬 버전을 편집하고 <VirtualHost> </ VirtualHost> 태그 내에 다음 리디렉션 규칙을 추가합니다.

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
    
  4. "/ status" 를 상태 확인으로 사용중인 페이지로 변경 하십시오. 페이지 하십시오.

  5. 파일 저장
  6. .conf 파일 내에서 <app> .conf 파일을 편집하십시오.  이 버전의 wsgi.conf를 Amazon 버전 위에 복사하는 컨테이너 명령을 추가하는 ebextensions 디렉터리

    container_commands:
    01_syncdb:
      command: "django-admin.py syncdb --noinput" leader_only: true
    02_collectstatic:
      command: "django-admin.py collectstatic --noinput"
    03_wsgireplace:
      command: 'cp wsgi.conf ../wsgi.conf'
    ...
    
  7. 코드를 배포합니다.

  8. /etc/httd/conf.d/wsgi.conf에 배포 된 wsg.conf 버전에는 이제 필요한 리디렉션 규칙이 포함됩니다.

작동해야하며 파일은 각 배포에 대해 올바르게 업데이트됩니다. 주의해야 할 유일한 사항은 Amazon이 향후 기본 wsgi.conf 파일 내용을 변경하면 복사본이 더 이상 작동하지 않을 수 있다는 것입니다.

Autor의 rickchristianson


2
자신의 답변의 정확한 중복 : stackoverflow.com/questions/6858492/… . 중복 답변 게시 중지!
— Paresh Mayani 2014

같은 대답으로 문제를 해결할 수 있습니다.) 스팸 ??
— gusgard

3
로드 밸런서 뒤의 인스턴스로 ssh-ing하고 조정하면 Elastic Beanstalk의 목적이 무효화됩니다. 확장하고 더 많은 인스턴스를 얻으면 어떻게됩니까? 그들 모두에게 이것을하나요? 수동으로?
— fivedogit

1
@fivedogit 자세히 읽어 보면 그가 인스턴스에 SSH-ing하여 조정하지 않았 음을 알 수 있습니다. 그는 SSH 만 파일을 읽고 복사합니다. 그 후, 그는 .ebextensionsElastic Beanstalk 자체를 통해 올바르게 조정하기 위해 배포에 사용하고 있으므로 목적을 달성하지 않습니다.
— ADTC 2011
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.