이 답변은로드 밸런서 보안 그룹에서 이미 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