使用 Aurora MySQL 存储过程调用 Lambda 函数(已弃用) - Amazon Aurora

使用 Aurora MySQL 存储过程调用 Lambda 函数(已弃用)

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

Aurora MySQL 版本注意事项

从 Aurora MySQL 版本 2 开始,您可以使用原生函数方法调用 Lambda 函数,而不是使用这些存储过程。有关本机函数的更多信息,请参阅 使用本机函数调用 Lambda 函数

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

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

结合使用 mysql.lambda_async 过程来调用 Lambda 函数(已弃用)

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

语法

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

CALL mysql.lambda_async ( lambda_function_ARN, lambda_function_input )

参数

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

lambda_function_ARN

要调用的 Lambda 函数的 Amazon Resource Name (ARN)。

lambda_function_input

所调用 Lambda 函数的 JSON 格式的输入字符串。

示例

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

注意

对于高写入流量的表,请谨慎使用其中的触发器来调用 AWS Lambda 函数。INSERTUPDATEDELETE 触发器按行激活。在包含 INSERTUPDATEDELETE 触发器的表中,如果出现密集型写入工作负载,会导致大量调用 AWS Lambda 函数。

尽管对 mysql.lambda_async 过程的调用是异步操作,但触发器是同步的。产生大量触发器激活的语句不等待调用 AWS Lambda 函数完成,但是在返回对客户端的控制之前,它却需要等待触发器完成。

例 示例:调用 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');
例 示例:调用 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!');