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

  7. CloudFront에서 배포 이름을 클릭합니다. 클릭 기원을 , 당신의 기원을 클릭하여 선택하고 편집을 . Origin Protocol PolicyMatch Viewer 인지 확인합니다 . 돌아 가세요. 동작을 클릭 하고 원본을 선택한 다음 편집을 클릭 합니다. Forward HeadersWhitelist로 변경 하고 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.