使用 Aurora MySQL 原生函數叫用 Lambda 函數 - Amazon Aurora

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

使用 Aurora MySQL 原生函數叫用 Lambda 函數

注意

當您使用 Aurora MySQL 第 2 版或 Aurora MySQL 第 3.01 版及更高版本lambda_synclambda_async時,您可以呼叫原生函數。如需 Aurora MySQL 版本的詳細資訊,請參閱 Amazon Aurora 我的數據庫引擎更新 SQL

您可以呼叫原生 AWS Lambda 函數 lambda_sync和 ,從 Aurora MySQL 資料庫叢集叫用 函數lambda_async。當您想要將 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 角色系統,您可以在 中進一步了解。 角色型權限模型如需詳細資訊,請參閱 我的SQL參考手冊中的使用角色

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

您可以使用 activate_all_roles_on_login 資料庫叢集參數,在使用者連線至資料庫執行個體時自動啟動所有角色。設定此參數時,您通常不需要明確呼叫SET ROLE陳述式來啟用角色。如需詳細資訊,請參閱 MySQL Reference Manual 中的 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函數,我的SQL 會根據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 函數。函數會傳回 Lambda 在JSON承載中呼叫的結果。此函數的語法如下。

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 函數範例

下列以 為基礎的查詢會使用 函數 BasicTestLambda 同步lambda_sync叫用 Lambda 函數ARN。函數的承載為 {"operation": "ping"}

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

lambda_async 函數的語法

您可以指定 lambda_async 呼叫類型,以非同步呼叫 Event 函數。函數會傳回 Lambda 在JSON承載中呼叫的結果。此函數的語法如下。

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 函數範例

下列以 為基礎的查詢會使用 函數 BasicTestLambda 以非同步方式lambda_async叫用 Lambda 函數ARN。函數的承載為 {"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 函數的大量呼叫。