it-swarm.com.ru

Amazon API Gateway перед кластером ELB и ECS

Я пытаюсь поставить Amazon API Gateway перед балансировщиком нагрузки приложений, который балансирует трафик к моему кластеру ECS, где развернуты все мои микросервисы. Мотивация использования API-шлюза состоит в том, чтобы использовать собственный авторизатор с помощью лямбда-функции.

Системная диаграмма

 enter image description here

В словах Amazon ( https://aws.Amazon.com/api-gateway/faqs/ ): "Запросы прокси для внутренних операций также должны быть общедоступны в Интернете". Это заставляет меня сделать ELB общедоступным (выходящим в Интернет) вместо внутреннего. Затем мне нужен способ убедиться, что only шлюз API может получить доступ к ELB вне VPC.

Моей первой идеей было использование сертификата клиента в API Gatway, но ELB, похоже, не поддерживает его.

Любые идеи будут высоко оценены!

15
Ricardo García Martín

Похоже, что это огромный недостаток технологии шлюза API, учитывая то, как она проталкивается. Невозможность подключиться к внутреннему серверу в VPC серьезно ограничивает его полезность в качестве входной двери для аутентификации для доступа в Интернет . FWIW, в Azure API Management поддерживает это "из коробки" - он может принимать запросы от Интернет и звонки прямо в вашу виртуальную сеть, которая в противном случае отключена брандмауэром .. Единственный способ, которым это возможно в AWS, - это использование Lambdas, что добавляет значительный уровень сложности, особенно. если вам нужно поддерживать различные двоичные протоколы.

7
Dylan Nicholson
4
Dylan Nicholson

В настоящее время API-шлюз нельзя ставить перед частным ELB, поэтому вы правы, что он должен быть ориентирован на интернет. Лучший обходной путь для вашего случая, который я могу придумать, - это перевести ELB в режим сквозной передачи TCP и завершить сертификат клиента на ваших конечных хостах за ELB. 

1
Vitalii Budkevych

Мы решили использовать заголовок, чтобы убедиться, что весь трафик проходит через API Gateway. Мы сохраняем секрет в переменных среды наших приложений и сообщаем шлюзу API вводить его при создании API. Затем проверьте этот ключ в нашем приложении.

Вот что мы делаем для этого:

В нашем базовом контроллере мы проверяем ключ (у нас есть только REST API за шлюзом):

string ApiGatewayPassthroughHeader = context.HttpContext.Request.Headers["ApiGatewayPassthroughHeader"];

if (ApiGatewayPassthroughHeader != Environment.GetEnvironmentVariable("ApiGatewayPassthroughHeader"))
{
    throw new error;
}

В нашем файле swagger (мы используем swagger.json в качестве источника наших API)

"x-Amazon-apigateway-integration": {
    "type": "http_proxy",
    "uri": "https://${stageVariables.url}/path/to/resource",
    "httpMethod": "post",
    "requestParameters": {
      "integration.request.header.ApiGatewayPassthroughHeader": "${ApiGatewayPassthroughHeader}"
    }
  },

В нашем файле docker compose (мы используем docker, но то же самое можно использовать в любом файле настроек)

services:
  example:
      environment:
        - ApiGatewayPassthroughHeader=9708cc2d-2d42-example-8526-4586b1bcc74d

Во время сборки мы берем секрет из нашего файла настроек и заменяем его в файле swagger.json. Таким образом, мы можем повернуть ключ в нашем файле настроек, и шлюз API обновится, чтобы использовать ключ, который ищет приложение.

1
Cale

Это возможно, если вы используете VPC Link и Network Load Balancer.

Пожалуйста, посмотрите на это сообщение: https://adrianhesketh.com/2017/12/15/aws-api-gateway-to-ecs-via-vpc-link/

TL; DR

  1. Создайте внутренний балансировщик сетевой нагрузки, подключенный к целевой группе (Экземпляры в VPC)
  2. В консоли API Gateway создайте ссылку VPC и свяжите ее с вышеуказанным NLB.
  3. Создайте конечную точку шлюза API, выберите «Интеграция каналов VPC» и укажите внутренний URL-адрес NLB в качестве «URL-адреса конечной точки».

Надеюсь, это поможет!

0
user7455457

Теперь можно добавить авторизатор непосредственно в Application Load Balancer (ALB) перед ECS.

Это можно настроить прямо в правилах слушателя. Смотрите этот блог для деталей:

https://aws.Amazon.com/de/blogs/aws/built-in-authentication-in-alb/

0
Erik P