本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Aurora MySQL 原生函式叫用 Lambda 函式
注意
使用 Aurora MySQL 第 2 版,或 Aurora MySQL 3.01 版和更新版本時,您可以呼叫原生函數 lambda_sync 和 lambda_async。如需 Aurora MySQL 版本的詳細資訊,請參閱 Amazon Aurora MySQL 的資料庫引擎更新。
您可以透過呼叫原生函式 lambda_sync 和 lambda_async,以從 Aurora MySQL 資料庫叢集叫用 AWS Lambda 函式。當您想要整合 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 TOuser@domain-or-ip-address
您可以執行下列陳述式來撤銷此角色。
REVOKE AWS_LAMBDA_ACCESS FROMuser@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 *.* TOuser@domain-or-ip-address
您可以執行下列陳述式來撤銷此權限。
REVOKE INVOKE LAMBDA ON *.* FROMuser@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 函數時,請格外小心。INSERT、UPDATE 和 DELETE 觸發條件是針對每列啟動。具有 INSERT、UPDATE 或 DELETE 觸發條件之資料表上的大量寫入工作負載,會導致對 AWS Lambda 函數的大量呼叫。