Utilizzo di Lambda con Amazon MQ - AWS Lambda

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo di Lambda con Amazon MQ

Amazon MQ è un servizio gestito di broker dei messaggi per Apache ActiveMQ e RabbitMQ. Un broker di messaggi consente alle applicazioni e ai componenti software di comunicare utilizzando vari linguaggi di programmazione, sistemi operativi e protocolli di messaggistica formali tramite destinazioni eventi di tipo argomento o coda.

Amazon MQ può anche gestire automaticamente istanze di Amazon Elastic Compute Cloud (Amazon EC2) con l'installazione di ActiveMQ o RabbitMQ e la fornitura di diverse topologie di rete e altri requisiti infrastrutturali.

Puoi utilizzare una funzione Lambda per elaborare i record da un broker di messaggi di Amazon MQ. Lambda richiama la funzione tramite uno strumento di mappatura dell'origine degli eventi, una risorsa Lambda che legge i messaggi dal broker e richiama la funzione in maniera sincrona.

avvertimento

Le mappature delle sorgenti degli eventi Lambda elaborano ogni evento almeno una volta e può verificarsi un'elaborazione duplicata dei record. Per evitare potenziali problemi legati agli eventi duplicati, ti consigliamo vivamente di rendere idempotente il codice della funzione. Per ulteriori informazioni, consulta Come posso rendere idempotente la mia funzione Lambda nel Knowledge Center. AWS

Lo strumento di mappatura dell'origine degli eventi di Amazon MQ presenta le seguenti restrizioni di configurazione:

  • Concorrenza: le funzioni Lambda che utilizzano uno strumento di mappatura dell'origine degli eventi Amazon MQ hanno un'impostazione di concorrenza massima predefinita. Per ActiveMQ, il servizio Lambda limita il numero di ambienti di esecuzione simultanei a cinque. Per RabbitMQ, il numero di ambienti di esecuzione simultanei è limitato a 1. Anche se modifichi le impostazioni di simultaneità sottoposta a provisioning o riservata, il servizio Lambda non renderà disponibili altri ambienti di esecuzione. Per richiedere un aumento della simultaneità massima predefinita, contatta AWS Support.

  • Più account: Lambda non supporta l'elaborazione tra più account. Non puoi utilizzare Lambda per elaborare i record da un broker di messaggi di Amazon MQ incluso in un Account AWS diverso.

  • Autenticazione: per ActiveMQ, è supportato solo il plug-in SimpleAuthentication ActiveMQ. Per RabbitMQ è supportato solo il meccanismo di autenticazione PLAIN. Gli utenti devono utilizzare per gestire le proprie AWS Secrets Manager credenziali. Per ulteriori informazioni sull'autenticazione di ActiveMQ, consulta Integrazione di broker ActiveMQ con LDAP nella Guida per gli sviluppatori di Amazon MQ.

  • Quota di connessione: i broker hanno un numero massimo di connessioni consentite per protocollo a livello di collegamento. Questa quota si basa sul tipo di istanza del broker. Per ulteriori informazioni, consulta la sezione Broker di Quote in Amazon MQ nella Guida per gli sviluppatori di Amazon MQ.

  • Connettività: puoi creare broker in un VPC (Virtual Private Cloud) pubblico o privato. Per i VPC privati, la funzione Lambda deve accedere al VPC per ricevere i messaggi. Per ulteriori informazioni, consulta Configurazione della rete più avanti in questo argomento.

  • Destinazioni eventi: sono supportate solo le destinazioni coda. Tuttavia, puoi utilizzare un argomento virtuale che si comporta internamente come un argomento mentre interagisce con Lambda come una coda. Per ulteriori informazioni, consulta Destinazioni virtuali sul sito web di Apache ActiveMQ e Host virtuali sul sito Web di RabbitMQ.

  • Topologia di rete: per ActiveMQ è supportato un solo broker a istanza singola o in standby per ogni strumento di mappatura dell'origine degli eventi. Per RabbitMQ è supportata una sola implementazione di broker o cluster a istanza singola per ogni strumento di mappatura dell'origine degli eventi. I broker a istanza singola richiedono un endpoint di failover. Per ulteriori informazioni su queste modalità di implementazione del broker, consulta Architettura del broker MQ attiva e Architettura del broker MQ di Rabbit nella Guida per gli sviluppatori di Amazon MQ.

  • Protocolli: i protocolli supportati dipendono dal tipo di integrazione di Amazon MQ.

    • Per le integrazioni ActiveMQ, Lambda utilizza i messaggi utilizzando OpenWire il protocollo /Java Message Service (JMS). Non sono supportati altri protocolli per l'utilizzo dei messaggi. All'interno del protocollo JMS, sono supportati solo TextMessage e BytesMessage. Lambda supporta anche le proprietà JMS personalizzate. Per ulteriori informazioni sul OpenWire protocollo, vedere OpenWireil sito Web di Apache ActiveMQ.

    • Per le integrazioni RabbitMQ, Lambda utilizza i messaggi tramite il protocollo AMQP 0-9-1. Non sono supportati altri protocolli per l'utilizzo dei messaggi. Per ulteriori informazioni sull'implementazione del protocollo AMQP 0-9-1 in RabbitMQ, consulta la Guida di riferimento completa di AMQP 0-9-1 sul sito web di RabbitMQ.

Lambda supporta automaticamente le versioni più recenti di ActiveMQ e RabbitMQ supportate da Amazon MQ. Per le ultime versioni supportate, consulta le Note di rilascio di Amazon MQ nella Guida per gli sviluppatori di Amazon MQ.

Nota

Per impostazione predefinita, Amazon MQ prevede un periodo di manutenzione settimanale per i broker. Durante quella finestra temporale, i broker non sono disponibili. Per i broker senza standby, Lambda non può elaborare alcun messaggio durante tale finestra.

Gruppo di utenti Lambda

Per interagire con Amazon MQ, Lambda crea un gruppo di utenti che può leggere dai broker di Amazon MQ. Il gruppo di utenti viene creato con lo stesso ID dell'UUID dello strumento di mappatura dell'origine degli eventi.

Per le origini eventi di Amazon MQ, Lambda crea un batch dei record e li invia alla tua funzione in un singolo payload. Per controllare il comportamento, puoi configurare la finestra batch e le dimensioni del batch. Lambda estrae i messaggi finché elabora la dimensione del payload massima di 6 MB, la finestra di batch scade o il numero di record raggiunge la dimensione completa del batch. Per ulteriori informazioni, consulta Comportamento di batching.

Il gruppo di utenti recupera i messaggi come BLOB di byte, li codifica in base64 in un singolo payload JSON e richiama la tua funzione. Se la funzione restituisce un errore per uno qualunque dei messaggi in un batch, Lambda ritenta l'intero batch di messaggi fino a quando l'elaborazione riesce o i messaggi scadono.

Nota

Anche se le funzioni Lambda generalmente prevedono un timeout massimo di 15 minuti, gli strumenti di mappatura dell'origine degli eventi per Amazon MSK, Apache Kafka autogestito, Amazon DocumentDB e Amazon MQ per ActiveMQ e RabbitMQ supportano solo funzioni con timeout massimi di 14 minuti. Questa limitazione garantisce che lo strumento di mappatura dell'origine degli eventi possa gestire correttamente errori di funzioni e nuovi tentativi.

Puoi monitorare l'utilizzo simultaneo di una determinata funzione utilizzando la ConcurrentExecutions metrica in Amazon. CloudWatch Per ulteriori informazioni sulla simultaneità, consulta Configurazione della concorrenza riservata per una funzione.

Esempio Eventi record di 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

Nell'esempio di RabbitMQ, pizzaQueue è il nome della coda RabbitMQ e / è il nome dell'host virtuale. Quando si ricevono messaggi, l'origine eventi elenca i messaggi in pizzaQueue::/.

Autorizzazioni del ruolo di esecuzione

Per leggere i record da un broker Amazon MQ, la funzione Lambda richiede le seguenti autorizzazioni aggiunte al suo ruolo di esecuzione:

Nota

Quando utilizzi una chiave gestita dal cliente crittografata, aggiungi anche l'autorizzazione kms:Decrypt.

Configurazione della rete

Per concedere a Lambda l'accesso completo al tuo broker tramite lo strumento di mappatura dell'origine degli eventi, il broker deve utilizzare un endpoint pubblico (indirizzo IP pubblico) oppure devi fornire l'accesso all'Amazon VPC in cui hai creato il broker.

Per impostazione predefinita, quando crei un broker Amazon MQ, il flag PubliclyAccessible è impostato su false. Affinché il tuo broker riceva un indirizzo IP pubblico, devi impostare il flag PubliclyAccessible su true.

La migliore pratica per usare Amazon MQ con Lambda consiste nell'utilizzare gli endpoint AWS PrivateLink VPC e consentire alla funzione Lambda di accedere al VPC del broker. Implementa un endpoint per Lambda e, solo per ActiveMQ, un endpoint per (). AWS Security Token Service AWS STS Se il tuo broker utilizza l'autenticazione, implementa anche un endpoint per. AWS Secrets Manager Per ulteriori informazioni, consulta Uso di endpoint VPC.

In alternativa, configura un gateway NAT su ogni sottorete pubblica nel VPC contenente il tuo broker Amazon MQ. Per ulteriori informazioni, consulta Abilita l'accesso a Internet per le funzioni Lambda connesse a VPC.

Quando crei una mappatura dell'origine degli eventi per un broker Amazon MQ, Lambda verifica se le interfacce di rete elastiche (ENI) sono già presenti per le sottoreti e i gruppi di sicurezza del VPC del broker. Se Lambda trova ENI esistenti, tenta di riutilizzarli. Altrimenti, Lambda crea nuovi ENI per connettersi all'origine dell'evento e richiamare la tua funzione.

Nota

Le funzioni Lambda vengono sempre eseguite all'interno di VPC di proprietà del servizio Lambda. Questi VPC vengono gestiti automaticamente dal servizio e non sono visibili ai clienti. Puoi anche connettere la tua funzione a un Amazon VPC. In entrambi i casi, la configurazione VPC della funzione non influisce sulla mappatura delle sorgenti degli eventi. Solo la configurazione del VPC dell'origine dell'evento determina il modo in cui Lambda si connette alla fonte dell'evento.

Regole del gruppo di sicurezza VPC

Configura i gruppi di sicurezza per l'Amazon VPC contenente il tuo cluster con le seguenti regole (come minimo):

  • Regole in entrata: consenti tutto il traffico sulla porta del broker Kafka per il gruppo di sicurezza specificato per l'origine eventi dall'interno del gruppo di sicurezza. Per impostazione predefinita, ActiveMQ utilizza la porta 61.617 e RabbitMQ utilizza la porta 5.671.

  • Regole in uscita: consenti tutto il traffico sulla porta 443 per tutte le destinazioni. Consenti tutto il traffico sulla porta del broker all'interno del proprio gruppo di sicurezza. Per impostazione predefinita, ActiveMQ utilizza la porta 61.617 e RabbitMQ utilizza la porta 5.671.

  • Se si utilizzano endpoint VPC anziché gateway NAT, i gruppi di sicurezza associati agli endpoint VPC devono consentire tutto il traffico in entrata sulla porta 443 dai gruppi di sicurezza dell'origine eventi.

Uso di endpoint VPC

Quando utilizzi gli endpoint VPC, le chiamate API per richiamare la tua funzione vengono instradate attraverso questi endpoint utilizzando gli ENI. Il principale del servizio Lambda deve richiamare tutte lambda:InvokeFunction le funzioni che utilizzano tali ENI. Inoltre, per ActiveMQ, il responsabile del servizio Lambda deve sts:AssumeRole ricorrere a ruoli che utilizzano gli ENI.

Per impostazione predefinita, gli endpoint VPC dispongono di policy IAM aperte. La migliore pratica consiste nel limitare queste policy per consentire solo a soggetti specifici di eseguire le azioni necessarie utilizzando quell'endpoint. Per garantire che la mappatura delle sorgenti degli eventi sia in grado di richiamare la funzione Lambda, la policy degli endpoint VPC deve consentire al principio del servizio Lambda di chiamare e, per ActiveMQ,. lambda:InvokeFunction sts:AssumeRole Limitare le policy degli endpoint VPC per consentire solo le chiamate API provenienti dall'organizzazione impedisce il corretto funzionamento della mappatura delle sorgenti degli eventi.

L'esempio seguente di policy degli endpoint VPC mostra come concedere l'accesso richiesto per gli endpoint Lambda e per gli endpoint AWS STS Lambda.

Esempio Policy degli endpoint VPC - endpoint (solo AWS STS ActiveMQ)
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "*" } ] }
Esempio Politica degli endpoint VPC - Endpoint Lambda
{ "Statement": [ { "Action": "lambda:InvokeFunction", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "*" } ] }

Se il tuo broker Amazon MQ utilizza l'autenticazione, puoi anche limitare la policy degli endpoint VPC per l'endpoint Secrets Manager. Per chiamare l'API Secrets Manager, Lambda utilizza il ruolo della funzione, non il responsabile del servizio Lambda. L'esempio seguente mostra una policy per gli endpoint di Secrets Manager.

Esempio Politica degli endpoint VPC - Endpoint Secrets Manager
{ "Statement": [ { "Action": "secretsmanager:GetSecretValue", "Effect": "Allow", "Principal": { "AWS": [ "customer_function_execution_role_arn" ] }, "Resource": "customer_secret_arn" } ] }

Aggiungi le autorizzazioni e crea la mappatura della fonte dell'evento

Creare una mappatura dell'origine eventi per indicare a Lambda di inviare i record da un broker Amazon MQ a una funzione Lambda. È possibile creare più mappature delle origini di eventi per elaborare gli stessi dati con più funzioni o per elaborare elementi da più fonti con una singola funzione.

Per configurare la tua funzione per la lettura da Amazon MQ, aggiungi le autorizzazioni richieste e crea un trigger MQ nella console Lambda.

Per aggiungere autorizzazioni e creare un trigger
  1. Aprire la pagina Functions (Funzioni) della console Lambda.

  2. Scegliere il nome della funzione.

  3. Quindi, seleziona la scheda Configuration (Configurazione) e poi Permissions (Autorizzazioni).

  4. In Nome del ruolo, scegli il link al tuo ruolo di esecuzione. Questo link apre il ruolo nella console IAM.

    Collegamento al ruolo di esecuzione
  5. Scegli Aggiungi autorizzazioni, quindi scegli Crea politica in linea.

    Crea una policy in linea nella console IAM
  6. Nell'editor delle politiche, scegli JSON. Immetti la seguente policy. La tua funzione necessita di queste autorizzazioni per la lettura da un broker 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

    Quando utilizzi una chiave crittografata gestita dal cliente, devi aggiungere anche l'kms:Decryptautorizzazione.

  7. Seleziona Successivo. Inserisci il nome di una politica, quindi scegli Crea politica.

  8. Torna alla tua funzione nella console Lambda. In Panoramica delle funzioni, scegliere Aggiungi trigger.

    Sezione di panoramica delle funzioni della console Lambda
  9. Scegli il tipo di trigger MQ.

  10. Configurare le opzioni richieste, quindi scegliere Add (Aggiungi).

Lambda supporta le seguenti opzioni per le origini eventi Amazon MQ:

  • Broker MQ – Selezionare un broker Amazon MQ.

  • Batch size (Dimensioni batch) – Impostare il numero massimo di messaggi da recuperare in un singolo batch.

  • Queue name (Nome della coda) - Immettere la coda Amazon MQ da utilizzare.

  • Source access configuration (Configurazione dell'accesso di origine) – Immettere le informazioni sull'host virtuale e il segreto di Secrets Manager in cui sono memorizzate le credenziali del broker.

  • Abilita trigger – Disabilitare il trigger per interrompere l'elaborazione dei record.

Per attivare o disattivare il trigger (o eliminarlo), scegliere il trigger MQ nella finestra di progettazione. Per riconfigurare il trigger, utilizzare le operazioni API della mappatura dell'origine eventi.

Aggiorna la mappatura della fonte dell'evento

Utilizzate il update-event-source-mapping comando per aggiornare una mappatura della sorgente degli eventi. Il comando di esempio seguente aggiorna un mapping di origine eventi in modo da avere una dimensione batch pari a 2.

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

Verrà visualizzato l'output seguente:

{ "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" }

Lambda aggiorna queste impostazioni in modo asincrono. L'output non rifletterà le modifiche fino al completamento di questo processo. Per visualizzare lo stato corrente della risorsa, utilizza il comando get-event-source-mapping.

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

Verrà visualizzato l'output seguente:

{ "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" }

Errori della mappatura dell'origine eventi

Quando una funzione Lambda rileva un errore irreversibile, il consumatore Amazon MQ arresta l'elaborazione dei record. Tutti gli altri consumatori possono continuare a elaborare, a condizione che non riscontrino lo stesso errore. Per determinare la causa potenziale di un consumatore fermato, controllare il campo StateTransitionReason nei dettagli di reso del EventSourceMapping per uno dei seguenti codici:

ESM_CONFIG_NOT_VALID

La configurazione della mappa dell'origine eventi non è valida.

EVENT_SOURCE_AUTHN_ERROR

Lambda non è riuscito ad autenticare l'origine eventi.

EVENT_SOURCE_AUTHZ_ERROR

Lambda non dispone delle autorizzazioni necessarie per accedere all'origine eventi.

FUNCTION_CONFIG_NOT_VALID

La configurazione della funzione non è valida.

I record non verranno elaborati anche se Lambda li scarta a causa delle loro dimensioni. Il limite di dimensioni per i record Lambda è di 6 MB. Per riconsegnare i messaggi in caso di errore di funzione, è possibile utilizzare una coda di messaggi non instradabili (coda DLQ). Per ulteriori informazioni, consultare Message Redelivery and DLQ Handling sul sito Web Apache ActiveMQ e Guida all'affidabilità sul sito Web RabbitMQ.

Nota

Lambda non supporta policy di riconsegna personalizzate. Lambda utilizza invece una politica con i valori predefiniti della pagina Politica di riconsegna sul sito Web di Apache ActiveMQ, impostata su 6. maximumRedeliveries

Parametri di configurazione di Amazon MQ e RabbitMQ

Tutti i tipi di sorgenti di eventi Lambda condividono le stesse operazioni CreateEventSourceMappinge quelle dell'UpdateEventSourceMappingAPI. Tuttavia, solo alcuni dei parametri si applicano ad Amazon MQ e RabbitMQ.

Parametri di origine dell'evento applicabili ad Amazon MQ e RabbitMQ
Parametro Obbligatorio Predefinito Note

BatchSize

N

100

Massimo: 10.000

Abilitato

N

true

FunctionName

Y

FilterCriteria

N

Filtro eventi Lambda

MaximumBatchingWindowInSecondi

N

500 ms

Comportamento di batching

Queues

N

Il nome della coda di destinazione del broker Amazon MQ da utilizzare.

SourceAccessConfigurazioni

N

Per ActiveMQ, le credenziali BASIC_AUTH. Per RabbitMQ, può contenere sia le credenziali BASIC_AUTH che le informazioni VIRTUAL_HOST.