Amazon Relational Database Service
用户指南 (API Version 2014-10-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

从 Amazon Aurora 数据库群集调用 Lambda 函数

注意

Amazon Aurora 1.8 版及后续版本可以与 AWS Lambda 集成。有关 Aurora 版本的更多信息,请参阅 Amazon Aurora 数据库引擎更新

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

要调用 Lambda 函数,您可以授予 Aurora 数据库群集访问 AWS Lambda 的权限。您可以创建具有必要权限的 IAM 角色,然后将该角色与您的数据库群集关联,来授予该权限。此外,您必须将 Aurora 数据库群集配置为允许与 AWS Lambda 的出站连接。有关如何允许 Aurora 数据库群集代表您与 AWS Lambda 进行通信的详细信息和说明,请参阅授权 Amazon Aurora 代表您访问其他 AWS 服务

结合使用 mysql.lambda_async 过程来调用 Lambda 函数

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

语法

CALL mysql.lambda_async ( lambda_function_ARN, lambda_function_input )

参数

lambda_function_ARN

要调用的 Lambda 函数的 Amazon 资源名称 (ARN)。

lambda_function_input

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

示例

作为最佳实践,我们建议您将对 mysql.lambda_async 的调用包装在存储过程中,该存储过程可从不同的来源 (例如触发器或客户端代码) 调用。这有助于避免出现阻抗不一致问题,并且可更轻松地调用 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-cn: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 函数。INSERT、UPDATE 和 DELETE 触发器按行激活。在包含 INSERT、UPDATE 或 DELETE 触发器的表中,如果出现密集型写入工作负载,会导致大量调用 AWS Lambda 函数。

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

AWS Lambda 函数

import boto3 sns = boto3.client('sns') def SNS_publish_message(event, context): return sns.publish( TopicArn='arn:aws-cn: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-cn: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!');

相关主题