

# 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)
+ [Lambda 함수(사용되지 않음) 호출을 위한 mysql.lambda\_async 프로시저로 작업](#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에서 저장 프로시저는 사용할 수 없습니다.

## Lambda 함수(사용되지 않음) 호출을 위한 mysql.lambda\_async 프로시저로 작업
<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\_function\_ARN *  
호출할 Lambda 함수의 Amazon 리소스 이름(ARN)입니다.

* lambda\_function\_input *  
호출되는 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;
```
**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!');
```