Как интегрировать API Gateway с внутренним ALB

Согласно https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-private.html можно интегрировать API-шлюз с внутренним балансировщиком нагрузки приложений, используя частную ссылку VPC.

Однако я не могу заставить его работать.

У меня есть услуга, доступная изнутри через ALB. У ALB нет общедоступного IP-адреса, он балансирует запросы в кластере AWS Fargate (все в частных подсетях).

      ubuntu@ip-10-0-40-89:~$ curl http://internal-sasw-alb-355535611.eu-west-1.elb.amazonaws.com/health
Assembly=Sasw.SampleService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, Environment=Production, CurrentTime=05/05/2021 08:36:00

так что все в порядке внутри, и у меня есть свои услуги для GET http://alb_url/health

Я хочу получить доступ к той же службе, только на этот раз через API-шлюз. Итак, я делаю следующее:

  1. Я создаю ссылку VPC типа HTTP API, связанную с VPC и, в частности, с 3 частными подсетями, в которых находятся экземпляры EC2 (кластер Fargate). 10.0.40.0/24, 10.0.50.0/24, 10.0.60.0/24
  2. Создаю API-шлюз типа HTTP API foo.
  3. Я добавляю интеграцию HTTP для метода ЛЮБОЙ и конечной точки URL http://internal-rubiko-alb-355535611.eu-west-1.elb.amazonaws.com (Я также пробовал с http://internal-rubiko-alb-355535611.eu-west-1.elb.amazonaws.com/{proxy} и с http://internal-rubiko-alb-355535611.eu-west-1.elb.amazonaws.com/{proxy+} безуспешно)
  4. Я оставляю маршрут в соответствии с предложенным методом ЛЮБОЙ, ресурсный путь /%7Bproxy%7D и цель интеграции ANY http://internal-rubiko-alb-355535611.eu-west-1.elb.amazonaws.com/{proxy}
  5. Я оставляю сценический псевдоним $default и автоматическое развертывание
  6. Создавать. Он дает мне URL-адрес вызова

Получить на https://7ki6gvrngl.execute-api.eu-west-1.amazonaws.com дает мне 404. ПОЛУЧИТЕ https://7ki6gvrngl.execute-api.eu-west-1.amazonaws.com/health дает мне 404 A GET on https://7ki6gvrngl.execute-api.eu-west-1.amazonaws.com/$default/health дает мне 404

Что я делаю неправильно? Это проблема маршрутизации? Моя группа безопасности принимает любой протокол из любого места. Так и мой NACL. Моя таблица маршрутизации для общедоступных подсетей:

      Destination   Target                Status   Propagated
10.0.0.0/16   local                 active   No 
0.0.0.0/0     igw-08d3973e93dd580cc active   No

Для частных

      Destination  Target                 Status   Propagated
10.0.0.0/16  local                  active   No 
0.0.0.0/0    nat-040aa996d0fb1a623  active   No

Спасибо за вашу помощь.


ОБНОВЛЕНИЕ 1 (2021-05-05) Я настраивал журнал потоков на VPC, много трассировок для всех задействованных сетевых интерфейсов, но я не могу найти там ничего значимого. Они выглядят так:

      2 754027052283 eni-06b3871889a039d54 10.0.50.60 10.0.30.69 47472 80 6 5 399 1620233998 1620233999 ACCEPT OK
2 754027052283 eni-06b3871889a039d54 10.0.30.69 10.0.50.60 80 47472 6 5 582 1620233998 1620233999 ACCEPT OK
2 754027052283 eni-06b3871889a039d54 172.245.79.11 10.0.30.69 25610 23 6 1 40 1620233998 1620233999 ACCEPT OK
2 754027052283 eni-06b3871889a039d54 10.0.30.69 172.245.79.11 23 25610 6 1 40 1620233998 1620233999 ACCEPT OK
2 754027052283 eni-0ec2ff9b148264fc1 - - - - - - - 1620233999 1620234010 - NODATA
2 754027052283 eni-0c2d904cc281e7772 185.153.199.146 10.0.10.108 58226 10089 6 1 40 1620234001 1620234061 REJECT OK
2 754027052283 eni-0c2d904cc281e7772 92.63.197.95 10.0.10.108 55424 8820 6 1 40 1620234001 1620234061 REJECT OK
2 754027052283 eni-0c2d904cc281e7772 147.203.255.20 10.0.10.108 59414 161 17 1 71 1620234001 1620234061 REJECT OK
2 754027052283 eni-0c2d904cc281e7772 107.174.25.146 10.0.10.108 1406 23 6 1 40 1620234001 1620234061 REJECT OK
2 754027052283 eni-0c2d904cc281e7772 45.146.164.93 10.0.10.108 52329 3835 6 1 40 1620234001 1620234061 REJECT OK
2 754027052283 eni-0c2d904cc281e7772 192.241.159.103 10.0.10.108 38868 8088 6 1 40 1620234001 1620234061 REJECT OK
2 754027052283 eni-0c2d904cc281e7772 162.142.125.145 10.0.10.108 43260 49501 6 1 44 1620234001 1620234061 REJECT OK
2 754027052283 eni-0c2d904cc281e7772 104.206.128.38 10.0.10.108 57766 5985 6 1 44 1620234001 1620234061 REJECT OK
2 754027052283 eni-0c2d904cc281e7772 198.98.54.148 10.0.10.108 54300 8443 6 1 44 1620234001 1620234061 REJECT OK
2 754027052283 eni-0c2d904cc281e7772 162.142.125.146 10.0.10.108 33318 15006 6 1 44 1620234001 1620234061 REJECT OK
2 754027052283 eni-02884e94ae95359e6 10.0.60.101 10.0.30.69 37440 80 6 5 399 1620234003 1620234005 ACCEPT OK
2 754027052283 eni-02884e94ae95359e6 10.0.30.69 10.0.60.101 80 37440 6 5 582 1620234003 1620234005 ACCEPT OK
2 754027052283 eni-05b8087c636058aad 10.0.50.218 10.0.40.89 57566 1113 6 66 4862 1620234008 1620234127 ACCEPT OK
2 754027052283 eni-05b8087c636058aad 10.0.40.89 10.0.60.197 1113 38912 6 122 7664 1620234008 1620234127 ACCEPT OK
2 754027052283 eni-05b8087c636058aad 10.0.40.89 10.0.50.218 1113 57566 6 131 8230 1620234008 1620234127 ACCEPT OK
2 754027052283 eni-05b8087c636058aad 10.0.60.197 10.0.40.89 38912 1113 6 62 4544 1620234008 1620234127 ACCEPT OK
2 754027052283 eni-05b8087c636058aad 10.0.40.89 10.0.50.218 52812 2113 6 271 70540 1620234008 1620234307 ACCEPT OK
2 754027052283 eni-05b8087c636058aad 10.0.40.89 10.0.60.197 2113 34170 6 161 41607 1620234008 1620234307 ACCEPT OK
2 754027052283 eni-05b8087c636058aad 10.0.60.197 10.0.40.89 2113 42962 6 158 44927 1620234008 1620234307 ACCEPT OK
2 754027052283 eni-05b8087c636058aad 10.0.40.89 10.0.50.218 2113 49902 6 165 43038 1620234008 1620234307 ACCEPT OK
2 754027052283 eni-05b8087c636058aad 10.0.50.218 10.0.40.89 2113 52812 6 163 43127 1620234008 1620234307 ACCEPT OK
2 754027052283 eni-05b8087c636058aad 10.0.60.197 10.0.40.89 34170 2113 6 263 68432 1620234008 1620234307 ACCEPT OK
2 754027052283 eni-05b8087c636058aad 10.0.40.89 10.0.60.197 42962 2113 6 281 73877 1620234008 1620234307 ACCEPT OK
2 754027052283 eni-05b8087c636058aad 10.0.50.218 10.0.40.89 49902 2113 6 270 70422 1620234008 1620234307 ACCEPT OK
2 754027052283 eni-06b3871889a039d54 10.0.30.69 10.0.50.60 80 47482 6 5 582 1620234010 1620234011 ACCEPT OK
2 754027052283 eni-06b3871889a039d54 10.0.50.60 10.0.30.69 47482 80 6 5 399 1620234010 1620234011 ACCEPT OK
2 754027052283 eni-0ae20fdd844224248 - - - - - - - 1620234012 1620234033 - NODATA
2 754027052283 eni-0ae20fdd844224248 - - - - - - - 1620234013 1620234026 - NODATA
2 754027052283 eni-030c3f3c47db36cb1 216.218.206.88 10.0.10.175 39712 30005 6 1 40 1620234014 1620234015 ACCEPT OK
2 754027052283 eni-030c3f3c47db36cb1 193.107.216.163 10.0.10.175 5065 5060 17 1 451 1620234015 1620234016 ACCEPT OK
2 754027052283 eni-0795bf1958db33aa7 - - - - - - - 1620234015 1620234032 - NODATA
2 754027052283 eni-0ae20fdd844224248 - - - - - - - 1620234016 1620234033 - NODATA
2 754027052283 eni-0ec2ff9b148264fc1 - - - - - - - 1620234017 1620234031 - NODATA

Я даже не знаю, как их интерпретировать.

Я попытался создать частную ссылку, API-шлюз и частный ALB с облачной информацией. Тоже не повезло. Я продолжаю получать не обнаруженный при доступе к URL-адресам службы через шлюз Api

      AWSTemplateFormatVersion: 2010-09-09
Description: API Gateway
Parameters:
  prefix:
    Type: String
    Description: The prefix namespace or company name
    Default: sasw
Resources:
  apiGateway:
    Type: AWS::ApiGatewayV2::Api
    Properties:
      Name: !Sub ${prefix}-api-gateway
      Description: Api Gateway for http
      ProtocolType: HTTP
  apiRoute:
    Type: AWS::ApiGatewayV2::Route
    Properties:
      ApiId: !Ref apiGateway
      RouteKey: ANY /
      Target: !Join
        - /
        - - integrations
          - !Ref apiAlbIntegration
  privateLink:
    Type: AWS::ApiGatewayV2::VpcLink
    Properties:
      Name: !Sub ${prefix}-private-link
      SecurityGroupIds:
        - Fn::ImportValue: !Sub ${prefix}-web-sg-id
      SubnetIds:
        - Fn::ImportValue: !Sub ${prefix}-private-a-id
        - Fn::ImportValue: !Sub ${prefix}-private-b-id
        - Fn::ImportValue: !Sub ${prefix}-private-c-id
  apiAlbIntegration:
    Type: AWS::ApiGatewayV2::Integration
    Properties:
      ApiId: !Ref apiGateway
      Description: Private ALB integration
      IntegrationType: HTTP_PROXY
      IntegrationMethod: ANY
      ConnectionType: VPC_LINK
      ConnectionId: !Ref privateLink
      IntegrationUri: 
        Fn::ImportValue: !Sub ${prefix}-alb-http-listener-id
      PayloadFormatVersion: 1.0
  apiStage:
    Type: AWS::ApiGatewayV2::Stage
    Properties:
      StageName: $default
      AutoDeploy: true
      ApiId: !Ref apiGateway
Outputs:
  apiUrl:
    Description: Invoke URL
    Value: !Sub https://${apiGateway}.execute-api.${AWS::Region}.amazonaws.com/

Идеи заканчиваются.

1 ответ

У меня все заработало. Определенно можно использовать API Gateway http, интегрированный с частным (т.е. внутренним) ALB, который балансирует трафик в частных подсетях.

Проблема, с которой я столкнулся, заключалась в том, что когда я создавал API в API Gateway через консоль, есть возможность добавить интеграцию, но эта интеграция в этот момент разрешает только HTTP или Lambda, и я не хочу этого, я хочу частный интеграция с использованием заранее созданного канала VPC.

Итак, вот шаги:

  1. Создайте (если еще не существует) группу безопасности, которая разрешает HTTP-трафик на 80. Эта группа будет связана позже со ссылкой VPC.
  2. Создайте ссылку VPC, связанную с VPC и, явно, с частными подсетями, где находятся EC2services или кластер Fargate. Убедитесь, что вы выбрали группу безопасности, которая разрешает HTTP-трафик.
  3. Создайте HTTP API в Apu Gateway. На первом этапе дайте ему имя, но пока НЕ ​​создавайте интеграцию. Пропустите это. Также пропустите создание маршрута. Выберите сценическое имя или оставьте (я использую $default и автоматическое развертывание).
  4. Проложите маршрут. Если вы хотите что-либо принять, сделайте это, выбрав ANY и путь /{proxy+}.
  5. Наконец, к этому маршруту прикрепите интеграцию. На этот раз вы увидите, что есть возможность выбрать частный ресурс, где вы можете явно выбрать частный ALB с его http-прослушивателем И ссылкой VPC, созданной ранее.

Вот и все. Запросы Http к шлюзу Api будут направлены на частный внутренний ALB.

Другие вопросы по тегам