使用 Aurora 叫用 Lambda 函數我的SQL預存程序 (已停用) - Amazon Aurora

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

使用 Aurora 叫用 Lambda 函數我的SQL預存程序 (已停用)

您可以調用 AWS Lambda 通過調用該過mysql.lambda_async程來自 Aurora 我的數SQL據庫集群的功能。當您想要將在 Aurora My 上運行的數據庫SQL與其他集成時,此方法很有用 AWS 服務。例如,每當資料列插入資料庫中的特定資料表時,您可能想要使用 Amazon 簡單通知服務 (AmazonSNS) 傳送通知。

Aurora 我的SQL版本考量

從 Aurora 我的SQL版本 2 開始,您可以使用原生函數方法而不是這些預存程序來叫用 Lambda 函數。如需原生函數的詳細資訊,請參閱使用原生函數呼叫 Lambda 函數

在 Aurora 我的SQL版本 2 中,不再支援預存程序mysql.lambda_async。強烈建議改用原生 Lambda 函數。

在 Aurora 我的SQL版本 3 中,存儲過程不可用。

使用 mysql.lambda_async 程序呼叫 Lambda 函數 (已棄用)

mysql.lambda_async 程序是內建的預存程序,可非同步叫用 Lambda 函式。資料庫使用者必須有 EXECUTE 預存程序的 mysql.lambda_async 權限,才能使用此程序。

語法

mysql.lambda_async 程序的語法如下。

CALL mysql.lambda_async ( lambda_function_ARN, lambda_function_input )

參數

mysql.lambda_async 程序具有下列參數。

羔羊田函數 _ ARN

要叫用的 Lambda 函數的 Amazon 資源名稱 (ARN)。

lambda_function_input

呼叫的 Lambda 函數的輸入字串 (以JSON格式表示)。

範例

在最佳實務上,建議您將 mysql.lambda_async 程序的呼叫包裝在預存程序中,即可供不同來源呼叫,例如觸發條件或用戶端程式碼。此方法有助於避免阻抗不符問題,讓您輕鬆呼叫 Lambda 函數。

注意

調用時要小心 AWS Lambda 來自發生高寫入流量之資料表上觸發程序的功能。 INSERTUPDATE、和DELETE觸發程序會每列啟動。具有INSERT、或DELETE觸發器的資料表上需要大量寫入的工作負載UPDATE,會導致大量呼叫您的 AWS Lambda 功能。

雖然呼叫 mysql.lambda_async 程序為非同步執行,但觸發條件是同步執行。導致大量觸發器啟動的陳述式不會等待呼叫 AWS Lambda 函數完成,但它確實等待觸發器完成,然後再將控制權返回給客戶端。

範例:呼叫 AWS Lambda 發送電子郵件的功能

下列範例建立預存程序,供您在資料庫程式碼中利用 Lambda 函數來呼叫,以傳送電子郵件。

AWS Lambda 功能

import boto3 ses = boto3.client('ses') def SES_send_email(event, context): return ses.send_email( Source=event['email_from'], Destination={ 'ToAddresses': [ event['email_to'], ] }, Message={ 'Subject': { 'Data': event['email_subject'] }, 'Body': { 'Text': { 'Data': event['email_body'] } } } )

預存程序

DROP PROCEDURE IF EXISTS SES_send_email; DELIMITER ;; CREATE PROCEDURE SES_send_email(IN email_from VARCHAR(255), IN email_to VARCHAR(255), IN subject VARCHAR(255), IN body TEXT) LANGUAGE SQL BEGIN CALL mysql.lambda_async( 'arn:aws:lambda:us-west-2:123456789012:function:SES_send_email', CONCAT('{"email_to" : "', email_to, '", "email_from" : "', email_from, '", "email_subject" : "', subject, '", "email_body" : "', body, '"}') ); END ;; DELIMITER ;

呼叫預存程序來呼叫 AWS Lambda 功能

mysql> call SES_send_email('example_from@amazon.com', 'example_to@amazon.com', 'Email subject', 'Email content');
範例:呼叫 AWS Lambda 從觸發器發布事件的函數

下列範例會建立使用 Amazon 發佈事件的預存程序SNS。當資料表中新增一列時,程式碼會從觸發條件呼叫程序。

AWS Lambda 功能

import boto3 sns = boto3.client('sns') def SNS_publish_message(event, context): return sns.publish( TopicArn='arn:aws:sns:us-west-2:123456789012:Sample_Topic', Message=event['message'], Subject=event['subject'], MessageStructure='string' )

預存程序

DROP PROCEDURE IF EXISTS SNS_Publish_Message; DELIMITER ;; CREATE PROCEDURE SNS_Publish_Message (IN subject VARCHAR(255), IN message TEXT) LANGUAGE SQL BEGIN CALL mysql.lambda_async('arn:aws:lambda:us-west-2:123456789012:function:SNS_publish_message', CONCAT('{ "subject" : "', subject, '", "message" : "', message, '" }') ); END ;; DELIMITER ;

資料表

CREATE TABLE 'Customer_Feedback' ( 'id' int(11) NOT NULL AUTO_INCREMENT, 'customer_name' varchar(255) NOT NULL, 'customer_feedback' varchar(1024) NOT NULL, PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

觸發條件

DELIMITER ;; CREATE TRIGGER TR_Customer_Feedback_AI AFTER INSERT ON Customer_Feedback FOR EACH ROW BEGIN SELECT CONCAT('New customer feedback from ', NEW.customer_name), NEW.customer_feedback INTO @subject, @feedback; CALL SNS_Publish_Message(@subject, @feedback); END ;; DELIMITER ;

在資料表中插入一列以觸發通知

mysql> insert into Customer_Feedback (customer_name, customer_feedback) VALUES ('Sample Customer', 'Good job guys!');