

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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) 和 Beta 版](AuroraMySQL.Updates.md)。

您可以透過呼叫原生 AWS Lambda 函數 `lambda_sync`和 ，從 Aurora MySQL 資料庫叢集叫用 函數`lambda_async`。當您想要將 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_sync` 函數的結果，請使用同步函數 Lambda。如果您在繼續執行另一個動作之前，並不需要得知 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 參考手冊》**中的[使用角色](https://dev.mysql.com/doc/refman/8.0/en/roles.html)。  
此僅適用於目前的作用中工作階段。重新連接時，您必須再次執行 `SET ROLE` 陳述式以授予權限。如需詳細資訊，請參閱 *MySQL Reference Manual* (MySQL 參考手冊) 中的 [SET ROLE 陳述式](https://dev.mysql.com/doc/refman/8.0/en/set-role.html)。  
您可以使用 `activate_all_roles_on_login` 資料庫叢集參數，在使用者連線至資料庫執行個體時自動啟動所有角色。設定此參數後，您通常不需要明確呼叫 `SET ROLE` 陳述式，即可啟用角色。如需詳細資訊，請參閱 *MySQL Reference Manual* (MySQL 參考手冊) 中的 [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 函數的大量呼叫。