Вызов AWS Lambda из-за проблемы с разрешениями хранимой процедуры Aurora RDS

Я создал несколько Lambdas в AWS и Aurora RDS (общедоступный). Я не мог выполнить лямбды (через call mysql.lambda_async).

Когда я попробовал это, я получил ошибку ERROR 1873: 1873: Lambda API returned error: Missing Credentials: Cannot instantiate Lambda Client.

Я попытался подключить роль IAM под названием aurora-lambdas, где я установил полный доступ к RDS и Lambdas и доверительные отношения между этими службами, но после попытки различных конфигураций я все еще получаю проблему.

Кто-нибудь успешно выполнил AWS Lambda из RDS? Спасибо :)


person lu1s    schedule 20.06.2017    source источник
comment
Роль IAM должна быть привязана к конкретному кластеру Aurora, который вызывает эту функцию (в консоли RDS, а не в консоли IAM). Вы это сделали?   -  person Michael - sqlbot    schedule 21.06.2017
comment
Я решил проблему, добавив ARN роли IAM в конфигурацию группы параметров RDS DB Cluseter. Я добавил ARN к ключу aws_default_lambda_role .   -  person lu1s    schedule 21.06.2017


Ответы (6)


Ключ параметра aws_default_lambda_role должен иметь полный путь значения ARN роли, которая присоединена к кластеру Aurora и имеет связанную с ней правильную политику доступа лямбда.

Во-первых, включите IAM DB Authentication Enabled, что означает, что учетными данными пользователей вашей базы данных можно управлять с помощью пользователей и ролей AWS IAM.

Шаги по созданию политики, созданию роли, присоединению политики к роли, привязке роли к кластеру Aurora следующие.

1. Создайте политику IAM для доступа к ресурсам AWS Lambda.

2. Создайте роль IAM, чтобы разрешить Amazon Aurora доступ к сервисам AWS с прикрепленной политикой.

3. Свяжите роль IAM с кластером БД MySQL Amazon Aurora, который должен использовать Lambda.

4. Задайте ключ параметра уровня кластера для связанного сервиса AWS равным ARN для связанной роли IAM. Используйте шаг 10 из веб-ссылки 3, указанной выше. Шаг 10 описывает aws_default_s3_role, но нам просто нужно найти aws_default_lambda_role.

5. Перейдите на Панель управления RDS

6. Нажмите Группы параметров.

7. Нажмите Создать группу параметров.

Шаги 5, 6, 7 на картинке.

8. Выберите Семейство групп параметров aurora5.6.

9. Выберите Тип DB Cluster Parameter Group.

10. Введите в текстовое поле нужную конфигурацию Имя группы как someName56.

11. Создайте, а затем Изменить параметры.

12. Найдите имя параметра aws_default_lambda_role и введите ARN для роли IAM, созданной на шаге 4 выше. Шаг 12 с aws_default_lambda_role

Краткое объяснение

Важно помнить, что из-за задействованных уровней абстракции пользователи, роли и политики IAM разделяются. Политику можно привязать к пользователю или роли. но не может быть связан сам по себе с запущенными экземплярами, такими как EC2 или RDS. Чтобы присоединить S3 или Lambda доступ к коду, написанному на вашем локальном компьютере, необходимо использовать пользователя IAM с соответствующей политикой. Чтобы подключить доступ к внутренним сервисам Amazon, необходимо назначить роль IAM, например, разрешить RDS Aurora Cluster DB запускать Lambda с помощью CALL MySQL.lambda_async Процедуры. Экземпляр RDS выполняет роль запуска лямбда-функции, поскольку он является внутренним для AWS, поэтому ему должна быть назначена роль IAM. Идея состоит в том, чтобы предоставить минимальный доступ, если не требуется больше, и как изменить файлы конфигурации, не имея прямого доступа к виртуальной машине RDS. Следовательно, значения группы параметров необходимо изменить, чтобы внести некоторые изменения в конфигурацию программного обеспечения БД без прямого подключения к виртуальной машине. Он разработан, чтобы быть проще, чем традиционный метод использования SSH или программного обеспечения для прямого подключения. Это также обеспечивает большую подотчетность, поскольку уровень абстракции, то есть консоль AWS, может отслеживать активность пользователей, чтобы определить, какой пользователь / сервис инициировал действие Lambda, чтобы помочь выявить проблемы.

Примечание

Я не эксперт, поэтому, пожалуйста, исправьте мое объяснение, так как я не совсем разбираюсь в AWS, поэтому я мог допустить ошибки в своих действиях или объяснении. Но это то, что я сделал, чтобы решить мою конкретную проблему.

РЕДАКТИРОВАТЬ: (минуты после публикации)

Моя конкретная проблема:

Когда я сделал прямой вызов в SQL, он дал мне следующий вывод об ошибке, который привел меня к описанным мною шагам для решения проблемы.

mysql> CALL mysql.lambda_async('arn:aws:lambda:us-region-1:02020202020:function:FuncSomeNameLambdaFunc', CONCAT('{ "subject" : "', 'subject contents', '", "message" : "', 'Message Contents', '" }') );

ERROR 1873 (HY000): Lambda API returned error: Missing designated IAM role (aws_default_lambda_role)

person Paresh471    schedule 14.12.2017
comment
Спасибо за ответ @ Paresh471 - это было очень полезно. Я обнаружил, что включение IAM DB Authentication не требуется для того, чтобы вызов mysql.lamda_async работал. Это было важно для меня, потому что (во всяком случае, в австралийском регионе) вы можете использовать аутентификацию IAM DB только с экземплярами среднего уровня + - затраты, которые я не хотел бы нести для тестовой среды. Ваше здоровье. - person bberak; 11.10.2018
comment
Я столкнулся с той же проблемой. @ Paresh471, вы решили эту проблему? - person Kernelv5; 18.09.2019

После тщательного исследования мы добавили ключ aws_default_lambda_role со значением ARN роли IAM в файл конфигурации группы параметров кластера БД RDS. После этого и роль с правильными разрешениями теперь RDS может успешно вызывать лямбда-API mysql.

person lu1s    schedule 21.06.2017

У меня была аналогичная проблема. После правильной настройки все равно получалось Error Code: 63996. Lambda API returned error: Missing Credentials: Cannot instantiate Lambda Client. Параметры как-то неправильно подобрались. Просто перезагрузка экземпляров устранила проблему.

person somonek    schedule 14.06.2019

Я установил: 'aws_default_lambda_role', 'arn: aws: iam :: 29XXXXXXX82: role / RDStoLAMDA'

**RDStoLAMDA :**   
    AmazonRDSDirectoryServiceAccess
    RDSCloudHsmAuthorizationRole
    Custom one - "lambda:InvokeFunction",

Версия Aurora: "2.03.2" и аутентификация IAM включена на стороне базы данных.

DROP PROCEDURE IF EXISTS SP_Submit_Attr_Status;
    DELIMITER ;;
    CREATE PROCEDURE SP_testing_Attr_Status (IN user_id VARCHAR(255), IN attr_id TEXT, IN action_name TEXT) LANGUAGE SQL
    BEGIN
      CALL mysql.lambda_async('arn:aws:lambda:ap-zzzz-1:*********182:function:dsg-aws-backend-customerWebhook', 
       '{"action": "SUBMIT_**_ATTR", "attrId": ****5, "actionBy": 12***5 }'
      );
    END
    ;;
    DELIMITER ;

вызвать SP_Submit_Attr_Status («***», «** rId», «** nBy»);

Код ошибки: 63996. Lambda API возвратил ошибку: Отсутствуют учетные данные: не удается создать экземпляр Lambda-клиента.

person Kernelv5    schedule 18.09.2019

Наконец-то все работает нормально. Был пропущен только один шаг.

Консоль AWS> RDS> Выберите кластер базы данных> Прокрутите «Управление ролями IAM»

Добавьте туда ту же роль IAM, которую вы добавляете: aws_default_lambda_role.

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Integrating.Lambda.html#AuroraMySQL.Integrating.NativeLambda

Чтобы разрешить пользователям базы данных в кластере БД Aurora MySQL вызывать функции Lambda, свяжите роль, созданную в разделе Создание роли IAM, чтобы разрешить Amazon Aurora доступ к сервисам AWS, с кластером БД. Информацию о связывании роли IAM с кластером БД см. В разделе «Связывание роли IAM с кластером БД MySQL Amazon Aurora».

person Kernelv5    schedule 18.09.2019

Пожалуйста, добавьте роль arn в роль кластера

Шаги

Выберите Базы данных.

Выберите имя кластера Aurora DB, с которым вы хотите связать роль IAM, чтобы отобразить его подробности.

На вкладке «Подключение и безопасность» в разделе «Управление ролями IAM» выберите роль, которую нужно добавить, в разделе «Добавить роли IAM в этот кластер».

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Integrating.Authorizing.IAM.AddRoleToDBCluster.html

person Mano M    schedule 19.07.2021