AWS beanstalk PrivateLink не подключается

У меня следующая установка

  • Один VPC
  • 2 общедоступные подсети в 2 AZ (содержащие приложение AWS Beanstalk с предоставлением API)
  • 2 частные подсети в 2 AZ (содержащие лямбда-функцию)
  • 1 Интерфейс конечной точки VPC для эластичного beanstalk (имя сервиса com.amazonaws.us-east-2.elasticbeanstalk)

Вместо создания шлюза NAT для моей лямбда-функции, чтобы иметь возможность доступа к API-интерфейсу приложения AWS Beanstalk через Интернет, я хочу создать конечную точку VPC, чтобы иметь доступ к aws beanstalk во внутренней сети AWS из моей лямбда-функции.

В общедоступной подсети есть группы безопасности, которые разрешают веб-трафик (порт 80/443).

Конечная точка VPC связана с частными подсетями, а ее группы безопасности разрешают трафик веб-трафика (порт 80/443).

Лямбда-функция также связана с частными подсетями, а ее группы безопасности разрешают трафик веб-трафика (порт 80/443).

Разрешение DNS и имена хостов DNS включены на уровне VPC.

Я скопировал имя DNS конечной точки, чтобы сформировать URL-адрес, который вызывается лямбда-функцией, и я получаю тайм-аут

Даже после того, как я испробовал все вышеперечисленные шаги, AWS Lambda не может получить доступ к API-интерфейсу приложения beanstalk.

Упрощенная лямбда-функция:

      def lambda_handler(event, context):
    
    http = urllib3.PoolManager()
    r = http.request('GET', 'http://vpce-**********.elasticbeanstalk.us-east-2.vpce.amazonaws.com/')
    print(r.data)
    
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

Приложение Elasticbeanstalk доступно в Интернете по адресу http://sample-app-dev.******.us-east-2.elasticbeanstalk.com/

Что мне здесь не хватает?

1 ответ

Решение

Если я правильно понимаю, вам удалось создать конечную точку VPC, которая позволит вам получить доступ к сервису AWS Elastic Beanstalk (где вы можете выполнять администрирование своих экземпляров EB). Вы не раскрывали само приложение, развернутое с помощью Elastic Beanstalk.

Я говорю это, потому что для того, чтобы открыть ваше EB-приложение из VPC, сначала вам нужно создать Endpoint Service, который подключается к Network Load Balancer. Приложение EB необходимо зарегистрировать в качестве целевого объекта для этого балансировщика нагрузки (что легко, если у вас есть балансировщик нагрузки приложения для EB). Это даст вам и имя службы, из которого вы можете создать конечную точку в другом VPC (потребительском VPC), где вы можете найти службу по имени:

Если вы нашли свою службу, вы можете разместить конечную точку в своем клиентском VPC, к которому вы сможете подключиться.

Тем не менее, если оба ваших VPC находятся в одной учетной записи AWS, предоставление доступа к сервису через PrivateLink может быть излишним. Вероятно, будет достаточно пиринга VPC .

Обновление - краткое руководство по настройке PrivateLink:

  1. Создайте балансировщик сетевой нагрузки в VPC, в котором развернуто ваше EB-приложение. Вам будет предложено создать целевую группу, поэтому откройте ссылку, чтобы создать ее.

  2. Для целевых групп для балансировщика нагрузки создайте новую и выберите Application Load Balancer.

  1. Зарегистрируйте балансировщик нагрузки из приложения EB в целевой группе.

  1. Убедитесь, что вы выбрали целевую группу, созданную ранее для балансировщика сетевой нагрузки.

  1. Подождите, пока не подготовится балансировщик нагрузки. Это должно быть в active штат.

  1. Перейти к VPC -> and create a new (PrivateLink). You will have to give the name of the load balancer here:

  1. Grab the Endpoint Service name:

  1. Go to and search for the endpoint name:

  1. Attach a security group for the which allows HTTP/HTTPS inbound traffic from the VPC:

  1. Create the Endpoints:

It might require acceptance, so go back to the Endpoint Service and accept the request.

This should also go from pending to available.

  1. At this point you should be able to access the EB application using the DNS from the Endpoint.
Другие вопросы по тегам