Elastic Beanstalk не підтримує декілька портів з одного контейнера Docker, тому вам потрібно обробити це на рівні проксі, як пропонується. Однак вашому екземпляру EC2 не потрібно знати про ваш сертифікат, оскільки ви можете розірвати з'єднання SSL на балансирі навантаження.
У своєму .ebextensions
каталозі створіть конфігурацію для проксі-сервера 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'
Створіть другу конфігурацію для балансира навантаження та груп безпеки, яка встановлює їх наступним чином:
- Екземпляр EC2 :
- Дозволити рух через порти 80/8080 від балансира навантаження
- Дозволити трафік на порт 22 з будь-якого місця (для доступу ssh, необов’язково)
- Балансир завантаження :
- Порт пересилання 443 HTTPS на порт 80 HTTP
- Переадресаційний порт 80 HTTP на порт 8080 HTTP
.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 вашими значеннями).
Будь-який трафік на порт 80 балансира навантаження (HTTP) буде потрапляти на порт 8080 на екземплярі EC2, який перенаправляє на HTTPS. Трафік на порт 443 балансира навантаження (HTTPS) в кінцевому підсумку обслуговується портом 80 в екземплярі EC2, який є проксі-докером.