Невозможно настроить межаккаунтную связь между AWS Lambda и AWS Kafka (кластер MSK)
У меня есть конечная цель - запустить AWS Lambda из тем Kafka, где Kafka - это кластер MSK, работающий в другой учетной записи AWS.
Настраивать.Кластеры Lambda и MSK находятся в разных аккаунтах AWS. Каждый из них подключен к своему собственному VPC, то есть подсети (частной через NAT GW), и защищен брандмауэром группой безопасности (я сделал их все - позволяющими ради эксперимента)
Непосредственная проблема.Я не могу использовать «триггер MSK» для лямбда-выражения, потому что он требует указания ARN для кластера MSK, но это невозможно, поскольку этот кластер MSK находится в другой учетной записи и на него нельзя ссылаться в контексте лямбда-триггера.
Проблема, которую я пытаюсь решить.Я пытаюсь использовать «триггер Kafka», для которого требуется спецификация сервера начальной загрузки (он у меня есть), название темы (у меня есть), размер пакета и начальная позиция (не проблема). Проблема во второй группе опций, которая позволяет аутентифицировать лямбда-триггер перед кластером MSK. Это может быть 1) настройка на основе сети в форме комбинации VPC/Subnet/SecurityGroup кластера MSK, 2) настройка на основе секретов в форме конфигурации SASL/xxx.
Первый вариант, то есть настройка на основе сети, не может быть использован, поскольку для него требуется VPC и другие параметры из кластера Kafka, то есть подсети и группы безопасности, которые недоступны в учетной записи, где настраивается Lambda.
Последнее требует указания одного из методов SASL, то есть PLAIN, SCRAM512 и SCRAM256 в паре со ссылкой на запись SecretManager, в которой хранится комбинация имени пользователя и пароля. Я выбрал этот метод как единственный (на мой взгляд) теоретически возможный для межаккаунтного общения.
Что я сделал:
- В учетной записи Lambda я создал запись в SecretManager с двумя ключами:
username
а такжеpassword
и некоторые конкретные значения - В учетной записи Kafka я включил аутентификацию SASL / SCRAM для кластера MSK. Это потребовало настройки записи в SecretManager, что я и сделал. Я использовал те же учетные данные, что и в секрете на Лямбда-аккаунте. После этого я вижу 3 варианта загрузочного сервера:
<hostname>:9092
(простой текст),<hostname>:9094
(TLS) и<hostname>:9096
(SASL/SCRAM). - Я использовал спецификации сервера начальной загрузки (с портом 9096) в настройке триггера kafka для моей лямбда-функции.
- Чтобы предоставить возможность подключения между учетными записями между подсетями Lambda и Kafka, я настраиваю коннектор VPC Peering с соответствующими правилами в таблицах маршрутизации.
- Я проверил связь между этими подсетями, запустив EC2 в подсети Lambda, и попытался
nmap -Pn -p 9092,9094,9096 <bootstrap server hostname>
чтобы получить следующий ответ:
PORT STATE SERVICE
9092/tcp open unknown
9094/tcp open unknown
9096/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds
Итоги.Независимо от того, что я пробую с точки зрения другой комбинации сервера / порта начальной загрузки и метода SASL, я получаю эту ошибку на стороне триггера Lambda: ПРОБЛЕМА: ошибка подключения. Проверьте конфигурацию подключения к источнику событий
Я не могу найти способ отладки этого сценария ошибки, поскольку другие подробности не предоставлены. Включение CloudWatch в кластере MSK не помогло, поскольку оно не собирает никакой полезной информации.
2 ответа
Не ответ, а скорее архитектурная идея, которая может привести к ответу.
Я заставил это работать через триггер msk на лямбде, но я в той же лодке. Разная учетная запись для msk kafka и lambda.
Мой план: создать службу опроса (пример: приложение Elastic beanstalk nodejs) в той же учетной записи. В теме обновления вызовите шлюз API, чтобы активировать лямбда-выражение в другой учетной записи для обработки. Это будет ваш триггерный центр.
Возможно, мы могли бы запустить лямбду напрямую в другой учетной записи, но создание API позволит упростить тестирование.
Просто убедитесь, что вы добавили подписанный JWT к вызову и используете лямбда-авторизатор для проверки того, кто делает вызов.
Я полностью забросил эту тему, но на самом деле у меня есть решение. Он не такой всеобъемлющий, как хотелось бы, но он работает в нашей производственной установке.
Хитрость заключалась в том, чтобы обе учетные записи могли взаимодействовать через соответствующую настройку однорангового соединения VPC (для каждой учетной записи), а затем использовать сетевую настройку для аутентификации лямбда-триггера, но вместо использования групп безопасности и подсетей MSK мы хотим использовать эти лямбда. Это заставляет триггер «kafka» на стороне Lambda иметь возможность обращаться к загрузочным серверам через VPC самой Lambda.
Недостатком этого метода является то, что он работает только для обычного текстового соединения. Скорее всего, он будет работать с зашифрованным трафиком, но я не пробовал, поскольку мы полагаемся на изолированный характер этих VPC.