

# Aurora MySQL ストアドプロシージャを使用した Lambda 関数の呼び出し (非推奨)
<a name="AuroraMySQL.Integrating.ProcLambda"></a>

`mysql.lambda_async` プロシージャを呼び出すことで、Aurora MySQL DB クラスターから 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)
  + [パラメータ](#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
)
```

### パラメータ
<a name="AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Parameters"></a>

`mysql.lambda_async` プロシージャには以下のパラメータがあります。

* lambda\$1function\$1ARN *  
呼び出す Lambda 関数の Amazon リソースネーム (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 関数を呼び出して E メールを送信する**  
次の例では、データベースコードで呼び出せるストアドプロシージャを作成し、Lambda 関数を使用して E メールを送信します。  
**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;
```
**Trigger トリガー**  

```
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!');
```