

# Aurora MySQL ネイティブ関数を使用した Lambda 関数の呼び出し
<a name="AuroraMySQL.Integrating.NativeLambda"></a>

**注記**  
Aurora MySQL バージョン 2 または Aurora MySQL バージョン 3.01 以降を使用しているときには、ネイティブ関数 `lambda_sync` および `lambda_async` を呼び出すことができます。Aurora MySQL のバージョンの詳細については、「[Amazon Aurora MySQL のデータベースエンジンの更新Amazon Aurora MySQL の長期サポート (LTS) とベータリリース](AuroraMySQL.Updates.md)」を参照してください。

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

**Contents**
+ [ネイティブ関数を使用した Lambda 関数の呼び出し](#AuroraMySQL.Integrating.NativeLambda.lambda_functions)
  + [Aurora MySQL バージョン 3 でのロールの付与](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.v3)
  + [Aurora MySQL バージョン 2 での権限の付与](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.v2)
  + [lambda\$1sync 関数の構文](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Syntax)
  + [lambda\$1sync 関数のパラメータ](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Parameters)
  + [lambda\$1sync 関数の例](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Example)
  + [lambda\$1async 関数の構文](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Syntax)
  + [lambda\$1async 関数のパラメータ](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Parameters)
  + [lambda\$1async 関数の例](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Example)
  + [トリガーを使用した Lambda 関数の呼び出し](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.trigger)

## ネイティブ関数を使用した Lambda 関数の呼び出し
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions"></a>

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

### Aurora MySQL バージョン 3 でのロールの付与
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.v3"></a>

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 ロールシステムに馴染みがない場合は、[ロールベースの特権モデル](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model) で詳細を確認頂けます。詳細については、「MySQL リファレンスマニュアル」の「[Using roles](https://dev.mysql.com/doc/refman/8.0/en/roles.html)」を参照してください。**  
これは現在アクティブなセッションにのみ適用されます。再接続するときは、`SET ROLE` ステートメントを再度実行して権限を付与する必要があります。詳細については、*MySQL リファレンスマニュアル*の「[SET ROLE ステートメント](https://dev.mysql.com/doc/refman/8.0/en/set-role.html)」を参照してください。  
ユーザーが DB インスタンスに接続したときに、`activate_all_roles_on_login` DB クラスターパラメータを使用して、すべてのロールを自動的に有効化できます。このパラメータを設定すると、通常、`SET ROLE` ステートメントを明示的に呼び出してロールをアクティブ化する必要はありません。詳細については、*MySQL リファレンスマニュアル*の「[activate\$1all\$1roles\$1on\$1login](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_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 での権限の付与
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.v2"></a>

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\$1sync 関数の構文
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Syntax"></a>

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

```
lambda_sync (
  lambda_function_ARN,
  JSON_payload
)
```

### lambda\$1sync 関数のパラメータ
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Parameters"></a>

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

* lambda\$1function\$1ARN *  
呼び出す Lambda 関数の Amazon リソースネーム (ARN)。

* JSON\$1payload *  
呼び出した Lambda 関数の JSON 形式のペイロード

**注記**  
Aurora MySQL バージョン 3 は MySQL 8.0 からの JSON 分析関数をサポートしています。ただし、Aurora MySQL バージョン 2 には、これらの関数は含まれていません。Lambda 関数が、数値や文字列など、アトミック値を返す場合、JSON 分析は必要ありません。

### lambda\$1sync 関数の例
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Example"></a>

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

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

### lambda\$1async 関数の構文
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Syntax"></a>

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

```
lambda_async (
  lambda_function_ARN,
  JSON_payload
)
```

### lambda\$1async 関数のパラメータ
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Parameters"></a>

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

* lambda\$1function\$1ARN *  
呼び出す Lambda 関数の Amazon リソースネーム (ARN)。

* JSON\$1payload *  
呼び出した Lambda 関数の JSON 形式のペイロード

**注記**  
Aurora MySQL バージョン 3 は MySQL 8.0 からの JSON 分析関数をサポートしています。ただし、Aurora MySQL バージョン 2 には、これらの関数は含まれていません。Lambda 関数が、数値や文字列など、アトミック値を返す場合、JSON 分析は必要ありません。

### lambda\$1async 関数の例
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Example"></a>

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

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

### トリガーを使用した Lambda 関数の呼び出し
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.trigger"></a>

トリガーを使用して、データ変更ステートメントで 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 関数の大量の呼び出しが発生します。