Балансировщик сетевой нагрузки в 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;
    }
}
Другие вопросы по тегам