Aurora MySQL ストアドプロシージャを使用した Lambda 関数の呼び出し (非推奨) - Amazon Aurora

Aurora MySQL ストアドプロシージャを使用した Lambda 関数の呼び出し (非推奨)

mysql.lambda_async プロシージャを呼び出すことで、Aurora MySQL DB クラスターから AWS Lambda 関数を呼び出すことができます。このアプローチは、Aurora MySQL で実行しているデータベースを 他の AWS のサービスと統合するときに便利です。例えば、データベースの特定のテーブルに行が挿入されるたびに Amazon Simple Notification Service (Amazon SNS) を使用して通知を送信するような場合があります。

Aurora MySQL バージョンに関する考慮事項

Aurora MySQL バージョン 2 から、これらのストアドプロシージャの代わりにネイティブ関数メソッドを使用して Lambda 関数を呼び出すことができます。ネイティブ関数の詳細については、「ネイティブ関数を使用した Lambda 関数の呼び出し」を参照してください。

Aurora MySQL バージョン 2 では、ストアドプロシージャ mysql.lambda_async はサポートされなくなりました。代わりに、ネイティブの Lambda 関数を使用することを強くお勧めします。

Aurora MySQL バージョン 3 では、ストアドプロシージャは使用できません。

mysql.lambda_async プロシージャを使用した Lambda 関数の呼び出し (非推奨)

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

構文

mysql.lambda_async プロシージャの構文は次のとおりです。

CALL mysql.lambda_async ( lambda_function_ARN, lambda_function_input )

パラメータ

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

lambda_function_ARN

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

lambda_function_input

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

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

注記

書き込みトラフィックが多いテーブルのトリガーから AWS Lambda 関数を呼び出すときは注意してください。INSERTUPDATEDELETE のトリガーは行ごとにアクティブになります。INSERTUPDATE、または DELETE トリガーがあるテーブルの書き込み負荷が高いと、AWS Lambda 関数の大量の呼び出しが発生します。

mysql.lambda_async プロシージャの呼び出しは非同期ですが、トリガーは同期です。大量のトリガーのアクティベーションを発生させるステートメントは、AWS Lambda 関数の呼び出しが完了するのを待機しませんが、クライアントに制御を返す前にトリガーが完了するのを待ちます。

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