メニュー
Amazon Relational Database Service
ユーザーガイド (API Version 2014-10-31)

Amazon Aurora DB クラスターから Lambda 関数を呼び出す

注記

AWS Lambda との統合は、Amazon Aurora バージョン 1.8 以降で使用できます。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 とやり取りすることを許可する方法の詳細と手順については、「ユーザーの代わりに Amazon Aurora から他の AWS のサービスにアクセスすることを許可する」を参照してください。

mysql.lambda_async プロシージャを使って Lambda 関数を呼び出す

mysql.lambda_async プロシージャは、Lambda 関数を非同期的に呼び出す組み込みストアドプロシージャです。このプロシージャを使用するには、mysql.lambda_async ストアドプロシージャに対する実行権限がデータベースユーザーに必要です。

構文

Copy
CALL mysql.lambda_async ( lambda_function_ARN, lambda_function_input )

Parameters

lambda_function_ARN

呼び出す Lambda 関数の Amazon リソースネーム (ARN)。

lambda_function_input

呼び出した Lambda 関数の入力文字列 (JSON 形式)。

ベストプラクティスとして、mysql.lambda_async プロシージャへの呼び出しはストアドプロシージャでラップし、トリガーやクライアントコードなどのさまざまなソースから呼び出せるようにすることをお勧めします。このアプローチにより、インピーダンス不整合の問題を回避し、Lambda 関数を簡単に呼び出せるようになります。

例: AWS Lambda 関数を呼び出して E メールを送信する

次の例では、データベースコードで呼び出せるストアドプロシージャを作成し、Lambda 関数を使用して E メールを送信します。

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;

Trigger

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

関連トピック