

# 使用 Aurora MySQL 本机函数调用 Lambda 函数
<a name="AuroraMySQL.Integrating.NativeLambda"></a>

**注意**  
当您使用 Aurora MySQL 2 或 Aurora MySQL 版本 3.01 及更高版本时，您可以调用 `lambda_sync` 和 `lambda_async` 原生函数。有关 Aurora MySQL 版本的更多信息，请参阅[Amazon Aurora MySQL 的数据库引擎更新Amazon Aurora MySQL 的长期支持（LTS）版本和测试版](AuroraMySQL.Updates.md)。

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

**Contents**
+ [使用本机函数调用 Lambda 函数](#AuroraMySQL.Integrating.NativeLambda.lambda_functions)
  + [在 Aurora MySQL 版本 3 中给角色授权](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.v3)
  + [在 Aurora MySQL 版本 2 中授予权限](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.v2)
  + [lambda\$1sync 函数的语法](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Syntax)
  + [lambda\$1sync 函数的参数](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Parameters)
  + [lambda\$1sync 函数示例](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Example)
  + [lambda\$1async 函数的语法](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Syntax)
  + [lambda\$1async 函数的参数](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Parameters)
  + [lambda\$1async 函数示例](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Example)
  + [在触发器中调用 Lambda 函数](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.trigger)

## 使用本机函数调用 Lambda 函数
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions"></a>

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

### 在 Aurora MySQL 版本 3 中给角色授权
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.v3"></a>

在 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 角色系统，可以在[基于角色的权限模型](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model)中了解详情。有关更多详细信息，请参阅《MySQL 参考手册》**中的 [Using roles](https://dev.mysql.com/doc/refman/8.0/en/roles.html)。  
这仅适用于当前的活动会话。当您重新连接时，必须再次运行 `SET ROLE` 语句来授予权限。有关更多信息，请参阅《MySQL Reference Manual》**中的 [SET ROLE statement](https://dev.mysql.com/doc/refman/8.0/en/set-role.html)。  
可以使用 `activate_all_roles_on_login` 数据库集群参数，在用户连接到数据库实例时自动激活所有角色。设置此参数后，您通常不必显式调用 `SET ROLE` 语句，即可激活角色。有关更多信息，请参阅《MySQL Reference Manual》**中的 [activate\$1all\$1roles\$1on\$1login](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_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
```

确保将角色授予正确的用户，如 `mysql.users` 表格条目中所示。可能有多个同名但位于不同主机上的用户。根据调用 `lambda_sync` 函数的应用程序或主机，MySQL 会根据 `host` 列条目来选择最匹配的用户。

### 在 Aurora MySQL 版本 2 中授予权限
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.v2"></a>

在 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\$1sync 函数的语法
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Syntax"></a>

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

```
lambda_sync (
  lambda_function_ARN,
  JSON_payload
)
```

### lambda\$1sync 函数的参数
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Parameters"></a>

`lambda_sync` 函数具有以下参数。

* lambda\$1function\$1ARN *  
要调用的 Lambda 函数的 Amazon Resource Name (ARN)。

* JSON\$1payload *  
调用的 Lambda 函数的负载，采用 JSON 格式。

**注意**  
Aurora MySQL 版本 3 支持 MySQL 8.0 中的 JSON 解析函数。但是，Aurora MySQL 版本 2 不包含这些函数。在 Lambda 函数返回原子值 (如数字或字符串) 时，不需要进行 JSON 解析。

### lambda\$1sync 函数示例
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Example"></a>

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

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

### lambda\$1async 函数的语法
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Syntax"></a>

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

```
lambda_async (
  lambda_function_ARN,
  JSON_payload
)
```

### lambda\$1async 函数的参数
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Parameters"></a>

`lambda_async` 函数具有以下参数。

* lambda\$1function\$1ARN *  
要调用的 Lambda 函数的 Amazon Resource Name (ARN)。

* JSON\$1payload *  
调用的 Lambda 函数的负载，采用 JSON 格式。

**注意**  
Aurora MySQL 版本 3 支持 MySQL 8.0 中的 JSON 解析函数。但是，Aurora MySQL 版本 2 不包含这些函数。在 Lambda 函数返回原子值 (如数字或字符串) 时，不需要进行 JSON 解析。

### lambda\$1async 函数示例
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Example"></a>

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

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

### 在触发器中调用 Lambda 函数
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.trigger"></a>

您可以使用触发器对数据修改语句调用 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 函数。