AWS - Lambda не может получить доступ к ElasticTranscoder

У меня есть инфраструктура, состоящая из следующих сервисов в VPC (кроме S3 и Transcoder, очевидно):

  • EC2 (веб-сервер)
  • RDS (база данных)
  • Лямбда-функция с Node.js
  • S3
  • Эластичный транскодер

Сценарий следующий:

  1. пользователь загружает видео в корзину S3 напрямую
  2. загрузка запускает лямбда-функцию, которая создает новое задание в эластичном транскодере (с использованием AWS SDK) и обновляет строку ресурса в базе данных (RDS).

Проблема в том, что, поскольку RDS не является общедоступным, лямбда должна находиться в том же VPC, что и RDS, чтобы разрешить подключения к нему. Это также приводит к общей потере интернет-соединения в лямбда-функции, что означает, что он не может получить доступ к эластичному транскодеру (поскольку он вне VPC с точки зрения VPC). Теперь у меня была аналогичная проблема с S3, но это было довольно легко решить, добавив конечную точку к VPC, которая указывает на S3, однако такой опции нет для Elastic Transcoder (или любой другой службы на самом деле).

Я не хочу создавать NAT-шлюз, так как это довольно дорого для такой ерунды.

Итак, простой вопрос: как я могу решить, что Lambda может одновременно взаимодействовать с RDS и Elastic Transcoder?

P.S .: Лямбда-роль содержит политику, которая имеет доступ к *Job эластичного транскодера.


person Gergely Kőrössy    schedule 17.04.2017    source источник


Ответы (1)


Один из вариантов, который сработал для меня, заключался в разделении моей функции на 2:

  • 1-я функция вне VPC, имеет доступ к общедоступному Интернету и, следовательно, к Elastic Transcoder и S3 (в вашем случае)

  • Вторая функция имеет доступ к VPC и выполняет исключительно то, что необходимо для получения ресурсов VPC.

Итак, дело в том, что 1-я функция вызовет 2-ю функцию, используя aws-sdk, чтобы получить что-то от VPC без создания шлюза NAT!

P.S. Создание большого количества функций внутри VPC может вызвать неожиданные сюрпризы производительности. Вот немного больше о Lambda + VPC.

person Vlad Holubiev    schedule 17.04.2017
comment
Какая политика необходима для вызова 1-й функции из 2-й? Сначала я попробовал сделать наоборот, но мне показалось, что это не сработает (или мне не хватало политики, но она просто истекла, так что, полагаю, отсутствие Интернета было настоящей (и единственной?) Проблемой). - person Gergely Kőrössy; 18.04.2017
comment
@ GergelyKőrössy единственное, что вам нужно в политике: Action: lambda:InvokeFunction на Resource: ['arn:aws:lambda:REGION:ACC_ID:function:FUNCTION_NAME'] - person Vlad Holubiev; 18.04.2017
comment
Отлично работает со 2-м = ›1-м направлением. Пробовал наоборот, но он просто истек, так что, похоже, вызов функции не может происходить из VPC. - person Gergely Kőrössy; 18.04.2017
comment
Правильно ... потому что для вызова функции нужен доступ в Интернет. Логика здесь обратная - функция снаружи может вызывать вторую функцию внутри, а не наоборот. Используйте шлюз NAT или экземпляр NAT. - person Michael - sqlbot; 18.04.2017
comment
Ответ был обновлен, чтобы отразить приведенные выше комментарии. - person Josh Bernfeld; 26.04.2018