Como invocar uma função do Lambda com uma função nativa do Aurora MySQL - Amazon Aurora

Como invocar uma função do Lambda com uma função nativa do Aurora MySQL

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 MySQL.

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.

Como trabalhar com funções nativas para uma função do Lambda

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

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. Para ver mais detalhes, consulte Using roles 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 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_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

Conceder o privilégio no Aurora MySQL versão 2

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_sync

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_sync

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

lambda_function_ARN

O nome de recurso da Amazon (ARN) da função Lambda a ser invocada.

JSON_payload

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_sync

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_async

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_async

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

lambda_function_ARN

O nome de recurso da Amazon (ARN) da função Lambda a ser invocada.

JSON_payload

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_async

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

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.