Usar o Lambda com o Amazon MQ - AWS Lambda

Usar o Lambda com o Amazon MQ

nota

Se você deseja enviar dados para um destino que não seja uma função do Lambda ou enriquecer os dados antes de enviá-los, consulte Amazon EventBridge Pipes (Pipes do Amazon EventBridge).

O Amazon MQ é um serviço gerenciado de agente de mensagem para o Apache ActiveMQ e o RabbitMQ. Um agente de mensagens habilita aplicações de software e componentes para se comunicarem usando várias linguagens de programação, sistemas operacionais e protocolos de mensagens formais por meio de destinos de eventos de tópico ou fila.

O Amazon MQ também pode gerenciar instâncias do Amazon Elastic Compute Cloud (Amazon EC2) em seu nome instalando agentes do ActiveMQ ou RabbitMQ e fornecendo diferentes topologias de rede e outras necessidades de infraestrutura.

Você pode usar uma função do Lambda para processar registros do seu agente de mensagens do Amazon MQ. O Lambda invoca sua função por meio de um mapeamento de fontes de eventos, um recurso do Lambda que lê mensagens de seu agente e invoca a função de modo síncrono.

Atenção

Os mapeamentos da origem do evento do Lambda processam cada evento ao menos uma vez, podendo haver o processamento duplicado de registros. Para evitar possíveis problemas relacionados a eventos duplicados, é altamente recomendável tornar o código da função idempotente. Para saber mais, consulte Como tornar minha função do Lambda idempotente no Centro de Conhecimentos da AWS.

O mapeamento de fontes de eventos do Amazon MQ tem as seguintes restrições de configuração:

  • Simultaneidade: as funções do Lambda que usam um mapeamento de origem do evento do Amazon MQ têm uma configuração padrão de simultaneidade máxima. Para o ActiveMQ, o serviço Lambda limita o número de ambientes de execução simultânea a cinco. Para o RabbitMQ, o número de ambientes de execução simultânea é limitado a 1. Mesmo que você altere as configurações de simultaneidade reservada ou provisionada da função, o serviço Lambda não disponibilizará mais ambientes de execução. Para solicitar um aumento na simultaneidade máxima padrão, entre em contato com o AWS Support.

  • Contas cruzadas: o Lambda não é compatível com o processamento de contas cruzadas. Não é possível usar o Lambda para processar registros de um agente de mensagens do Amazon MQ que esteja em uma Conta da AWS diferente.

  • Autenticação: para o ActiveMQ, somente o SimpleAuthenticationPlugin do ActiveMQ é compatível. Para RabbitMQ, somente oPLAINMecanismo de autenticação é compatível. Os usuários devem usarAWS Secrets Managerpara gerenciar suas credenciais. Para obter mais informações sobre a autenticação do ActiveMQ, consulteIntegração de corretores ActiveMQ com LDAPnoGuia do desenvolvedor do Amazon MQ.

  • Cota de conexão: os agentes têm um número máximo de conexões permitidas por protocolo de nível de transmissão de dados. Essa cota é baseada no tipo de instância do agente. Para obter mais informações, consulte o .Operadoresseção doCotas no Amazon MQnoGuia do desenvolvedor do Amazon MQ.

  • Conectividade: você pode criar agentes em uma Virtual Private Cloud (VPC) pública ou privada. Para VPCs privadas, sua função do Lambda precisa acessar a VPC para receber mensagens. Para obter mais informações, consulte Configuração de rede mais adiante neste tópico.

  • Destinos de eventos: somente destinos de fila são compatíveis. No entanto, você pode usar um tópico virtual, que se comporta como um tópico internamente enquanto interage com o Lambda como uma fila. Para obter mais informações, consulte Virtual Destinations no site do Apache ActiveMQ e Virtual Hosts no site do RabbitMQ.

  • Topologia de rede: para o ActiveMQ, somente um agente de instância única ou em espera é aceito por mapeamento de fontes de eventos. Para o RabbitMQ, apenas um agente de instância única ou implantação de cluster é aceito por mapeamento de fonte de eventos. Os agentes de instância única requerem um endpoint de failover. Para obter mais informações sobre esses modos de implantação do agente, consulteArquitetura de operador do MQeArquitetura de MQ do RabbitnoGuia do desenvolvedor do Amazon MQ.

  • Protocolos — Os protocolos suportados dependem do tipo de integração do Amazon MQ.

    • Para integrações do ActiveMQ, o Lambda consome mensagens usando o protocolo OpenWire/Java Message Service (JMS). Nenhum outro protocolo é compatível para o consumo de mensagens. Dentro do protocolo JMS, somente TextMessage e BytesMessage são compatíveis. O Lambda também é compatível com propriedades personalizadas do JMS. Para obter mais informações sobre o protocolo OpenWire, consulte OpenWire no site do Apache ActiveMQ.

    • Para integrações RabbitMQ, o Lambda consome mensagens usando o protocolo AMQP 0-9-1. Nenhum outro protocolo é compatível para o consumo de mensagens. Para obter mais informações sobre a implementação do protocolo AMQP 0-9-1 pelo RabbitMQ, consulteAMQP 0-9-1 Guia de referência completono site do RabbitMQ.

O Lambda oferece suporte automaticamente às versões mais recentes do ActiveMQ e RabbitMQ que não têm suporte no Amazon MQ. Para obter as versões compatíveis mais recentes, consulteNotas de versão do Amazon MQnoGuia do desenvolvedor do Amazon MQ.

nota

Por padrão, o Amazon MQ tem uma janela de manutenção semanal para agentes. Durante essa janela de tempo, os agentes não estão disponíveis. Para agentes sem espera, o Lambda não é possível processar nenhuma mensagem durante essa janela.

Grupo de consumidores do Lambda

Para interagir com o Amazon MQ, o Lambda cria um grupo de consumidores que pode ler a partir de seus agentes do Amazon MQ. O grupo de consumidores é criado com o mesmo ID que um UUID de mapeamento da fonte de eventos.

Para fontes de evento do Amazon MQ, o Lambda divide os registros em lotes e os envia para sua função em uma única carga útil. Para controlar o comportamento, é necessário configurar a janela de lotes e o tamanho do lote. O Lambda extrai mensagens até processar o tamanho máximo da carga útil de 6 MB, a janela de lotes expirar ou o número de registros atingir o tamanho total do lote. Para ter mais informações, consulte Comportamento de lotes.

O grupo de consumidores recupera as mensagens como um BLOB de bytes, as codifica em base64 para uma única carga útil JSON e depois invoca a função. Se sua função retorna um erro para qualquer uma das mensagens em um lote, o Lambda tenta novamente todo o lote de mensagens até que o processamento seja bem-sucedido ou as mensagens expiram.

nota

Embora as funções do Lambda normalmente tenham um limite máximo de tempo de 15 minutos, os mapeamentos da origem dos eventos para o Amazon MSK, o Apache Kafka autogerenciado, o Amazon DocumentDB e o Amazon MQ para ActiveMQ e RabbitMQ são compatíveis somente com funções com limites máximos de tempo limite de 14 minutos. Essa restrição garante que o mapeamento da origem do evento possa solucionar adequadamente os erros de função e repetições.

Você pode monitorar o uso da simultaneidade de uma determinada função usando a métrica ConcurrentExecutions no Amazon CloudWatch. Para obter mais informações sobre a simultaneidade, consulte Configurar a simultaneidade reservada.

exemplo Eventos de registro do Amazon MQ
ActiveMQ
{ "eventSource": "aws:mq", "eventSourceArn": "arn:aws:mq:us-west-2:111122223333:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8", "messages": [ { "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-west-2.amazonaws.com-37557-1234520418293-4:1:1:1:1", "messageType": "jms/text-message", "deliveryMode": 1, "replyTo": null, "type": null, "expiration": "60000", "priority": 1, "correlationId": "myJMSCoID", "redelivered": false, "destination": { "physicalName": "testQueue" }, "data":"QUJDOkFBQUE=", "timestamp": 1598827811958, "brokerInTime": 1598827811958, "brokerOutTime": 1598827811959, "properties": { "index": "1", "doAlarm": "false", "myCustomProperty": "value" } }, { "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-west-2.amazonaws.com-37557-1234520418293-4:1:1:1:1", "messageType": "jms/bytes-message", "deliveryMode": 1, "replyTo": null, "type": null, "expiration": "60000", "priority": 2, "correlationId": "myJMSCoID1", "redelivered": false, "destination": { "physicalName": "testQueue" }, "data":"LQaGQ82S48k=", "timestamp": 1598827811958, "brokerInTime": 1598827811958, "brokerOutTime": 1598827811959, "properties": { "index": "1", "doAlarm": "false", "myCustomProperty": "value" } } ] }
RabbitMQ
{ "eventSource": "aws:rmq", "eventSourceArn": "arn:aws:mq:us-west-2:111122223333:broker:pizzaBroker:b-9bcfa592-423a-4942-879d-eb284b418fc8", "rmqMessagesByQueue": { "pizzaQueue::/": [ { "basicProperties": { "contentType": "text/plain", "contentEncoding": null, "headers": { "header1": { "bytes": [ 118, 97, 108, 117, 101, 49 ] }, "header2": { "bytes": [ 118, 97, 108, 117, 101, 50 ] }, "numberInHeader": 10 }, "deliveryMode": 1, "priority": 34, "correlationId": null, "replyTo": null, "expiration": "60000", "messageId": null, "timestamp": "Jan 1, 1970, 12:33:41 AM", "type": null, "userId": "AIDACKCEVSQ6C2EXAMPLE", "appId": null, "clusterId": null, "bodySize": 80 }, "redelivered": false, "data": "eyJ0aW1lb3V0IjowLCJkYXRhIjoiQ1pybWYwR3c4T3Y0YnFMUXhENEUifQ==" } ] } }
nota

No exemplo RabbitMQ,pizzaQueueé o nome da fila do RabbitMQ e/é o nome do host virtual. Ao receber mensagens, a origem do evento lista as mensagens empizzaQueue::/.

Permissões da função de execução

Para ler registros de um agente do Amazon MQ, sua função do Lambda precisa das seguintes permissões adicionadas à respectiva função de execução:

nota

Ao usar uma chave criptografada gerenciada pelo cliente, adicione a permissão kms:Decrypt também.

Configuração de rede

Para dar ao Lambda acesso total ao seu agente por meio do mapeamento da origem do evento, seu agente deve usar um endpoint público (endereço IP público) ou você deve fornecer acesso à Amazon VPC, na qual o agente foi criado.

Por padrão, quando você cria um agente do Amazon MQ, o sinalizador PubliclyAccessible é definido como false. Para que seu agente receba um endereço IP público, você deve definir o sinalizador PubliclyAccessible como true.

A prática recomendada para usar o Amazon MQ com o Lambda é utilizar endpoints da VPC do AWS PrivateLink e permitir que a função do Lambda tenha acesso à VPC do seu agente. Implemente um endpoint para o Lambda e, exclusivamente para o ActiveMQ, um endpoint para AWS Security Token Service (AWS STS). Se o seu agente usar autenticação, implante também um endpoint para AWS Secrets Manager. Para saber mais, consulte Trabalhar com endpoints da VPC.

Como alternativa, configure um gateway NAT em cada sub-rede pública na VPC que contém seu agente do  Amazon MQ. Para ter mais informações, consulte Habilitar o acesso à Internet para funções do Lambda conectadas à VPC.

Quando você cria um mapeamento da origem do evento para um agente do Amazon MQ, o Lambda verifica se as interfaces de rede elástica (ENIs) já estão presentes nas sub-redes e nos grupos de segurança da VPC do seu agente. Se o Lambda encontrar ENIs existentes, ele tentará reutilizá-las. Caso contrário, o Lambda criará novas ENIs para se conectar à origem do evento e invocar sua função.

nota

As funções do Lambda sempre são executadas em VPCs de propriedade do serviço Lambda. Essas VPCs recebem manutenção automática do serviço e não são visíveis para os clientes. Você também pode conectar sua função a uma Amazon VPC. Em ambos os casos, a configuração de VPC da sua função não afetará o mapeamento da origem do evento. Somente a configuração da VPC da origem de eventos determina o modo de conexão do Lambda à sua origem de eventos.

Regras de grupos de segurança da VPC

Configure com as seguintes regras (no mínimo) os grupos de segurança da Amazon VPC que contêm seu cluster:

  • Regras de entrada: permitem todo o tráfego na porta do agente para os grupos de segurança especificados para sua origem de eventos de seu próprio grupo de segurança. O ActiveMQ usa a porta 61617 por padrão e o RabbitMQ usa a porta 5671 por padrão.

  • Regras de saída: permitir todo o tráfego na porta 443 para todos os destinos. Permita que todo o tráfego na porta do agente esteja dentro de seu próprio grupo de segurança. O ActiveMQ usa a porta 61617 por padrão e o RabbitMQ usa a porta 5671 por padrão.

  • Se você usar endpoints da VPC em vez de um gateway NAT, os grupos de segurança associados aos endpoints da VPC deverão permitir todo o tráfego de entrada na porta 443 dos grupos de segurança da origem de evento.

Trabalhar com endpoints da VPC

Quando você usa endpoints da VPC, as chamadas de API para invocar sua função são roteadas por esses endpoints usando as ENIs. A entidade principal do serviço Lambda precisa chamar lambda:InvokeFunction para quaisquer funções que usem essas ENIs. Além disso, para o ActiveMQ, a entidade principal do serviço Lambda precisa chamar sts:AssumeRole em perfis que usem os ENIs.

Por padrão, os endpoints da VPC têm políticas do IAM que são abertas. A prática recomendada é restringir essas políticas a fim de permitir somente que entidades principais específicas executem as ações necessárias usando esse endpoint. Para garantir que seu mapeamento da origem do evento seja capaz de invocar sua função do Lambda, a política de endpoint da VPC deve permitir que a entidade principal do serviço Lambda chame lambda:InvokeFunction e, para o ActiveMQ, sts:AssumeRole. A restrição de suas políticas de endpoint da VPC para apenas permitir chamadas de API originadas em sua organização impedirá o funcionamento adequado do mapeamento da origem do evento.

O seguinte exemplo de políticas de endpoint da VPC mostra como conceder o acesso necessário ao AWS STS e aos endpoints do Lambda.

exemplo Política de endpoint da VPC - endpoint do AWS STS (somente ActiveMQ)
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "*" } ] }
exemplo Política de endpoint da VPC: endpoint do Lambda
{ "Statement": [ { "Action": "lambda:InvokeFunction", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "*" } ] }

Se o seu agente do Amazon MQ usar autenticação, você também poderá restringir a política de endpoint da VPC para o endpoint do Secrets Manager. Para chamar a API do Secrets Manager, o Lambda usa seu perfil de função, e não a entidade principal de serviço do Lambda. O exemplo a seguir mostra uma política de endpoint do Secrets Manager.

exemplo Política de endpoint da VPC: endpoint do Secrets Manager.
{ "Statement": [ { "Action": "secretsmanager:GetSecretValue", "Effect": "Allow", "Principal": { "AWS": [ "customer_function_execution_role_arn" ] }, "Resource": "customer_secret_arn" } ] }

Adicionar permissões e criar o mapeamento da origem do evento

Crie um mapeamento de fontes de eventos para instruir o Lambda a enviar registros de um agente do Amazon MQ para uma função do Lambda. É possível criar vários mapeamentos de origem de evento para processar os mesmos dados com várias funções ou processar itens de várias fontes com uma única função.

Para configurar sua função para ler do Amazon MQ, adicione as permissões necessárias e crie um acionador do MQ no console do Lambda.

Para adicionar permissões e criar um acionador
  1. Abra a página Funções do console do Lambda.

  2. Escolha o nome de uma função.

  3. Escolha a guia Configuration (Configuração) e, depois, Permissions (Permissões).

  4. Em Nome do perfil, escolha o link para seu perfil de execução. Esse link abre o perfil no console do IAM.

    Link para perfil de execução
  5. Escolha Adicionar permissões e, em seguida, Criar política em linha.

    Criar uma política em linha no console do IAM
  6. Na seção Editor de políticas, escolha JSON. Insira a seguinte política. A função precisa dessas permissões para ler de um agente do Amazon MQ.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "mq:DescribeBroker", "secretsmanager:GetSecretValue", "ec2:CreateNetworkInterface", "ec2:DeleteNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DescribeSecurityGroups", "ec2:DescribeSubnets", "ec2:DescribeVpcs", "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" } ] }
    nota

    Ao usar uma chave gerenciada pelo cliente criptografada, também é necessário adicionar a permissão kms:Decrypt.

  7. Escolha Próximo. Digite um nome para a política e escolha Criar política.

  8. Volte para a sua função no console do Lambda Em Visão geral da função, escolha Adicionar gatilho.

    Seção de visão geral da função do console do Lambda
  9. Selecione o tipo de acionador MQ.

  10. Configure as opções necessárias e escolha Add (Adicionar).

O Lambda oferece suporte às seguintes opções de fontes de eventos do Amazon MQ:

  • Agente do MQ— Selecione um corretor do Amazon MQ.

  • Batch size (Tamanho do lote): defina o número máximo de mensagens a serem recuperadas em um único lote.

  • Queue name (Nome da fila): digite a fila do Amazon MQ a ser consumida.

  • Configuração do acesso à fonte— Insira as informações do host virtual e o segredo do Secrets Manager que armazena as credenciais do agente.

  • Enable trigger (Habilitar acionador): desabilite o acionador para interromper o processamento de registros.

Para habilitar ou desabilitar o trigger (ou excluí-lo), selecione o trigger do MQ no designer. Para reconfigurar o trigger, use as operações da API de mapeamento de fontes de eventos.

API do mapeamento da fonte de eventos

Para gerenciar uma fonte de eventos com a AWS Command Line Interface (AWS CLI) ou um AWS SDK, use as seguintes operações de API:

Para criar o mapeamento da fonte de eventos com a AWS Command Line Interface (AWS CLI), use o comando create-event-source-mapping.

O exemplo de comando da AWS CLI a seguir cria uma fonte de eventos que mapeia uma função do Lambda chamada MQ-Example-Function para um agente baseado em Amazon MQ RabbitMQ chamado ExampleMQBroker. O comando também fornece o nome do host virtual e o ARN de um segredo do Secrets Manager que armazena as credenciais do agente.

aws lambda create-event-source-mapping \ --event-source-arn arn:aws:mq:us-east-1:123456789012:broker:ExampleMQBroker:b-24cacbb4-b295-49b7-8543-7ce7ce9dfb98 \ --function-name arn:aws:lambda:us-east-1:123456789012:function:MQ-Example-Function \ --queues ExampleQueue \ --source-access-configuration Type=VIRTUAL_HOST,URI="/" Type=BASIC_AUTH,URI=arn:aws:secretsmanager:us-east-1:123456789012:secret:ExampleMQBrokerUserPassword-xPBMTt \

A seguinte saída deverá ser mostrada:

{ "UUID": "91eaeb7e-c976-1234-9451-8709db01f137", "BatchSize": 100, "EventSourceArn": "arn:aws:mq:us-east-1:123456789012:broker:ExampleMQBroker:b-b4d492ef-bdc3-45e3-a781-cd1a3102ecca", "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:MQ-Example-Function", "LastModified": 1601927898.741, "LastProcessingResult": "No records processed", "State": "Creating", "StateTransitionReason": "USER_INITIATED", "Queues": [ "ExampleQueue" ], "SourceAccessConfigurations": [ { "Type": "BASIC_AUTH", "URI": "arn:aws:secretsmanager:us-east-1:123456789012:secret:ExampleMQBrokerUserPassword-xPBMTt" } ] }

Usando o comando update-event-source-mapping, você pode configurar opções adicionais, por exemplo, como o Lambda processa os lotes, e especificar quando descartar registros que não podem ser processados. O exemplo de comando a seguir atualiza um mapeamento de fonte de eventos para ter um tamanho de lote igual a 2.

aws lambda update-event-source-mapping \ --uuid 91eaeb7e-c976-1234-9451-8709db01f137 \ --batch-size 2

A seguinte saída deverá ser mostrada:

{ "UUID": "91eaeb7e-c976-1234-9451-8709db01f137", "BatchSize": 2, "EventSourceArn": "arn:aws:mq:us-east-1:123456789012:broker:ExampleMQBroker:b-b4d492ef-bdc3-45e3-a781-cd1a3102ecca", "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:MQ-Example-Function", "LastModified": 1601928393.531, "LastProcessingResult": "No records processed", "State": "Updating", "StateTransitionReason": "USER_INITIATED" }

O Lambda atualiza essas configurações de forma assíncrona. A saída não refletirá as alterações até que esse processo seja concluído. Use o comando get-event-source-mapping para visualizar o status atual do seu recurso.

aws lambda get-event-source-mapping \ --uuid 91eaeb7e-c976-4939-9451-8709db01f137

A seguinte saída deverá ser mostrada:

{ "UUID": "91eaeb7e-c976-4939-9451-8709db01f137", "BatchSize": 2, "EventSourceArn": "arn:aws:mq:us-east-1:123456789012:broker:ExampleMQBroker:b-b4d492ef-bdc3-45e3-a781-cd1a3102ecca", "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:MQ-Example-Function", "LastModified": 1601928393.531, "LastProcessingResult": "No records processed", "State": "Enabled", "StateTransitionReason": "USER_INITIATED" }

Erros de mapeamento da fonte de eventos

Quando uma função do Lambda encontra um erro irrecuperável, o consumidor do Amazon MQ interrompe o processamento de registros. Qualquer outro consumidor pode continuar o processamento, contanto que não encontre o mesmo erro. Para determinar a possível causa de um consumidor interrompido, verifique o campo StateTransitionReason nos detalhes de devolução do EventSourceMapping para obter um dos seguintes códigos:

ESM_CONFIG_NOT_VALID

A configuração do mapeamento da fonte de eventos não é válida.

EVENT_SOURCE_AUTHN_ERROR

O Lambda falhou ao autenticar a fonte de eventos.

EVENT_SOURCE_AUTHZ_ERROR

O Lambda não tem as permissões necessárias para acessar a fonte de eventos.

FUNCTION_CONFIG_NOT_VALID

A configuração da função não é válida.

Os registros também não serão processados se o Lambda os descartar devido ao seu tamanho. O limite de tamanho para registros do Lambda é de 6 MB. Para entregar mensagens novamente após um erro da função, use uma Dead Letter Queue (DLQ – Fila de mensagens mortas). Para obter mais informações, consulte Message Redelivery and DLQ Handling no site do Apache ActiveMQ e Reliability Guide no site do RabbitMQ.

nota

O Lambda não oferece suporte às políticas de reentrega personalizadas. Em vez disso, o Lambda usa uma política com os valores padrão da página Política de reentrega no site do Apache ActiveMQ, com maximumRedeliveries definido como 6.

Parâmetros de configuração do Amazon MQ e RabbitMQ

Todos os tipos de origem de evento Lambda compartilham o mesmoCreateEventSourceMappingeUpdateEventSourceMappingOperações de API do. No entanto, apenas alguns dos parâmetros se aplicam ao Amazon MQ e RabbitMQ.

Parâmetros de fonte de evento que se aplicam ao Amazon MQ e RabbitMQ
Parâmetro Obrigatório Padrão Observações

BatchSize

N

100

Máximo: 10.000.

Habilitado

N

verdadeiro

FunctionName

Y

FilterCriteria

N

Filtragem de eventos do Lambda

MaximumBatchingWindowInSeconds

N

500 ms

Comportamento de lotes

Filas

N

O nome da fila de destino do agente do Amazon MQ a ser consumido.

SourceAccessConfigurations

N

Para credenciais ActiveMQ, BASIC_AUTH. Para RabbitMQ, pode conter credenciais BASIC_AUTH e informações de VIRTUAL_HOST.