AWS Elastic Beanstalkを介してデプロイしているサイトでHTTPSを強制する際に問題が発生します。
EmberJSを使用したフロントエンドアプリケーションです。私は、httpトラフィックをhttpsにリダイレクトする方法を理解しようとして、何日もぐるぐる回っています。 EC2マシンでAmazon Linux AMIを使用しています。
HTTPSを強制するのはElastic Beanstalk内ではないという結論に達しました(まだこれが正しいかどうかはわかりません)。 Elastic BeanstalkロードバランサーでHTTPとHTTPSの両方を許可し、サーバーにリダイレクトしようとしています。
ここで問題が発生しています。 mod_rewrite
ヘッダーに基づいたX-Forwarded-Proto
なしの書き換えルールに関する多くの回答を見つけていますが、そのファイルは、検索でEC2マシンに存在しません。
また、.ebextensions
ディレクトリ内に構成ファイルを作成しようとしましたが、それも機能しませんでした。
私がしようとしている主なことは、httpアドレスをヒットしようとすると、ユーザーをhttpsに誘導することです。ポインタや提案は大歓迎です、ありがとう!
編集:64ビットのDebian jessie v1.4.1を使用していますPython 3.4(Preconfigured-Docker)
環境によって構成が異なるため、使用するElastic Beanstalk環境を指定する必要があると思います(参照: Supported Platforms )。
基本的に、カスタマイズする必要があります:
カスタマイズするには、CLIまたは.ebextensions
を使用できます。
AWS Elastic BeanstalkでHTTPSおよびHTTPリダイレクトを有効にする で確認できます。 Elastic BeanstalkシングルDockerコンテナがHTTPSとHTTPを提供するように構成する方法を説明します(HTTPSにリダイレクトします)。必要に応じて設定を調整できます。
また、X-Forwarded-Proto
ヘッダーはELBによって設定されます。これが私がやったことです:
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;
}
}
Elastic Beanstalkは、単一のDockerコンテナーからの複数のポートをサポートしていないため、提案されているように、プロキシレベルでこれを処理する必要があります。ただし、ロードバランサーでSSL接続を終了できるため、EC2インスタンスは証明書について知る必要はありません。
あなたの.ebextensions
ディレクトリ、2つのサーバー構成を含む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ロードバランサーとセキュリティグループの2番目の構成を作成し、次のように設定します。
.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上のトラフィックは、HTTPSにリダイレクトされるEC2インスタンスのポート8080にヒットします。ロードバランサー(HTTPS)のポート443のトラフィックは、最終的にはdockerプロキシであるEC2インスタンスのポート80によって処理されます。
Iamは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 = ["*.*"]
}
}
}