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
ou role_name
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
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
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 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
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.