Invocar uma função do Lambda a partir de um cluster de banco de dados do Amazon Aurora MySQL - Amazon Aurora

Invocar uma função do Lambda a partir de um cluster de banco de dados do Amazon Aurora MySQL

É possível invocar uma função do AWS Lambda em um cluster de banco de dados Amazon Aurora, edição compatível com MySQL, com uma função lambda_sync ou lambda_async nativa. Antes de invocar uma função do Lambda em um Aurora MySQL, o cluster de banco de dados Aurora deve ter acesso ao Lambda. Para obter detalhes sobre como conceder acesso para o Aurora MySQL, consulte Concessão de acesso ao Lambda para o Aurora. Para obter informações sobre as funções armazenadas lambda_sync e lambda_async, consulte Como invocar uma função do Lambda com uma função nativa do Aurora MySQL.

Você também pode chamar uma função do AWS Lambda utilizando um procedimento armazenado. No entanto, o uso de um procedimento armazenado está defasado. É altamente recomendável usar uma função nativa do Aurora MySQL se você estiver usando uma das seguintes versões do Aurora MySQL:

  • Aurora MySQL versão 2 para clusters compatíveis com o MySQL 5.7.

  • Aurora MySQL versão 3.01 e posteriores, para clusters compatíveis com o MySQL 8.0. O procedimento armazenado não está disponível no Aurora MySQL versão 3.

Concessão de acesso ao Lambda para o Aurora

Para poder invocar funções do Lambda em um cluster de banco de dados Aurora MySQL, você deve primeiro fornecer permissão ao seu cluster para acessar o Lambda.

Para conceder acesso ao Lambda para o Aurora MySQL
  1. Crie uma política do AWS Identity and Access Management (IAM) que forneça as permissões que permitem que o cluster de banco de dados Aurora MySQL invoque funções do Lambda. Para obter instruções, consulte Criar uma política do IAM para acessar recursos do AWS Lambda.

  2. Crie um perfil do IAM e anexe a política do IAM criada em Criar uma política do IAM para acessar recursos do AWS Lambda ao novo perfil do IAM. Para obter instruções, consulte Criar uma função do IAM para permitir que o Amazon Aurora acesse produtos da AWS.

  3. Defina o parâmetro de cluster de banco de dados aws_default_lambda_role como o nome de recurso da Amazon (ARN) do novo perfil do IAM.

    Se o cluster fizer parte de um banco de dados global Aurora, aplique a mesma configuração para cada cluster do Aurora no banco de dados global.

    Para obter mais informações sobre parâmetros de cluster de banco de dados, consulte Parâmetros do cluster de banco de dados e da instância de bancos de dados Amazon Aurora.

  4. Para permitir que os usuários do banco de dados em um cluster de banco de dados Aurora MySQL invoquem funções do Lambda, associe a função que você criou em Criar uma função do IAM para permitir que o Amazon Aurora acesse produtos da AWS ao cluster de banco de dados. Para obter informações sobre como associar um perfil do IAM a um cluster de banco de dados, consulte Associar uma função do IAM a um cluster de banco de dados do Amazon Aurora MySQL.

    Se o cluster fizer parte de um banco de dados global Aurora, associe a função a cada cluster do Aurora no banco de dados global.

  5. Configure o cluster de banco de dados Aurora MySQL para permitir conexões de saída com o Lambda. Para obter instruções, consulte Permitir a comunicação de rede do Amazon Aurora MySQL com outros produtos da AWS.

    Se o cluster fizer parte de um banco de dados global Aurora, habilite conexões de saída para cada cluster do Aurora no banco de dados global.

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 obter mais detalhes, consulte Usar perfis no Manual de referência do MySQL.

Isso se aplica somente à sessão ativa atual. Ao se reconectar, execute a instruçã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 instruçã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.

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.

Invocar uma função do Lambda com um procedimento armazenado do Aurora MySQL (defasado)

Você pode invocar uma função do AWS Lambda a partir de um cluster de banco de dados Aurora MySQL chamando o procedimento mysql.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.

Considerações da versão do Aurora MySQL

A partir do Aurora MySQL versão 2, é possível usar o método da função nativa em vez desses procedimentos armazenados para invocar uma função do Lambda. Para obter mais informações sobre as funções nativas, consulte Como trabalhar com funções nativas para uma função do Lambda.

No Aurora MySQL versão 2, o procedimento armazenado mysql.lambda_async não é mais compatível. Em vez disso, é altamente recomendável o uso de funções nativas do Lambda.

No Aurora MySQL versão 3, o procedimento armazenado não está disponível.

Trabalhar com o procedimento mysql.lambda_async para invocar uma função do Lambda (defasado)

O procedimento mysql.lambda_async é um procedimento armazenado interno que invoca uma função do Lambda de forma assíncrona. Para usar esse procedimento, o usuário do banco de dados deve ter privilégios EXECUTE no procedimento armazenado mysql.lambda_async.

Sintaxe

O procedimento mysql.lambda_async tem a seguinte sintaxe.

CALL mysql.lambda_async ( lambda_function_ARN, lambda_function_input )

Parâmetros

O procedimento mysql.lambda_async tem os seguintes parâmetros.

lambda_function_ARN

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

lambda_function_input

A string de entrada, no formato JSON, para a função Lambda invocada.

Exemplos

Como melhores práticas, recomendamos que você faça chamadas do procedimento mysql.lambda_async em um procedimento armazenado que possa ser chamado de diferentes origens, como disparadores ou código de cliente. Essa abordagem pode ajudar a evitar problemas de incompatibilidade de impedância e facilitar a invocação de funções Lambda.

nota

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.

Embora as chamadas para o procedimento mysql.lambda_async sejam assíncronas, os triggers são síncronos. Uma instrução que resulta em um grande número de ativações de triggers não aguarda a conclusão da chamada para a função do AWS Lambda, mas aguarda a conclusão dos triggers antes de retornar o controle ao cliente.

exemplo Exemplo: invocar uma função do AWS Lambda para enviar e-mail

O exemplo a seguir cria um procedimento armazenado que você pode chamar no seu código de banco de dados para enviar um e-mail usando uma função Lambda.

Função do AWS Lambda

import boto3 ses = boto3.client('ses') def SES_send_email(event, context): return ses.send_email( Source=event['email_from'], Destination={ 'ToAddresses': [ event['email_to'], ] }, Message={ 'Subject': { 'Data': event['email_subject'] }, 'Body': { 'Text': { 'Data': event['email_body'] } } } )

Procedimento armazenado

DROP PROCEDURE IF EXISTS SES_send_email; DELIMITER ;; CREATE PROCEDURE SES_send_email(IN email_from VARCHAR(255), IN email_to VARCHAR(255), IN subject VARCHAR(255), IN body TEXT) LANGUAGE SQL BEGIN CALL mysql.lambda_async( 'arn:aws:lambda:us-west-2:123456789012:function:SES_send_email', CONCAT('{"email_to" : "', email_to, '", "email_from" : "', email_from, '", "email_subject" : "', subject, '", "email_body" : "', body, '"}') ); END ;; DELIMITER ;

Chamar o procedimento armazenado para invocar a função do AWS Lambda

mysql> call SES_send_email('example_from@amazon.com', 'example_to@amazon.com', 'Email subject', 'Email content');
exemplo Exemplo: invocar uma função do AWS Lambda para publicar um evento a partir de um trigger

O exemplo a seguir cria um procedimento armazenado que publica um evento usando o Amazon SNS. O código chama o procedimento de um trigger quando uma linha é adicionada a uma tabela.

Função do AWS Lambda

import boto3 sns = boto3.client('sns') def SNS_publish_message(event, context): return sns.publish( TopicArn='arn:aws:sns:us-west-2:123456789012:Sample_Topic', Message=event['message'], Subject=event['subject'], MessageStructure='string' )

Procedimento armazenado

DROP PROCEDURE IF EXISTS SNS_Publish_Message; DELIMITER ;; CREATE PROCEDURE SNS_Publish_Message (IN subject VARCHAR(255), IN message TEXT) LANGUAGE SQL BEGIN CALL mysql.lambda_async('arn:aws:lambda:us-west-2:123456789012:function:SNS_publish_message', CONCAT('{ "subject" : "', subject, '", "message" : "', message, '" }') ); END ;; DELIMITER ;

Tabela

CREATE TABLE 'Customer_Feedback' ( 'id' int(11) NOT NULL AUTO_INCREMENT, 'customer_name' varchar(255) NOT NULL, 'customer_feedback' varchar(1024) NOT NULL, PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Trigger

DELIMITER ;; CREATE TRIGGER TR_Customer_Feedback_AI AFTER INSERT ON Customer_Feedback FOR EACH ROW BEGIN SELECT CONCAT('New customer feedback from ', NEW.customer_name), NEW.customer_feedback INTO @subject, @feedback; CALL SNS_Publish_Message(@subject, @feedback); END ;; DELIMITER ;

Inserir uma linha na tabela para disparar a notificação

mysql> insert into Customer_Feedback (customer_name, customer_feedback) VALUES ('Sample Customer', 'Good job guys!');