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

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 TO user@domain-or-ip-address

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

REVOKE AWS_LAMBDA_ACCESS FROM user@domain-or-ip-address
ヒント

Aurora MySQL バージョン 3 でロールテクニックを使用する場合は、SET ROLE role_name または SET 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

Aurora MySQL バージョン 2 での権限の付与

Aurora MySQL バージョン 2 では、ネイティブ関数を呼び出すユーザーには 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_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 関数を呼び出すときは注意してください。INSERTUPDATEDELETE のトリガーは行ごとにアクティブになります。INSERTUPDATE、または DELETE トリガーがあるテーブルの書き込み負荷が高いと、AWS Lambda 関数の大量の呼び出しが発生します。