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 규칙에 익숙하지 않습니다. 여기서 어디로 가야할지 모르겠습니다. 감사.
답변
이 답변은로드 밸런서 보안 그룹에서 이미 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를 사용하는 경우에는 필요하지 않지만 사용하는 것은 문제가되지 않습니다.
내가 본 나쁜 솔루션
나는이 문제에 대한 많은 나쁜 해결책을 보았고,이 해결책이 왜 필요한지 이해하기 위해 그것들을 살펴볼 가치가 있습니다.
-
Cloudfront 사용 : 일부 사람들은 Elastic Beanstalk 앞에서 캐시되지 않은 Cloudfront 설정을 사용하여 HTTP에서 HTTPS로 리디렉션 할 것을 제안합니다. 이로 인해 완전히 적절하지 않은 완전히 새로운 서비스 (따라서 복잡성이 추가됨)가 추가됩니다 (Cloudfront는 CDN이며 고유 한 동적 콘텐츠에 HTTPS를 강제하는 데 적합한 도구가 아닙니다). Apache 구성은이 문제에 대한 일반적인 솔루션이며 Elastic Beanstalk는 Apache를 사용하므로 이것이 우리가 가야 할 방식입니다.
-
SSH를 서버에 연결하고 … : 이것은 Elastic Beanstalk의 관점과 완전히 반대이며 많은 문제가 있습니다. 자동 확장으로 생성 된 모든 새 인스턴스에는 수정 된 구성이 없습니다. 복제 된 환경에는 구성이 없습니다. 합리적인 환경 변경 세트의 수에 관계없이 구성이 지워집니다. 이것은 정말 나쁜 생각입니다.
-
Apache 구성을 새 파일로 덮어 쓰기 : 이것은 올바른 솔루션 영역에 들어가지만 Elastic Beanstalk가 서버 설정의 측면을 변경하면 유지 관리에 악몽을 남깁니다 (매우 잘할 수 있음). 또한 다음 항목의 문제를 참조하십시오.
-
Apache 구성 파일을 동적으로 편집하여 몇 줄을 추가하십시오. 이것은 괜찮은 아이디어입니다. 이 문제는 Elastic Beanstalk가 기본 Apache 구성 파일의 이름을 변경하면 작동하지 않으며 예상치 못한 상황에서이 파일을 덮어 쓸 수 있다는 것입니다. https://forums.aws.amazon.com/thread .jspa? threadID = 163369
답변
편집 :이 답변을 좋아하지만 이제는 매우 오래되었습니다 . AWS는 이 답변의 일부를 쓸모 없게 만드는 새로운 서비스 (예 : Certificate Manager )를 마련했습니다. 또한
.ebextensions
Apache와 함께 폴더를 사용하면 위에서 설명한 것처럼이 리디렉션을보다 깔끔하게 처리 할 수 있습니다.
S3에서 웹 사이트를 호스팅하는 경우이 답변의 일부가 여전히 유용 할 수 있습니다.
이것은 나를 위해 일했습니다.
-
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/
-
Elastic Beanstalk 애플리케이션에서 구성 -> 네트워크 계층 -> 로드 밸런싱 으로 이동하고 기어 아이콘을 클릭 합니다 .
-
보안 리스너 포트 를 443 으로 선택하십시오 . 프로토콜 을 HTTPS 로 선택합니다 . SSL 인증서 ID에 대해 2 단계
CERTIFICATE_NAME
에서 선택합니다 . 구성을 저장하십시오. -
콘솔로 이동합니다 . EC2 인스턴스를 클릭합니다 . Load Balancers를 클릭합니다 . 부하 분산기를 클릭합니다. 인스턴스를 클릭 하고 아래로 스크롤하여 해당로드 밸런서에 할당 된 EC2 인스턴스를 확인합니다. EC2 인스턴스의 이름이 애플리케이션 URL과 같거나 가까운 경우로드 밸런서 의 DNS 이름 을 기록해 둡니다. 형식이어야합니다.
awseb-e-...
-
콘솔로 돌아갑니다 . CloudFront를 클릭 합니다. 배포 만들기를 클릭합니다 . 웹 배포를 선택합니다 .
-
배포를 설정합니다. Origin Domain Name 을 5 단계 에서 찾은로드 밸런서 DNS 이름으로 설정합니다 . HTTP를 HTTPS 로 리디렉션 하도록 뷰어 프로토콜 정책 을 설정합니다 . 설정 앞으로 쿼리 문자열 에 예 . 설정 대체 도메인 이름 (CNAME이) 의 URL (들)은 응용 프로그램에 사용할. 2 단계 에서 업로드 한 SSL 인증서 를로 설정 합니다 . 배포판을 만드십시오.
CERTIFICATE_NAME
-
CloudFront에서 배포 이름을 클릭합니다. 클릭 기원을 , 당신의 기원을 클릭하여 선택하고 편집을 . Origin Protocol Policy 가 Match Viewer 인지 확인합니다 . 돌아 가세요. 동작을 클릭 하고 원본을 선택한 다음 편집을 클릭 합니다. Forward Headers 를 Whitelist로 변경 하고 Host를 추가 합니다. 저장.
참고 : 더 긴 가이드도 썼습니다 .
답변
가장 많이 찬성 된 것은 나를 위해 작동하지 않습니다 .. <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 파일로 빌드하는 방법에 대해서는이 답변을 참조하십시오.
답변
새로운 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로드 밸런서 보안 그룹을 업데이트하십시오. 리스너에 작은 경고 기호가 표시되어이를 상기시켜줍니다!
크리스
답변
편집 : 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를 명시 적으로 리디렉션하고 있습니다.
답변
2018 년에로드 밸런서로 Elastic Beantalk를 리디렉션하려고합니다. 위의 답변 중 어느 것도 내 환경에서 작동하지 않습니다. 내가 말한 몇 가지 문제 :
-
가장 많이 투표 한 답변을 시도했지만 내 바람둥이는 버전 2.7입니다. 지원하지 않습니다.
-
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>
이것이 도움이되기를 바랍니다.
답변
다음 명령으로 나를 위해 작동합니다.
RewriteCond %{HTTP:X-Forwarded-Port} !=443
https 확인없이 :
RewriteCond %{HTTP:X-Forwarded-Proto} !https
ELB가 X-Forwarded-Proto의 값을 http로 변경하는 것 같습니다 (TCP 프로토콜에서도).