Вот моя установка:
Запись псевдонима Route53 -> Балансировщик сетевой нагрузки -> Кластер Fargate / ECS
Контейнеры в кластере имеют собственные сертификаты TLS и открытые порты 80 и 443. HTTP-сервер в контейнере отправляет перенаправление 302 на порт 443, если вы обращаетесь к порту 80, поэтому пользователям не нужно вводить полный URL-адрес https.
Все работает нормально, ЗА ИСКЛЮЧЕНИЕМ я не могу найти способ, чтобы NLB перенаправлял более одного порта.
В описании службы ECS вы можете сопоставить свою службу целевым группам ELB, но вы можете указать только одно сопоставление для каждой службы (LoadBalancers
является типом списка, но допускает только одну запись) и должен включать порт, то есть:
EcsService:
Type: AWS::ECS::Service
Properties:
Cluster: !Ref EcsCluster
DeploymentConfiguration:
MaximumPercent: 100
MinimumHealthyPercent: 0
ServiceName: ecs-service
LaunchType: FARGATE
LoadBalancers:
- ContainerName: !Ref ContainerName
ContainerPort: 443
TargetGroupArn: !Ref TargetGroup
DesiredCount: 1
TaskDefinition: !Ref TaskDefinition
NetworkConfiguration:
AwsvpcConfiguration:
AssignPublicIp: ENABLED
SecurityGroups:
- !Ref SecurityGroup
Subnets:
- !Ref Subnet
Я подумал о том, чтобы сделать сопоставление другим способом, то есть указать цели в TargetGroup
определение, но в документации указано, что для ip
target вы должны указать IP-адрес в качестве цели (а не ссылку на службу) - поэтому, когда контейнеры удаляются и добавляются, кажется, что это тоже не сработает.
Я что-то упустил? Я стараюсь избегать использования ALB для этого.
Итак, отвечая на мой собственный вопрос - это невозможно напрямую с NLB. Однако мое решение было довольно простым.
Я создал второе определение службы и задачи в том же кластере ECS, состоящее из очень легкого контейнера (nginx-alpine), который просто отвечает на порт 80 перенаправлением 301 на порт 443.
Слушатель для порта 80 указывает на TargetGroup, сопоставленную с этой второй службой, поэтому HTTP-запрос на порт 80 немедленно перенаправляется на https-версию того же запроса, который переходит к прослушивателю для порта 443, который указывает на собственно приложение.
Он работает очень хорошо и использует минимум ресурсов.
Nginx.conf:
events {}
http {
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
}
Могу я спросить, почему ты пытаешься избегать использования ALB? Он идеально подходит для веб-сервисов, может выполнить завершение SSL за вас, поддерживает несколько портов, вы можете добавить аутентификацию через Cognito и т. д. Есть ли что-то, что ALB не может сделать для вас в вашей настройке?
Люди IMO злоупотребляют NLB, и я до сих пор не понимаю, почему ...