

# Como invocar uma função do Lambda com uma função nativa do Aurora MySQL
<a name="AuroraMySQL.Integrating.NativeLambda"></a>

**nota**  
É possível chamar as funções nativas `lambda_sync` e `lambda_async` ao utilizar o Aurora MySQL versão 2 ou o Aurora MySQL versão 3.01 e posteriores. Para obter mais informações sobre as versões do Aurora MySQL, consult [Atualizações do mecanismo de banco de dados Amazon Aurora MySQLSuporte de longo prazo (LTS) e versões beta do Amazon Aurora MySQL](AuroraMySQL.Updates.md).

Você pode invocar uma função do AWS Lambda a partir de um cluster de banco de dados Aurora MySQL chamando as funções nativas `lambda_sync` e `lambda_async`. Essa abordagem pode ser útil quando você desejar integrar o banco de dados em execução no Aurora MySQL a outros produtos da AWS. Por exemplo, você pode querer enviar uma notificação usando o Amazon Simple Notification Service (Amazon SNS) sempre que uma linha for inserida em uma tabela específica no seu banco de dados.

**Contents**
+ [Como trabalhar com funções nativas para uma função do Lambda](#AuroraMySQL.Integrating.NativeLambda.lambda_functions)
  + [Conceder o perfil no Aurora MySQL versão 3](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.v3)
  + [Conceder o privilégio no Aurora MySQL versão 2](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.v2)
  + [Sintaxe para a função lambda\$1sync](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Syntax)
  + [Parâmetros para a função lambda\$1sync](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Parameters)
  + [Exemplo da função lambda\$1sync](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Example)
  + [Sintaxe para a função lambda\$1async](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Syntax)
  + [Parâmetros para a função lambda\$1async](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Parameters)
  + [Exemplo da função lambda\$1async](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Example)
  + [Invocar uma função do Lambda em um gatilho](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.trigger)

## Como trabalhar com funções nativas para uma função do Lambda
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions"></a>

As funções `lambda_sync` e `lambda_async` são funções nativas incorporadas que invocam uma função do Lambda de forma síncrona ou assíncrona. Quando for necessário saber o resultado da função do Lambda antes de passar para outra ação, use a função síncrona `lambda_sync`. Quando não for necessário saber o resultado da função Lambda antes de passar para outra ação, use a função assíncrona `lambda_async`.

### Conceder o perfil no Aurora MySQL versão 3
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.v3"></a>

No Aurora MySQL versão 3, o usuário que invoca uma função nativa deve receber a função `AWS_LAMBDA_ACCESS`. Para conceder essa função a um usuário, conecte-se à instância de banco de dados como usuário administrativo e execute o seguinte comando.

```
GRANT AWS_LAMBDA_ACCESS TO user@domain-or-ip-address
```

É possível revogar essa função executando a seguinte instrução.

```
REVOKE AWS_LAMBDA_ACCESS FROM user@domain-or-ip-address
```

**dica**  
Ao utilizar a técnica de perfil no Aurora MySQL versão 3, você também pode ativar o perfil usando a instrução `SET ROLE role_name` ou `SET ROLE ALL`. Se não estiver familiarizado com o sistema de funções do MySQL 8.0, é possível saber mais em [Modelo de privilégios baseados em funções](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model). Para ver mais detalhes, consulte [Using roles](https://dev.mysql.com/doc/refman/8.0/en/roles.html) no *MySQL Reference Manual*.  
Isso se aplica somente à sessão ativa atual. Ao se reconectar, execute a declaração `SET ROLE` novamente para conceder privilégios. Para ter mais informações, consulte a [instrução SET ROLE](https://dev.mysql.com/doc/refman/8.0/en/set-role.html) no *Guia de referência do MySQL*.  
Você pode usar o parâmetro `activate_all_roles_on_login` de cluster de banco de dados para ativar automaticamente todos os perfis quando um usuário se conecta a uma instância de banco de dados. Quando esse parâmetro está definido, não é necessário chamar a declaração `SET ROLE` explicitamente para ativar um perfil. Para ter mais informações, consulte [activate\$1all\$1roles\$1on\$1login](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_activate_all_roles_on_login) no *Guia de referência do MySQL*.  
No entanto, é necessário chamar `SET ROLE ALL` explicitamente no início de um procedimento armazenado para ativar o perfil, quando o procedimento armazenado é chamado por um usuário diferente.

Se você receber um erro como o seguinte ao tentar invocar uma função do Lambda, execute uma instrução `SET ROLE`.

```
SQL Error [1227] [42000]: Access denied; you need (at least one of) the Invoke Lambda privilege(s) for this operation
```

Verifique se você está concedendo o perfil ao usuário correto, conforme mostrado nas entradas da tabela `mysql.users`. Pode haver vários usuários com o mesmo nome, mas em hosts diferentes. Dependendo de qual aplicação ou host está invocando a função `lambda_sync`, o MySQL seleciona o usuário com a melhor correspondência de acordo com as entradas da coluna `host`.

### Conceder o privilégio no Aurora MySQL versão 2
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.v2"></a>

No Aurora MySQL versão 2, o usuário que invoca uma função nativa deve receber o privilégio `INVOKE LAMBDA`. Para conceder esse privilégio a um usuário, conecte-se à instância de banco de dados como usuário administrativo e execute o seguinte comando.

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

Você pode revogar esse privilégio executando o seguinte comando.

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

### Sintaxe para a função lambda\$1sync
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Syntax"></a>

Invoque a função `lambda_sync` de forma síncrona com o tipo de invocação `RequestResponse`. A função retorna o resultado da invocação do Lambda em uma carga JSON. A função tem a seguinte sintaxe.

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

### Parâmetros para a função lambda\$1sync
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Parameters"></a>

A função `lambda_sync` tem os parâmetros a seguir.

* lambda\$1function\$1ARN *  
O nome de recurso da Amazon (ARN) da função Lambda a ser invocada.

* JSON\$1payload *  
A carga para a função do Lambda, no formato JSON.

**nota**  
O Aurora MySQL versão 3 oferece suporte às funções de análise JSON do MySQL 8.0. No entanto, o Aurora MySQL versão 2 não inclui essas funções. A análise JSON não é necessária quando uma função do Lambda retorna um valor atômico, como um número ou uma string.

### Exemplo da função lambda\$1sync
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Example"></a>

A consulta a seguir, baseada em `lambda_sync`, invoca a função do Lambda `BasicTestLambda` de forma síncrona usando o ARN da função. A carga para a função é `{"operation": "ping"}`.

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

### Sintaxe para a função lambda\$1async
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Syntax"></a>

Invoque a função `lambda_async` de forma assíncrona com o tipo de invocação `Event`. A função retorna o resultado da invocação do Lambda em uma carga JSON. A função tem a seguinte sintaxe.

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

### Parâmetros para a função lambda\$1async
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Parameters"></a>

A função `lambda_async` tem os parâmetros a seguir.

* lambda\$1function\$1ARN *  
O nome de recurso da Amazon (ARN) da função Lambda a ser invocada.

* JSON\$1payload *  
A carga para a função do Lambda, no formato JSON.

**nota**  
O Aurora MySQL versão 3 oferece suporte às funções de análise JSON do MySQL 8.0. No entanto, o Aurora MySQL versão 2 não inclui essas funções. A análise JSON não é necessária quando uma função do Lambda retorna um valor atômico, como um número ou uma string.

### Exemplo da função lambda\$1async
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Example"></a>

A consulta a seguir, baseada em `lambda_async`, invoca a função do Lambda `BasicTestLambda` de forma assíncrona usando o ARN da função. A carga para a função é `{"operation": "ping"}`.

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

### Invocar uma função do Lambda em um gatilho
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.trigger"></a>

Você pode usar triggers para chamar o Lambda em instruções de modificação de dados. O exemplo a seguir usa a função `lambda_async` nativa e armazena o resultado em uma variável.

```
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 ;
```

**nota**  
Os gatilhos não são executados uma vez a cada instrução SQL, mas uma vez por linha alterada, uma linha por vez. Quando um trigger é executado, o processo é síncrono. A instrução de modificação de dados só retorna quando o trigger é concluído.  
Tenha cuidado ao invocar uma função do AWS Lambda de triggers em tabelas que apresentam alto tráfego de gravação. Os triggers `INSERT`, `UPDATE` e `DELETE` são ativados por linha. Uma workload com muitas gravações em uma tabela com triggers `INSERT`, `UPDATE` ou `DELETE` resulta em um grande número de chamadas para a sua função do AWS Lambda.