

# Invocación de una función de Lambda con un procedimiento almacenado de Aurora MySQL (obsoleto)
<a name="AuroraMySQL.Integrating.ProcLambda"></a>

Para invocar una función de AWS Lambda desde un clúster de base de datos de Aurora MySQL, llame al procedimiento `mysql.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**
+ [Consideraciones sobre la versión de Aurora MySQL](#AuroraMySQL.Integrating.ProcLambda.caveats)
+ [Uso del procedimiento mysql.lambda\$1async para invocar una función de Lambda (obsoleto)](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async)
  + [Sintaxis](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Syntax)
  + [Parameters](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Parameters)
  + [Ejemplos](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Examples)

## Consideraciones sobre la versión de Aurora MySQL
<a name="AuroraMySQL.Integrating.ProcLambda.caveats"></a>

A partir de la versión 2 de Aurora MySQL, puede utilizar el método de función nativa en lugar de estos procedimientos almacenados para invocar una función de Lambda. Para obtener más información acerca de las funciones nativas, consulte [Trabajo con funciones nativas para invocar una función de Lambda](AuroraMySQL.Integrating.NativeLambda.md#AuroraMySQL.Integrating.NativeLambda.lambda_functions).

En la versión 2 de Aurora MySQL, el procedimiento almacenado `mysql.lambda_async` ya no está disponible. Recomendamos que, en su lugar, utilice funciones de Lambda nativas.

En Aurora MySQL versión 3, el procedimiento almacenado no está disponible.

## Uso del procedimiento mysql.lambda\$1async para invocar una función de Lambda (obsoleto)
<a name="AuroraMySQL.Integrating.Lambda.mysql_lambda_async"></a>

El procedimiento `mysql.lambda_async` es un procedimiento almacenado integrado que invoca una función Lambda de forma asíncrona. Para utilizar este procedimiento, el usuario de la base de datos debe tener privilegios `EXECUTE` para el procedimiento almacenado `mysql.lambda_async`.

### Sintaxis
<a name="AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Syntax"></a>

El procedimiento `mysql.lambda_async` tiene la siguiente sintaxis.

```
CALL mysql.lambda_async (
  lambda_function_ARN,
  lambda_function_input
)
```

### Parameters
<a name="AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Parameters"></a>

El procedimiento `mysql.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.

* lambda\$1function\$1input *  
La cadena de entrada, en formato JSON, para la función Lambda invocada.

### Ejemplos
<a name="AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Examples"></a>

Como práctica recomendada, es conveniente que encapsule las llamadas al procedimiento `mysql.lambda_async` en un procedimiento almacenado que se pueda invocar desde distintos orígenes, como los disparadores o el código del cliente. Esto puede ayudar a evitar los problemas de “discrepancia de impedancia” y hacer que resulte más sencillo llamar a las funciones Lambda. 

**nota**  
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.   
Aunque las llamadas al procedimiento `mysql.lambda_async` son asíncronas, los disparadores son síncronos. Una instrucción que da como resultado un gran número de activaciones de disparadores no espera a que finalice la llamada a la función de AWS Lambda, pero espera a que finalicen los disparadores antes de devolver el control al cliente.

**Example Ejemplo: Invocar una función de AWS Lambda para enviar correo electrónico**  
En el siguiente ejemplo se crea un procedimiento almacenado que puede llamarse desde el código de una base de datos para enviar un mensaje de correo electrónico utilizando una función Lambda.  
**AWS Lambda Función**  

```
import boto3

ses = boto3.client('ses')

def SES_send_email(event, context):

    return ses.send_email(
        Source=event['email_from'],
        Destination={
            'ToAddresses': [
            event['email_to'],
            ]
        },

        Message={
            'Subject': {
            'Data': event['email_subject']
            },
            'Body': {
                'Text': {
                    'Data': event['email_body']
                }
            }
        }
    )
```
**Procedimiento almacenado**  

```
DROP PROCEDURE IF EXISTS SES_send_email;
DELIMITER ;;
  CREATE PROCEDURE SES_send_email(IN email_from VARCHAR(255),
                                  IN email_to VARCHAR(255),
                                  IN subject VARCHAR(255),
                                  IN body TEXT) LANGUAGE SQL
  BEGIN
    CALL mysql.lambda_async(
         'arn:aws:lambda:us-west-2:123456789012:function:SES_send_email',
         CONCAT('{"email_to" : "', email_to,
             '", "email_from" : "', email_from,
             '", "email_subject" : "', subject,
             '", "email_body" : "', body, '"}')
     );
  END
  ;;
DELIMITER ;
```
**Llamada al procedimiento almacenado para invocar la función de AWS Lambda**  

```
mysql> call SES_send_email('example_from@amazon.com', 'example_to@amazon.com', 'Email subject', 'Email content');
```

**Example Ejemplo: Invocar una función de AWS Lambda para publicar un evento procedente de un desencadenador**  
En el siguiente ejemplo se crea un procedimiento almacenado que publica un evento mediante Amazon SNS. El código llama al procedimiento desde un disparador cuando se añade una fila a una tabla.  
**AWS Lambda Función**  

```
import boto3

sns = boto3.client('sns')

def SNS_publish_message(event, context):

    return sns.publish(
        TopicArn='arn:aws:sns:us-west-2:123456789012:Sample_Topic',
        Message=event['message'],
        Subject=event['subject'],
        MessageStructure='string'
    )
```
**Procedimiento almacenado**  

```
DROP PROCEDURE IF EXISTS SNS_Publish_Message;
DELIMITER ;;
CREATE PROCEDURE SNS_Publish_Message (IN subject VARCHAR(255),
                                      IN message TEXT) LANGUAGE SQL
BEGIN
  CALL mysql.lambda_async('arn:aws:lambda:us-west-2:123456789012:function:SNS_publish_message',
     CONCAT('{ "subject" : "', subject,
            '", "message" : "', message, '" }')
     );
END
;;
DELIMITER ;
```
**Tabla**  

```
CREATE TABLE 'Customer_Feedback' (
  'id' int(11) NOT NULL AUTO_INCREMENT,
  'customer_name' varchar(255) NOT NULL,
  'customer_feedback' varchar(1024) NOT NULL,
  PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
**Desencadenador**  

```
DELIMITER ;;
CREATE TRIGGER TR_Customer_Feedback_AI
  AFTER INSERT ON Customer_Feedback
  FOR EACH ROW
BEGIN
  SELECT CONCAT('New customer feedback from ', NEW.customer_name), NEW.customer_feedback INTO @subject, @feedback;
  CALL SNS_Publish_Message(@subject, @feedback);
END
;;
DELIMITER ;
```
**Inserción de una fila en la tabla para desencadenar la notificación**  

```
mysql> insert into Customer_Feedback (customer_name, customer_feedback) VALUES ('Sample Customer', 'Good job guys!');
```