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

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

注意

当您使用 Aurora MySQL 2 或 Aurora MySQL 版本 3.01 及更高版本时,您可以调用 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 函数的结果才能执行其他操作,请使用同步函数 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_nameSET 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 函数。INSERTUPDATEDELETE 触发器按行激活。在包含 INSERTUPDATEDELETE 触发器的表中,如果出现密集型写入工作负载,会导致大量调用 AWS Lambda 函数。