使用 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_sync 函數的結果,請使用同步函數 Lambda。如果您在繼續執行另一個動作之前,並不需要得知 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 參考手冊》中的使用角色

此僅適用於目前的作用中工作階段。重新連接時,您必須再次執行 SET ROLE 陳述式以授予權限。如需詳細資訊,請參閱 MySQL Reference Manual (MySQL 參考手冊) 中的 SET ROLE 陳述式

您可以使用 activate_all_roles_on_login 資料庫叢集參數,在使用者連線至資料庫執行個體時自動啟動所有角色。設定此參數後,您通常不需要明確呼叫 SET ROLE 陳述式,即可啟用角色。如需詳細資訊,請參閱 MySQL Reference Manual (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

請確定您將角色授予正確的使用者,如 mysql.users 資料表項目所示。可能有多個使用者具有相同名稱,但在不同的主機上。根據哪個應用程式或主機正在叫用 lambda_sync 函數,MySQL 會根據 host 資料欄項目選取最相符的使用者。

在 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 函數的大量呼叫。