Amazon Relational Database Service
ユーザーガイド (API バージョン 2014-10-31)

Amazon Aurora MySQL DB クラスターからの Lambda 関数の呼び出し

MySQL と互換性がある Amazon Aurora DB クラスターから AWS Lambda 関数を呼び出すには、ネイティブ関数またはストアドプロシージャを使用します。Aurora MySQL から Lambda 関数を呼び出すには、Aurora DB クラスターから Lambda にアクセスできる必要があります。

Aurora MySQL バージョン 1.16 以上の場合は、Aurora MySQL ネイティブ関数の使用をお勧めします。Aurora MySQL バージョン 1.16 より、ストアドプロシージャの使用が廃止されています。

Aurora に対する Lambda へのアクセス権限の付与

Aurora MySQL から Lambda 関数を呼び出す前に、まず Lambda へのアクセス権限を Aurora MySQL DB クラスターに付与する必要があります。

Lambda へのアクセス権限を Aurora MySQL に付与するには

  1. Aurora MySQL DB クラスターからの Lambda 関数の呼び出しを許可するアクセス権限を付与する AWS Identity and Access Management (IAM) ポリシーを作成します。手順については、「AWS Lambda リソースにアクセスするための IAM ポリシーの作成」を参照してください。

  2. IAM ロールを作成して、「AWS Lambda リソースにアクセスするための IAM ポリシーの作成」で作成した IAM ポリシーを新しい IAM ロールにアタッチします。手順については、「Amazon Aurora から AWS のサービスにアクセスすることを許可する IAM ロールの作成」を参照してください。

  3. DB クラスターの aws_default_lambda_role パラメータを新しい IAM ロールの Amazon リソースネーム (ARN) に設定します。

    DB クラスターのパラメータの詳細については、「Amazon Aurora DB クラスターパラメータと DB インスタンスパラメータ」を参照してください。

  4. Aurora MySQL DB クラスター内のデータベースユーザーが Lambda 関数を呼び出せるように、「Amazon Aurora から AWS のサービスにアクセスすることを許可する IAM ロールの作成」で作成したロールをその DB クラスターに関連付けます。DB クラスターへの IAM ロールの関連付けの詳細については、「IAM ロールと Amazon Aurora MySQL DB クラスターの関連付け」を参照してください。

  5. Lambda へのアウトバウンド接続を許可するように Aurora MySQL DB クラスターを設定します。手順については、「Amazon Aurora MySQL から AWS の他のサービスへのネットワーク通信の有効化」を参照してください。

Aurora MySQL ネイティブ関数を使用した Lambda 関数の呼び出し

注記

Aurora MySQL バージョン 1.16 以降を使用する場合、ネイティブ関数 lambda_sync および lambda_async を呼び出すことができます。Aurora MySQL バージョンの詳細については、「Amazon Aurora MySQL データベースエンジンの更新」を参照してください。

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

ネイティブ関数を使用した Lambda 関数の呼び出し

lambda_sync 関数と lambda_async 関数は、Lambda 関数を同期的および非同期に呼び出す組み込みのネイティブ関数です。別のアクションに移る前に、呼び出した関数の実行結果を知る必要がある場合は、同期関数 lambda_sync を使用します。別のアクションに移る前に、呼び出した関数の実行結果を知る必要がない場合は、非同期関数 lambda_async を使用します。

ネイティブ関数を呼び出しているユーザーに INVOKE LAMBDA 権限が付与されている必要があります。ユーザーにこの権限を付与するには、DB インスタンスにマスターユーザーとして接続し、次のステートメントを実行します。

GRANT INVOKE LAMBDA ON *.* TO user@domain-or-ip-address

次のステートメントを実行することで、この権限を取り消すことができます。

REVOKE INVOKE LAMBDA ON *.* FROM user@domain-or-ip-address

lambda_sync 関数の構文

lambda_sync 関数を RequestResponse 呼び出しタイプで同期的に呼び出します。関数は、JSON ペイロードで Lambda 呼び出しの結果を返します。関数の構文は次の通りです。

lambda_sync ( lambda_function_ARN, JSON_payload )

注記

トリガーを使用して、データ変更ステートメントで Lambda を呼び出すことができます。トリガーは SQL ステートメントごとに 1 回実行されるのではなく、行ごとに 1 回、一度に 1 行ずつ変更されます。トリガーの実行は同期的で、トリガーの実行が完了するまでデータ変更ステートメントは戻りません。

大量の書き込みトラフィックが発生するテーブルのトリガーから AWS Lambda 関数を呼び出す場合は注意が必要です。INSERT、UPDATE、DELETE のトリガーは行ごとに有効になります。INSERT、UPDATE、または DELETE トリガーがあるテーブルの書き込み負荷が高いと、AWS Lambda 関数の大量の呼び出しが発生します。

lambda_sync 関数のパラメータ

lambda_sync 関数には以下のパラメータがあります。

lambda_function_ARN

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

JSON_payload

呼び出した Lambda 関数の JSON 形式の ペイロード

注記

Aurora MySQL は、JSON 解析をサポートしていません。Lambda 関数が、数値や文字列など、アトミック値を返す場合、JSON 解析は必要ありません。

lambda_sync 関数の例

lambda_sync に基づく次のクエリは、関数 ARN を使用して Lambda 関数 BasicTestLambda を同期的に呼び出します。関数のペイロードは {"operation": "ping"} です。

SELECT lambda_sync( 'arn:aws:lambda:us-east-1:868710585169:function:BasicTestLambda', '{"operation": "ping"}');

lambda_async 関数の構文

lambda_async 関数を Event 呼び出しタイプで非同期に呼び出します。関数は、JSON ペイロードで Lambda 呼び出しの結果を返します。関数の構文は次の通りです。

lambda_async ( lambda_function_ARN, JSON_payload )

lambda_async 関数のパラメータ

lambda_async 関数には以下のパラメータがあります。

lambda_function_ARN

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

JSON_payload

呼び出した Lambda 関数の JSON 形式の ペイロード

注記

Aurora MySQL は、JSON 解析をサポートしていません。Lambda 関数が、数値や文字列など、アトミック値を返す場合、JSON 解析は必要ありません。

lambda_async 関数の例

lambda_async に基づく次のクエリは、関数 ARN を使用して Lambda 関数 BasicTestLambda を非同期に呼び出します。関数のペイロードは {"operation": "ping"} です。

SELECT lambda_async( 'arn:aws:lambda:us-east-1:868710585169:function:BasicTestLambda', '{"operation": "ping"}');

関連トピック

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

注記

Aurora MySQL バージョン 1.8 以降の場合、AWS Lambda との直接統合を使用できます。Aurora MySQL バージョンの詳細については、「Amazon Aurora MySQL データベースエンジンの更新」を参照してください。

Amazon Aurora バージョン 1.16 より、ストアドプロシージャ mysql.lambda_async が廃止されています。Aurora バージョン 1.16 以降を使用している場合は、代わりにネイティブ Lambda 関数を使用することを強くお勧めします。詳細については、「ネイティブ関数を使用した Lambda 関数の呼び出し」を参照してください。

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

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

mysql.lambda_async プロシージャは、Lambda 関数を非同期的に呼び出す組み込みストアドプロシージャです。このプロシージャを使用するには、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 関数を呼び出す場合は注意が必要です。INSERT、UPDATE、DELETE のトリガーは行ごとに有効になります。INSERT、UPDATE、または 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!');

関連トピック