本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Aurora MySQL 原生函數叫用 Lambda 函數
注意
當您使用 Aurora MySQL 第 2 版或 Aurora MySQL 第 3.01 版及更高版本lambda_sync
lambda_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_sync
和 lambda_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_name
SET 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 函數時,請小心。INSERT
、 UPDATE
和 DELETE
觸發程序會每列啟用。具有 INSERT
、 UPDATE
或 DELETE
觸發條件之資料表上的寫入密集工作負載會導致對 AWS Lambda 函數的大量呼叫。