

# 使用 Aurora MySQL 存储过程调用 Lambda 函数（已弃用）
<a name="AuroraMySQL.Integrating.ProcLambda"></a>

您可以调用 `mysql.lambda_async` 过程以从 Aurora MySQL 数据库集群中调用 AWS Lambda 函数。如果要将在 Aurora MySQL 上运行的数据库与其他AWS服务集成，这种方法可能是非常有用的。例如，每次在数据库的特定表中插入行时，您可能希望使用 Amazon Simple Notification Service (Amazon SNS) 发送通知。

**Contents**
+ [Aurora MySQL 版本注意事项](#AuroraMySQL.Integrating.ProcLambda.caveats)
+ [结合使用 mysql.lambda\$1async 过程来调用 Lambda 函数（已弃用）](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async)
  + [语法](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Syntax)
  + [参数](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Parameters)
  + [示例](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Examples)

## Aurora MySQL 版本注意事项
<a name="AuroraMySQL.Integrating.ProcLambda.caveats"></a>

从 Aurora MySQL 版本 2 开始，您可以使用原生函数方法调用 Lambda 函数，而不是使用这些存储过程。有关本机函数的更多信息，请参阅 [使用本机函数调用 Lambda 函数](AuroraMySQL.Integrating.NativeLambda.md#AuroraMySQL.Integrating.NativeLambda.lambda_functions)。

在 Aurora MySQL 版本 2 中，不再支持存储过程 `mysql.lambda_async`。强烈建议您改用原生 Lambda 函数。

存储过程在 Aurora MySQL 版本 3 中不可用。

## 结合使用 mysql.lambda\$1async 过程来调用 Lambda 函数（已弃用）
<a name="AuroraMySQL.Integrating.Lambda.mysql_lambda_async"></a>

`mysql.lambda_async` 过程是一个异步调用 Lambda 函数的内置存储过程。要使用该过程，您的数据库用户必须对 `EXECUTE` 存储过程拥有 `mysql.lambda_async` 权限。

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

`mysql.lambda_async` 过程使用以下语法。

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

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

`mysql.lambda_async` 过程具有以下参数。

* lambda\$1function\$1ARN *  
要调用的 Lambda 函数的 Amazon Resource Name (ARN)。

* lambda\$1function\$1input *  
所调用 Lambda 函数的 JSON 格式的输入字符串。

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

作为最佳实践，我们建议您将对 `mysql.lambda_async` 的调用包装在存储过程中，该存储过程可从不同的来源 (例如触发器或客户端代码) 调用。这有助于避免出现阻抗不一致问题，并且可更轻松地调用 Lambda 函数。

**注意**  
对于高写入流量的表，请谨慎使用其中的触发器来调用 AWS Lambda 函数。`INSERT`、`UPDATE` 和 `DELETE` 触发器按行激活。在包含 `INSERT`、`UPDATE` 或 `DELETE` 触发器的表中，如果出现密集型写入工作负载，会导致大量调用 AWS Lambda 函数。  
尽管对 `mysql.lambda_async` 过程的调用是异步操作，但触发器是同步的。产生大量触发器激活的语句不等待调用 AWS Lambda 函数完成，但是在返回对客户端的控制之前，它却需要等待触发器完成。

**Example 示例：调用 AWS Lambda 函数来发送电子邮件**  
以下示例创建一个存储过程，您可以在您的数据库代码中调用该过程来使用 Lambda 函数发送电子邮件。  
**AWS Lambda 函数**  

```
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']
                }
            }
        }
    )
```
**存储过程**  

```
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 ;
```
**调用存储过程以调用 AWS Lambda 函数**  

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

**Example 示例：调用 AWS Lambda 函数来从触发器发布事件**  
以下示例创建一个存储过程，该过程使用 Amazon SNS 发布事件。向表中添加行时，该代码会从触发器调用过程。  
**AWS Lambda 函数**  

```
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'
    )
```
**存储过程**  

```
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 ;
```
**表**：  

```
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;
```
**触发器**  

```
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 ;
```
**将行插入表中触发通知**  

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