

# Invocación de una función de Lambda con una función nativa de Aurora MySQL
<a name="AuroraMySQL.Integrating.NativeLambda"></a>

**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 MySQLVersiones beta y de soporte a largo plazo (LTS) para Amazon Aurora MySQL](AuroraMySQL.Updates.md).

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` y`lambda_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.

**Contents**
+ [Trabajo con funciones nativas para invocar una función de Lambda](#AuroraMySQL.Integrating.NativeLambda.lambda_functions)
  + [Concesión de roles en Aurora MySQL versión 3](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.v3)
  + [Concesión de privilegios en la versión 2 de Aurora MySQL](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.v2)
  + [Sintaxis de la función lambda\$1sync](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Syntax)
  + [Parámetros de la función lambda\$1sync](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Parameters)
  + [Ejemplo de la función lambda\$1sync](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Example)
  + [Sintaxis de la función lambda\$1async](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Syntax)
  + [Parámetros de la función lambda\$1async](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Parameters)
  + [Ejemplo de la función lambda\$1async](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Example)
  + [Invocación de una función de Lambda en un desencadenador](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.trigger)

## Trabajo con funciones nativas para invocar una función de Lambda
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions"></a>

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
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.v3"></a>

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](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model). Para obtener más información, consulte [Using roles](https://dev.mysql.com/doc/refman/8.0/en/roles.html) 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](https://dev.mysql.com/doc/refman/8.0/en/set-role.html) 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\$1all\$1roles\$1on\$1login](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_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
```

Asegúrese de conceder el rol al usuario correcto, tal como se muestra en las entradas de la tabla `mysql.users`. Puede que haya varios usuarios con el mismo nombre, pero en hosts diferentes. Según la aplicación o el host que invoque la función `lambda_sync`, MySQL selecciona el usuario con la mejor coincidencia según las entradas de las columnas `host`.

### Concesión de privilegios en la versión 2 de Aurora MySQL
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.v2"></a>

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\$1sync
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Syntax"></a>

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\$1sync
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Parameters"></a>

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

* lambda\$1function\$1ARN *  
El Nombre de recurso de Amazon (ARN) de la función Lambda que se va a invocar.

* JSON\$1payload *  
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\$1sync
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Example"></a>

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\$1async
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Syntax"></a>

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\$1async
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Parameters"></a>

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

* lambda\$1function\$1ARN *  
El Nombre de recurso de Amazon (ARN) de la función Lambda que se va a invocar.

* JSON\$1payload *  
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\$1async
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Example"></a>

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
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.trigger"></a>

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.