Назад | Перейти на главную страницу

Балансировщик сетевой нагрузки на кластер Fargate / ECS - как сопоставить несколько портов / целевых групп одной службе?

Вот моя установка:

Запись псевдонима 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, и я до сих пор не понимаю, почему ...