Aurora MySQL ネイティブ関数を使用した Lambda 関数の呼び出し
注記
Aurora MySQL バージョン 2 または Aurora MySQL バージョン 3.01 以降を使用しているときには、ネイティブ関数 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 関数の結果を知る必要がある場合は、同期関数 lambda_sync を使用します。別のアクションに移る前に、呼び出した Lambda 関数の結果を知る必要がない場合は、非同期関数 lambda_async を使用します。
Aurora MySQL バージョン 3 でのロールの付与
Aurora MySQL バージョン 3 では、ネイティブ関数を呼び出すユーザーは AWS_LAMBDA_ACCESS ロールが付与されている必要があります。ユーザーにこのロールを付与するには、DB インスタンスに管理者ユーザーとして接続し、次のステートメントを実行します。
GRANT AWS_LAMBDA_ACCESS TOuser@domain-or-ip-address
次のステートメントを実行することで、このロールを取り消すことができます。
REVOKE AWS_LAMBDA_ACCESS FROMuser@domain-or-ip-address
ヒント
Aurora MySQL バージョン 3 でロールテクニックを使用する場合は、SET ROLE または role_nameSET ROLE
ALL ステートメントを使用してロールを有効化することもできます。MySQL 8.0 ロールシステムに馴染みがない場合は、ロールベースの特権モデル で詳細を確認頂けます。詳細については、「MySQL リファレンスマニュアル」の「Using roles
これは現在アクティブなセッションにのみ適用されます。再接続するときは、SET ROLE ステートメントを再度実行して権限を付与する必要があります。詳細については、MySQL リファレンスマニュアルの「SET ROLE ステートメント
ユーザーが DB インスタンスに接続したときに、activate_all_roles_on_login DB クラスターパラメータを使用して、すべてのロールを自動的に有効化できます。このパラメータを設定すると、通常、SET ROLE ステートメントを明示的に呼び出してロールをアクティブ化する必要はありません。詳細については、MySQL リファレンスマニュアルの「activate_all_roles_on_login
ただし、ストアドプロシージャを別のユーザーから呼び出す場合は、ストアドプロシージャの先頭で SET ROLE ALL を明示的に呼び出してロールをアクティブ化する必要があります。
Lambda 関数を呼び出そうとしたときに次のようなエラーが表示される場合は、SET ROLE ステートメントを実行します。
SQL Error [1227] [42000]: Access denied; you need (at least one of) the Invoke Lambda privilege(s) for this operation
mysql.users テーブルエントリに示すように、ロールを正しいユーザーに付与していることを確認します。同じ名前の複数のユーザーが異なるホストにいる可能性があります。lambda_sync 関数を呼び出すアプリケーションまたはホストに応じて、MySQL は host 列のエントリに従って最適なユーザーを選択します。
Aurora MySQL バージョン 2 での権限の付与
Aurora MySQL バージョン 2 では、ネイティブ関数を呼び出すユーザーには INVOKE LAMBDA 権限が付与されている必要があります。ユーザーにこの権限を付与するには、DB インスタンスに管理者ユーザーとして接続し、次のステートメントを実行します。
GRANT INVOKE LAMBDA ON *.* TOuser@domain-or-ip-address
次のステートメントを実行することで、この権限を取り消すことができます。
REVOKE INVOKE LAMBDA ON *.* FROMuser@domain-or-ip-address
lambda_sync 関数の構文
lambda_sync 関数を RequestResponse 呼び出しタイプで同期的に呼び出します。関数は、JSON ペイロードで Lambda 呼び出しの結果を返します。関数の構文は次のとおりです。
lambda_sync (
lambda_function_ARN,
JSON_payload
)
lambda_sync 関数のパラメータ
lambda_sync 関数には以下のパラメータがあります。
- lambda_function_ARN
-
呼び出す Lambda 関数の Amazon リソースネーム (ARN)。
- JSON_payload
-
呼び出した Lambda 関数の JSON 形式のペイロード
注記
Aurora MySQL バージョン 3 は MySQL 8.0 からの JSON 分析関数をサポートしています。ただし、Aurora MySQL バージョン 2 には、これらの関数は含まれていません。Lambda 関数が、数値や文字列など、アトミック値を返す場合、JSON 分析は必要ありません。
lambda_sync 関数の例
lambda_sync に基づく次のクエリは、関数 ARN を使用して Lambda 関数 BasicTestLambda を同期的に呼び出します。関数のペイロードは {"operation": "ping"} です。
SELECT lambda_sync( 'arn:aws:lambda:us-east-1:123456789012: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 バージョン 3 は MySQL 8.0 からの JSON 分析関数をサポートしています。ただし、Aurora MySQL バージョン 2 には、これらの関数は含まれていません。Lambda 関数が、数値や文字列など、アトミック値を返す場合、JSON 分析は必要ありません。
lambda_async 関数の例
lambda_async に基づく次のクエリは、関数 ARN を使用して Lambda 関数 BasicTestLambda を非同期的に呼び出します。関数のペイロードは {"operation": "ping"} です。
SELECT lambda_async( 'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda', '{"operation": "ping"}');
トリガーを使用した Lambda 関数の呼び出し
トリガーを使用して、データ変更ステートメントで Lambda を呼び出すことができます。次の例では、lambda_async ネイティブ関数を使用して変数に結果を保存します。
mysql>SET @result=0;mysql>DELIMITER //mysql>CREATE TRIGGER myFirstTrigger AFTER INSERT ON Test_trigger FOR EACH ROW BEGIN SELECT lambda_async( 'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda', '{"operation": "ping"}') INTO @result; END; //mysql>DELIMITER ;
注記
トリガーは SQL ステートメントごとに 1 回実行されるのではなく、行ごとに 1 回、一度に 1 行ずつ変更されます。トリガーが実行されると、プロセスは同期されます。data-modifying ステートメントは、トリガーが完了したときにのみ返されます。
書き込みトラフィックが多いテーブルのトリガーから AWS Lambda 関数を呼び出すときは注意してください。INSERT、UPDATE、DELETE のトリガーは行ごとにアクティブになります。INSERT、UPDATE、または DELETE トリガーがあるテーブルの書き込み負荷が高いと、AWS Lambda 関数の大量の呼び出しが発生します。