

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

# 使用 Aurora MySQL 預存程序叫用 Lambda 函式 (已棄用)
<a name="AuroraMySQL.Integrating.ProcLambda"></a>

您可以透過呼叫 `mysql.lambda_async` 程序，從 Aurora MySQL 資料庫叢集叫用 AWS Lambda 函數。當您想要將 Aurora MySQL 上執行的資料庫與其他 AWS 服務整合時，此方法非常有用。例如，每當資料庫的特定資料表中插入一列時，您可能想要使用 Amazon Simple Notification Service (Amazon SNS) 傳送通知。

**Contents**
+ [Aurora MySQL 版本考量](#AuroraMySQL.Integrating.ProcLambda.caveats)
+ [使用 mysql.lambda\$1async 程序呼叫 Lambda 函數 (已棄用)](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async)
  + [語法](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Syntax)
  + [Parameters](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Parameters)
  + [範例](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Examples)

## Aurora MySQL 版本考量
<a name="AuroraMySQL.Integrating.ProcLambda.caveats"></a>

從 Aurora MySQL 第 2 版開始，您可以使用原生函數方法，而不是這些預存程序來叫用 Lambda 函數。如需原生函數的詳細資訊，請參閱[使用原生函數呼叫 Lambda 函數](AuroraMySQL.Integrating.NativeLambda.md#AuroraMySQL.Integrating.NativeLambda.lambda_functions)。

Aurora MySQL 第 2 版不再支援預存程序 `mysql.lambda_async`。強烈建議改用原生 Lambda 函數。

在 Aurora MySQL 第 3 版中，無法使用預存程序。

## 使用 mysql.lambda\$1async 程序呼叫 Lambda 函數 (已棄用)
<a name="AuroraMySQL.Integrating.Lambda.mysql_lambda_async"></a>

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

### 語法
<a name="AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Syntax"></a>

`mysql.lambda_async` 程序的語法如下。

```
CALL mysql.lambda_async (
  lambda_function_ARN,
  lambda_function_input
)
```

### Parameters
<a name="AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Parameters"></a>

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

* lambda\$1function\$1ARN *  
要呼叫之 Lambda 函數的 Amazon Resource Name (ARN)。

* lambda\$1function\$1input *  
所呼叫之 Lambda 函數的輸入字串 (JSON 格式)。

### 範例
<a name="AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Examples"></a>

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

**注意**  
在經歷高寫入流量的資料表上叫用 AWS Lambda 函數時，請小心。`INSERT`、 `UPDATE`和 `DELETE`觸發會依資料列啟用。具有 `INSERT`、`UPDATE` 或 `DELETE` 觸發條件之資料表上的大量寫入工作負載，會導致對 AWS Lambda 函數的大量呼叫。  
雖然呼叫 `mysql.lambda_async` 程序為非同步執行，但觸發條件是同步執行。導致觸發條件大量引發的陳述式不會等待 AWS Lambda 函數呼叫完成，但會等待觸發條件完成才將控制權交回用戶端。

**Example 範例：叫用 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');
```

**Example 範例：叫用 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!');
```