메뉴
Amazon Relational Database Service
사용 설명서 (API Version 2014-10-31)

Amazon Aurora DB 클러스터에서 Lambda 함수 호출

참고

Amazon Aurora 버전 1.8 이상에서 AWS Lambda를 통합할 수 있습니다. Aurora 버전에 대한 자세한 내용은 Amazon Aurora 데이터베이스 엔진 업데이트을(를) 참조하십시오.

mysql.lambda_async 프로시저를 호출하여 Amazon Aurora DB 클러스터에서 AWS Lambda 함수를 호출할 수 있습니다. 이 방식은 Amazon Aurora에서 실행 중인 데이터베이스를 다른 AWS 서비스와 통합하려는 경우에 유용합니다. 예를 들어 데이터베이스의 특정 테이블에 행이 삽입될 때마다 Amazon Simple Notification Service(Amazon SNS)를 사용하여 알림을 보낼 수 있습니다.

Lambda 함수를 호출하려면 Aurora DB 클러스터에 AWS Lambda 액세스 권한을 부여합니다. 필요한 권한이 있는 IAM 역할을 만든 다음 해당 역할을 DB 클러스터와 연결하여 권한을 부여합니다. 또한 AWS Lambda으로의 아웃바운드 연결을 허용하도록 Aurora DB 클러스터를 구성해야 합니다. 사용자를 대신하여 Aurora DB 클러스터가 AWS Lambda과 통신하도록 허용하는 방법에 대한 자세한 내용 및 지침은 사용자를 대신하여 다른 AWS 서비스에 액세스하도록 Amazon Aurora에 권한 부여을(를) 참조하십시오.

Lambda 함수 호출을 위한 mysql.lambda_async 프로시저 작업

mysql.lambda_async 프로시저는 Lambda 함수를 비동기 방식으로 호출하는 기본 제공 저장 프로시저입니다. 이 프로시저를 사용하려면 데이터베이스 사용자가 mysql.lambda_async 저장 프로시저에 대한 실행 권한이 있어야 합니다.

구문

Copy
CALL mysql.lambda_async ( lambda_function_ARN, lambda_function_input )

파라미터

lambda_function_ARN

호출할 Lambda 함수의 Amazon 리소스 이름(ARN)입니다.

lambda_function_input

호출되는 Lambda 함수에 대한 입력 문자열(JSON 형식)입니다.

예제

트리거나 클라이언트 코드와 같은 여러 소스에서 호출할 수 있는 저장 프로시저의 mysql.lambda_async 프로시저에 대한 호출을 래핑하는 것이 좋습니다. 이 방식을 사용하면 임피던스 불일치 문제를 방지하고 Lambda 함수를 보다 쉽게 호출할 수 있습니다.

예: AWS Lambda 함수를 호출하여 이메일 보내기

다음 예에서는 Lambda 함수를 사용하여 이메일을 보내기 위해 데이터베이스 코드에서 호출할 수 있는 저장 프로시저를 생성합니다.

AWS Lambda 함수

Copy
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'] } } } )

저장 프로시저

Copy
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 함수 호출

Copy
mysql> call SES_send_email('example_from@amazon.com', 'example_to@amazon.com', 'Email subject', 'Email content');

예: AWS Lambda 함수를 호출하여 트리거에서 이벤트 게시

다음 예에서는 Amazon SNS를 사용하여 이벤트를 게시하는 저장 프로시저를 생성합니다. 이 코드는 테이블에 행이 추가되면 트리거에서 프로시저를 호출합니다.

참고

쓰기 트래픽이 높은 테이블에서 트리거로 AWS Lambda 기능을 호출할 때는 주의하십시오. INSERT, UPDATE, DELETE 트리거는 행마다 활성화됩니다. INSERT, UPDATE, DELETE 트리거가 있는 테이블에서 쓰기가 많은 워크로드는 AWS Lambda 기능에 다량의 호출을 야기합니다.

mysql.lambda_async 절차에 대한 호출은 비동기식이지만 트리거는 동기식입니다. 다량의 트리거 활성화를 야기하는 명령문은 AWS Lambda 기능 종료에 대한 호출을 기다리지 않고, 다만 트리거 종료를 기다린 다음에 클라이언트로 제어를 돌려줍니다.

AWS Lambda 함수

Copy
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' )

저장 프로시저

Copy
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 ;

Copy
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;

트리거

Copy
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 ;

알림 트리거를 위하여 테이블에 행 삽입

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

관련 주제