Invocación de una función de Lambda con una función nativa de Aurora MySQL - Amazon Aurora

Invocación de una función de Lambda con una función nativa de Aurora MySQL

nota

Puede llamar a las funciones nativas lambda_sync y lambda_async cuando utilice la versión 2 de Aurora MySQL o la versión 3.01 y posteriores de Aurora MySQL. Para obtener más información acerca de las versiones de Aurora MySQL, consulte Actualizaciones del motor de base de datos de Amazon Aurora MySQL.

Para invocar una función de AWS Lambda desde un clúster de base de datos de Aurora MySQL, llame a las funciones nativas de lambda_sync ylambda_async. Este método puede ser útil cuando se desea integrar una base de datos que se ejecuta en Aurora MySQL con otros servicios de AWS. Por ejemplo, es posible que desee enviar una notificación mediante Amazon Simple Notification Service (Amazon SNS) siempre que se inserte una fila en una tabla específica de una base de datos.

Trabajo con funciones nativas para invocar una función de Lambda

Las funciones lambda_sync y lambda_async son funciones nativas integradas que invocan una función de Lambda de forma síncrona o asíncrona. Cuando necesite conocer el resultado de la función de Lambda antes de pasar a otra acción, utilice la función síncrona lambda_sync. Cuando no necesite conocer el resultado de la función de Lambda antes de pasar a otra acción, use la función asíncrona lambda_async.

Concesión de roles en Aurora MySQL versión 3

En la versión 3 de Aurora MySQL, al usuario que invoca una función nativa se le debe conceder el rol de AWS_LAMBDA_ACCESS. Para conceder este rol a un usuario, conéctese a la instancia de base de datos como usuario administrativo y ejecute la siguiente instrucción.

GRANT AWS_LAMBDA_ACCESS TO user@domain-or-ip-address

Puede revocar este rol ejecutando la siguiente instrucción.

REVOKE AWS_LAMBDA_ACCESS FROM user@domain-or-ip-address
sugerencia

Cuando utiliza la técnica de rol en Aurora MySQL versión 3, también puede activar el rol mediante la instrucción SET ROLE role_name o SET ROLE ALL. Si no está familiarizado con el sistema de roles MySQL 8.0, puede obtener más información en Modelo de privilegios basado en roles. Para obtener más información, consulte Using roles en el Manual de referencia de MySQL.

Esto solo se aplica a la sesión activa actual. Cuando se vuelva a conectar, debe ejecutar la instrucción SET ROLE de nuevo para conceder privilegios. Para obtener más información, consulte la instrucción SET ROLE en el Manual de referencia de MySQL.

Puede utilizar el parámetro de clúster de base de datos activate_all_roles_on_login para activar automáticamente todos los roles cuando un usuario se conecta a una instancia de base de datos. Cuando se establece este parámetro, por lo general no tiene que llamar a la instrucción SET ROLE para activar un rol. Para obtener más información, consulte activate_all_roles_on_login en el Manual de referencia de MySQL.

Sin embargo, debe llamar a SET ROLE ALL de forma explícita al principio de un procedimiento almacenado para activar el rol cuando un usuario diferente llame al procedimiento almacenado.

Si recibe un error como el siguiente al intentar invocar una función de Lambda, ejecute una instrucción SET ROLE.

SQL Error [1227] [42000]: Access denied; you need (at least one of) the Invoke Lambda privilege(s) for this operation

Concesión de privilegios en la versión 2 de Aurora MySQL

En la versión 2 de Aurora MySQL, al usuario que invoca una función nativa se le debe conceder el privilegio de INVOKE LAMBDA. Para conceder este privilegio a un usuario, conéctese a la instancia de base de datos como usuario administrativo y ejecute la siguiente instrucción.

GRANT INVOKE LAMBDA ON *.* TO user@domain-or-ip-address

Puede revocar este privilegio ejecutando la siguiente instrucción.

REVOKE INVOKE LAMBDA ON *.* FROM user@domain-or-ip-address

Sintaxis de la función lambda_sync

Puede invocar la función lambda_sync de forma síncrona con el tipo de invocación RequestResponse. La función devuelve el resultado de la invocación de Lambda en una carga JSON. La función presenta la siguiente sintaxis.

lambda_sync ( lambda_function_ARN, JSON_payload )

Parámetros de la función lambda_sync

La función lambda_sync tiene los siguientes parámetros.

lambda_function_ARN

El Nombre de recurso de Amazon (ARN) de la función Lambda que se va a invocar.

JSON_payload

La carga de la función de Lambda invocada, en formato JSON.

nota

Aurora MySQL versión 3 admite las funciones de análisis JSON de MySQL 8.0. Sin embargo, la versión 2 de Aurora MySQL no incluye esas funciones. El análisis de JSON no es necesario si una función de Lambda devuelve un valor atómico, como un número o una cadena.

Ejemplo de la función lambda_sync

La siguiente consulta basada en lambda_sync invoca la función de Lambda BasicTestLambda de forma síncrona mediante la función ARN. La carga de la función es {"operation": "ping"}.

SELECT lambda_sync( 'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda', '{"operation": "ping"}');

Sintaxis de la función lambda_async

Puede invocar la función lambda_async de forma asíncrona con el tipo de invocación Event. La función devuelve el resultado de la invocación de Lambda en una carga JSON. La función presenta la siguiente sintaxis.

lambda_async ( lambda_function_ARN, JSON_payload )

Parámetros de la función lambda_async

La función lambda_async tiene los siguientes parámetros.

lambda_function_ARN

El Nombre de recurso de Amazon (ARN) de la función Lambda que se va a invocar.

JSON_payload

La carga de la función de Lambda invocada, en formato JSON.

nota

Aurora MySQL versión 3 admite las funciones de análisis JSON de MySQL 8.0. Sin embargo, la versión 2 de Aurora MySQL no incluye esas funciones. El análisis de JSON no es necesario si una función de Lambda devuelve un valor atómico, como un número o una cadena.

Ejemplo de la función lambda_async

La siguiente consulta basada en lambda_async invoca la función de Lambda BasicTestLambda de forma asíncrona mediante la función ARN. La carga de la función es {"operation": "ping"}.

SELECT lambda_async( 'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda', '{"operation": "ping"}');

Invocación de una función de Lambda en un desencadenador

Puede usar disparadores para llamar Lambda en instrucciones de modificación de datos. El siguiente ejemplo usa la función lambda_async nativa y almacena el resultado en una variable.

mysql>SET @result=0; mysql>DELIMITER // mysql>CREATE TRIGGER myFirstTrigger AFTER INSERT ON Test_trigger FOR EACH ROW BEGIN SELECT lambda_async( 'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda', '{"operation": "ping"}') INTO @result; END; // mysql>DELIMITER ;
nota

Los desencadenadores no se ejecutan una vez por instrucción SQL, sino una vez por fila modificada, de una en una. Cuando se ejecuta un desencadenador, el proceso es sincrónico. La instrucción de modificación de datos sólo devuelve cuando se completa el desencadenador.

Tenga cuidado al invocar una función de AWS Lambda desde desencadenadores en tablas que experimentan un alto tráfico de escritura. Los desencadenadores INSERT, UPDATE y DELETE se activan por fila. Una gran carga de trabajo de escritura en una tabla con desencadenadores INSERT, UPDATE o DELETE genera un gran número de llamadas a la función AWS Lambda.