Балансировщик сетевой нагрузки в Fargate/ECS Cluster - как сопоставить несколько портов / целевых групп одному сервису?
Вот моя установка:
Route53 Alias Record -> Балансировщик сетевой нагрузки -> Fargate/ECS Cluster
Контейнеры в кластере имеют свои собственные сертификаты 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
цели Вы должны указать IP-адрес в качестве цели (не ссылку на службу) - поэтому, когда контейнеры удаляются и добавляются, кажется, что это тоже не удастся.
Я что-то здесь упускаю? Я пытаюсь избежать использования ALB для достижения этой цели.
2 ответа
Могу я спросить, почему вы пытаетесь избежать использования ALB? Он идеально подходит для веб-сервисов, может выполнять SSL-терминацию для вас, поддерживает несколько портов, вы можете добавить аутентификацию через Cognito и т. Д. Есть ли что-то, что ALB не может сделать для вас в ваших настройках?
ИМО люди злоупотребляют NLB, и я до сих пор не понимаю, почему...
Поэтому, чтобы ответить на мой собственный вопрос - это невозможно напрямую с 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;
}
}