使用 Aurora MySQL 本机函数调用 Lambda 函数
注意
当您使用 Aurora MySQL 2 或 Aurora MySQL 版本 3.01 及更高版本时,您可以调用 lambda_sync
和 lambda_async
原生函数。有关 Aurora MySQL 版本的更多信息,请参阅Amazon Aurora MySQL 的数据库引擎更新。
您可以调用本机函数 lambda_sync
和 lambda_async
,以从 Aurora MySQL 数据库集群中调用 AWS Lambda 函数。如果要将在 Aurora MySQL 上运行的数据库与其他AWS服务集成,这种方法可能是非常有用的。例如,每次在数据库的特定表中插入行时,您可能希望使用 Amazon Simple Notification Service (Amazon SNS) 发送通知。
目录
使用本机函数调用 Lambda 函数
lambda_sync
和 lambda_async
函数是内置的本机函数,它们同步或异步地调用 Lambda 函数。如果您必须知道 Lambda 函数的结果才能执行其他操作,请使用同步函数 lambda_sync
。如果您不需要知道 Lambda 函数的结果即可执行其他操作,请使用异步函数 lambda_async
。
在 Aurora MySQL 版本 3 中给角色授权
在 Aurora MySQL 版本 3 中,必须为调用本机函数的用户授予 AWS_LAMBDA_ACCESS
角色。要为用户授予此角色,请以管理用户身份连接到数据库实例,然后运行以下语句。
GRANT AWS_LAMBDA_ACCESS TO
user
@domain-or-ip-address
您可以运行以下语句以吊销该角色。
REVOKE AWS_LAMBDA_ACCESS FROM
user
@domain-or-ip-address
提示
当您使用 Aurora MySQL 版本 3 中的角色方法时,还可以通过使用 SET ROLE
或 role_name
SET ROLE
ALL
语句来激活角色。如果您不熟悉 MySQL 8.0 角色系统,可以在基于角色的权限模型中了解详情。有关更多详细信息,请参阅《MySQL 参考手册》中的 Using roles
这仅适用于当前的活动会话。当您重新连接时,必须再次运行 SET ROLE
语句来授予权限。有关更多信息,请参阅《MySQL 参考手册》中的 SET ROLE 语句
可以使用 activate_all_roles_on_login
数据库集群参数,在用户连接到数据库实例时自动激活所有角色。设置此参数后,您通常不必显式调用 SET ROLE
语句,即可激活角色。有关更多信息,请参阅《MySQL 参考手册》中的 activate_all_roles_on_login
但是,当存储过程由其他用户调用时,您必须在该存储过程的开头显式调用 SET ROLE ALL
才能激活该角色。
如果您在尝试调用 Lambda 函数时出现如下错误,请运行 SET ROLE
语句。
SQL Error [1227] [42000]: Access denied; you need (at least one of) the Invoke Lambda privilege(s) for this operation
在 Aurora MySQL 版本 2 中授予权限
在 Aurora MySQL 版本 2 中,必须为调用原生函数的用户授予 INVOKE LAMBDA
权限。要为用户授予此权限,请以管理用户身份连接到数据库实例,然后运行以下语句。
GRANT INVOKE LAMBDA ON *.* TO
user
@domain-or-ip-address
您可以运行以下语句以吊销该权限。
REVOKE INVOKE LAMBDA ON *.* FROM
user
@domain-or-ip-address
lambda_sync 函数的语法
您可以使用 lambda_sync
调用类型同步地调用 RequestResponse
函数。该函数在 JSON 负载中返回 Lambda 调用的结果。该函数使用以下语法。
lambda_sync (
lambda_function_ARN
,
JSON_payload
)
lambda_sync 函数的参数
lambda_sync
函数具有以下参数。
- lambda_function_ARN
-
要调用的 Lambda 函数的 Amazon Resource Name (ARN)。
- JSON_payload
-
调用的 Lambda 函数的负载,采用 JSON 格式。
注意
Aurora MySQL 版本 3 支持 MySQL 8.0 中的 JSON 解析函数。但是,Aurora MySQL 版本 2 不包含这些函数。在 Lambda 函数返回原子值 (如数字或字符串) 时,不需要进行 JSON 解析。
lambda_sync 函数示例
基于 lambda_sync
的以下查询使用函数 ARN 同步地调用 Lambda 函数 BasicTestLambda
。该函数的负载是 {"operation": "ping"}
。
SELECT lambda_sync( 'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda', '{"operation": "ping"}');
lambda_async 函数的语法
您可以使用 lambda_async
调用类型异步地调用 Event
函数。该函数在 JSON 负载中返回 Lambda 调用的结果。该函数使用以下语法。
lambda_async (
lambda_function_ARN
,
JSON_payload
)
lambda_async 函数的参数
lambda_async
函数具有以下参数。
- lambda_function_ARN
-
要调用的 Lambda 函数的 Amazon Resource Name (ARN)。
- JSON_payload
-
调用的 Lambda 函数的负载,采用 JSON 格式。
注意
Aurora MySQL 版本 3 支持 MySQL 8.0 中的 JSON 解析函数。但是,Aurora MySQL 版本 2 不包含这些函数。在 Lambda 函数返回原子值 (如数字或字符串) 时,不需要进行 JSON 解析。
lambda_async 函数示例
基于 lambda_async
的以下查询使用函数 ARN 异步地调用 Lambda 函数 BasicTestLambda
。该函数的负载是 {"operation": "ping"}
。
SELECT lambda_async( 'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda', '{"operation": "ping"}');
在触发器中调用 Lambda 函数
您可以使用触发器对数据修改语句调用 Lambda。以下示例使用 lambda_async
原生函数并将结果存储在变量中。
mysql>
SET @result=0;mysql>
DELIMITER //mysql>
CREATE TRIGGER myFirstTrigger AFTER INSERT ON Test_trigger FOR EACH ROW BEGIN SELECT lambda_async( 'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda', '{"operation": "ping"}') INTO @result; END; //mysql>
DELIMITER ;
注意
触发器不是针对每个 SQL 语句运行一次,而是针对每个修改后的行运行一次(一次一行)。当触发器运行时,进程是同步的。数据修改语句仅在触发器完成时返回。
对于高写入流量的表,请谨慎使用其中的触发器来调用 AWS Lambda 函数。INSERT
、UPDATE
和 DELETE
触发器按行激活。在包含 INSERT
、UPDATE
或 DELETE
触发器的表中,如果出现密集型写入工作负载,会导致大量调用 AWS Lambda 函数。