Amazon Relational Database Service
用户指南 (API 版本 2014-10-31)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

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

您可以通过本机函数或存储过程从 Amazon Aurora 与 MySQL 的兼容性 数据库集群调用 AWS Lambda 函数。在从 Aurora MySQL 调用 Lambda 函数之前,Aurora 数据库集群必须具有对 Lambda 的访问权限。

对于 Aurora MySQL 1.16 和更高版本,我们建议您使用 Aurora MySQL 本机函数。从 Aurora MySQL 1.16 版开始,已弃用存储过程。

向 Aurora 提供访问 Lambda 的权限

您必须先为 Aurora MySQL 数据库集群提供对 Lambda 的访问权限,然后才能从 Aurora MySQL 调用 Lambda 函数。

为 Aurora MySQL 提供对 Lambda 的访问权限

  1. 创建 AWS Identity and Access Management (IAM) 策略以提供允许您的 Aurora MySQL 数据库集群调用 Lambda 函数的权限。有关说明,请参阅创建 IAM 策略以访问 AWS Lambda 资源

  2. 创建 IAM 角色并将您在创建 IAM 策略以访问 AWS Lambda 资源中创建的 IAM 策略附加到新的 IAM 角色。有关说明,请参阅创建 IAM 角色以允许 Amazon Aurora 访问 AWS 服务

  3. aws_default_lambda_role 数据库集群参数设置为新的 IAM 角色的 Amazon 资源名称 (ARN)。

    有关数据库集群参数的更多信息,请参阅Amazon Aurora 数据库集群和数据库实例参数

  4. 要允许 Aurora MySQL 数据库集群中的数据库用户调用 Lambda 函数,请将您在创建 IAM 角色以允许 Amazon Aurora 访问 AWS 服务中创建的角色与该数据库集群关联。有关将 IAM 角色与数据库集群关联的信息,请参阅将 IAM 角色与 Amazon Aurora MySQL 数据库集群关联

  5. 将 Aurora MySQL 数据库集群配置为允许至 Lambda 的出站连接。有关说明,请参阅允许 Amazon Aurora MySQL 到其他 AWS 服务的网络通信

使用 Aurora MySQL 本机函数调用 Lambda 函数

注意

在使用 Aurora MySQL 1.16 和更高版本时,您可以调用本机函数 lambda_synclambda_async。有关 Aurora MySQL 版本的更多信息,请参阅 Amazon Aurora MySQL 数据库引擎更新

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

使用本机函数调用 Lambda 函数

lambda_synclambda_async 函数是内置的本机函数,它们同步或异步调用 Lambda 函数。如果您必须知道调用的函数执行结果才能执行其他操作,请使用同步函数 lambda_sync。如果您不需要知道执行结果即可执行其他操作,请使用异步函数 lambda_async

必须为调用本机函数的用户授予 INVOKE LAMBDA 权限。要为用户授予该权限,请以主用户身份连接到数据库实例,然后运行以下语句。

GRANT INVOKE LAMBDA ON *.* TO user@domain-or-ip-address

您可以运行以下语句以吊销该权限。

REVOKE INVOKE LAMBDA ON *.* FROM user@domain-or-ip-address

lambda_sync 函数的语法

您可以使用 RequestResponse 调用类型同步调用 lambda_sync 函数。该函数在 JSON 负载中返回 Lambda 调用的结果。该函数使用以下语法。

lambda_sync ( lambda_function_ARN, JSON_payload )

注意

您可以使用触发器对数据修改语句调用 Lambda。请记住,触发器不是针对每个 SQL 语句执行一次,而是针对每个修改后的行执行一次 (一次一行)。触发器执行是同步的,在触发器执行完成之前,数据修改语句将不会返回。

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

lambda_sync 函数的参数

lambda_sync 函数具有以下参数。

lambda_function_ARN

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

JSON_payload

调用的 Lambda 函数的负载,采用 JSON 格式。

注意

Aurora MySQL 不支持 JSON 解析。在 Lambda 函数返回原子值 (如数字或字符串) 时,不需要进行 JSON 解析。

lambda_sync 函数的语法

基于 lambda_sync 的以下查询使用函数 ARN 同步调用 Lambda 函数 BasicTestLambda。该函数的负载是 {"operation": "ping"}

SELECT lambda_sync( 'arn:aws:lambda:us-east-1:868710585169:function:BasicTestLambda', '{"operation": "ping"}');

lambda_async 函数的语法

您可以使用 Event 调用类型异步调用 lambda_async 函数。该函数在 JSON 负载中返回 Lambda 调用的结果。该函数使用以下语法。

lambda_async ( lambda_function_ARN, JSON_payload )

lambda_async 函数的参数

lambda_async 函数具有以下参数。

lambda_function_ARN

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

JSON_payload

调用的 Lambda 函数的负载,采用 JSON 格式。

注意

Aurora MySQL 不支持 JSON 解析。在 Lambda 函数返回原子值 (如数字或字符串) 时,不需要进行 JSON 解析。

lambda_async 函数示例

基于 lambda_async 的以下查询使用函数 ARN 异步调用 Lambda 函数 BasicTestLambda。该函数的负载是 {"operation": "ping"}

SELECT lambda_async( 'arn:aws:lambda:us-east-1:868710585169:function:BasicTestLambda', '{"operation": "ping"}');

相关主题

使用 Aurora MySQL 存储过程调用 Lambda 函数

注意

对于 Aurora MySQL 1.8 和更高版本,您可以使用与 AWS Lambda 的直接集成功能。有关 Aurora MySQL 版本的更多信息,请参阅 Amazon Aurora MySQL 数据库引擎更新

从 Amazon Aurora 1.16 版开始,已弃用存储过程 mysql.lambda_async。如果使用 Aurora 1.16 或更高版本,我们强烈建议您改用本机 Lambda 函数。有关更多信息,请参阅 使用本机函数调用 Lambda 函数

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

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

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

语法

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

CALL mysql.lambda_async ( lambda_function_ARN, lambda_function_input )

参数

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

lambda_function_ARN

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

lambda_function_input

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

示例

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

注意

对于高写入流量的表,请谨慎使用其中的触发器来调用 AWS Lambda 函数。INSERT、UPDATE 和 DELETE 触发器是按行激活的。在包含 INSERT、UPDATE 或 DELETE 触发器的表中,如果出现密集型写入工作负载,会导致大量调用 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-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 函数

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!');

相关主题