Utilisation de Lambda avec Amazon MQ
Note
Si vous voulez envoyer des données à une cible autre qu'une fonction Lambda ou enrichir les données avant de les envoyer, consultez Amazon EventBridge Pipes.
Amazon MQ est un service d'agent de messages géré pour Apache ActiveMQ
Amazon MQ peut également gérer des instances Amazon Elastic Compute Cloud (Amazon EC2) en votre nom en installant des agents ActiveMQ ou RabbitMQ, et en fournissant différentes topologies réseau et infrastructures.
Vous pouvez utiliser une fonction Lambda pour traiter des enregistrements de votre agent de messages Amazon MQ. Lambda appelle votre fonction via un mappage de source d'événement, une ressource Lambda qui lit les messages de votre agent et appelle la fonction de manière synchrone.
Le mappage de source d'événement Amazon MQ est sujet aux restrictions de configuration suivantes :
Traitement entre comptes – Lambda ne prend pas en charge le traitement entre comptes. Vous ne pouvez pas utiliser Lambda pour traiter des enregistrements d'un agent de messages Amazon MQ se trouvant dans un autre compte AWS.
-
Authentification – Seul ActiveMQ, seul le plugin SimpleAuthenticationPlugin
ActiveMQ est pris en charge. Pour RabbitMQ, seule l'authentification PLAIN est prise en charge. Les utilisateurs doivent utiliser AWS Secrets Manager pour gérer leurs informations d'identification. Pour plus d'informations sur l'authentification ActiveMQ, consultez Intégration d'agents ActiveMQ avec LDAP dans le Guide du développeur Amazon MQ. -
Quota de connexion – Les agents ont un nombre maximum de connexions autorisées par protocole de niveau filaire. Ce quota est basé sur le type d'instance de l’agent. Pour plus d'informations, consultez la section Agents de Quotas dans Amazon dans le Manuel du développeur Amazon MQ.
-
Connectivité – Vous pouvez créer des agents dans un cloud privé virtuel (VPC) public ou privé. Pour les VPC privés, votre fonction Lambda a besoin d'un accès au VPC pour recevoir des messages. Pour plus d'informations, consultez API de mappage de la source d'événement plus loin dans cette rubrique.
-
Destinations d'événements – Seules les destinations en file d'attente sont prises en charge. Toutefois, vous pouvez utiliser une rubrique virtuelle qui se comporte comme une rubrique en interne tout en interagissant avec Lambda en tant que file d'attente. Pour plus d'informations, consultez Virtual Destinations (Destinations virtuelles)
sur le site web Apache ActiveMQ, et Virtual Hosts (Hôtes virtuels) sur le site web RabbitMQ. -
Topologie réseau – Pour ActiveMQ, un mappage de source d'événement prend en charge une seule instance ou un seul agent en veille. Pour RabbitMQ, un mappage de source d'événement prend en charge un seul agent d'instance ou un seul déploiement de cluster. Les agents à instance unique nécessitent un point de terminaison de basculement. Pour plus d'informations sur ces modes de déploiement d'agent, consultez Architecture d'agent ActiveMQ et Architecture d'agent RabbitMQ dans le Guide du développeur Amazon MQ.
-
Protocoles – Les protocoles pris en charge dépendent du type d'intégration d'Amazon MQ.
Pour les intégrations ActiveMQ, Lambda consomme les messages à l'aide du protocole OpenWire/Java Message Service (JMS). Aucun autre protocole n'est pris en charge pour la consommation de messages. Dans le protocole JMS, seuls
TextMessage
et BytesMessage
sont pris en charge. Lambda prend également en charge les propriétés personnalisées JMS. Pour plus d'informations sur le protocole OpenWire, consultez OpenWire sur le site Apache ActiveMQ. Pour les intégrations RabbitMQ, Lambda consomme des messages à l'aide du protocole AMQP 0-9-1. Aucun autre protocole n'est pris en charge pour la consommation de messages. Pour plus d'informations sur l'implémentation par RabbitMQ du protocole AMQP 0-9-1, consultez Guide de référence complet AMQP 0-9-1
sur le site web de RabbitMQ.
Lambda prend automatiquement en charge les dernières versions d'ActiveMQ et de RabbitMQ qu'Amazon MQ prend en charge. Pour connaître les dernières versions prises en charge, consultez Notes de mise à jour Amazon MQ dans le Guide du développeur Amazon MQ.
Note
Par défaut, Amazon MQ comporte une fenêtre de maintenance hebdomadaire pour les agents. Pendant cette période, les agents ne sont pas disponibles. Pendant ce temps, Lambda ne peut pas traiter les messages des agents sans veille.
Sections
Groupe de consommateurs Lambda
Pour interagir avec Amazon MQ, Lambda crée un groupe de consommateurs qui peut être lu à partir de vos agents Amazon MQ. Le groupe de consommateurs est créé avec le même ID qu'un mappage de source d'événements UUID.
Pour les sources d'événements Amazon MQ, Lambda réunit les enregistrements par lots et les envoie à votre fonction dans une seule charge utile. Pour contrôler le comportement, vous pouvez configurer la fenêtre de traitement par lots et la taille du lot. Lambda extrait les messages jusqu'à ce qu'il traite la taille maximale de la charge utile de 6 Mo, que la fenêtre de traitement par lots expire ou que le nombre d'enregistrements atteigne la taille totale du lot. Pour de plus amples informations, veuillez consulter Comportement de traitement par lots.
Le groupe de consommateurs récupère les messages sous forme de BLOB d'octets, puis les code en base64 dans une charge unique JSON puis invoque votre fonction. Si votre fonction renvoie une erreur pour l'un des messages d'un lot, Lambda réessaie le lot de messages complet jusqu'à ce que le traitement réussisse ou que les messages expirent.
Note
Alors que les fonctions Lambda ont généralement un délai d'expiration maximal de 15 minutes, les mappages de sources d'événement pour Amazon MSK, Apache Kafka autogéré et Amazon MQ pour ActiveMQ et RabbitMQ ne prennent en charge que les fonctions dont le délai d'expiration maximal est de 14 minutes. Cette contrainte garantit que le mappage de sources d'événement peut gérer correctement les erreurs de fonction et effectuer de nouvelles tentatives.
Vous pouvez surveiller l'utilisation de la simultanéité d'une fonction donnée à l'aide de la métrique ConcurrentExecutions
dans Amazon CloudWatch. Pour de plus amples informations sur la simultanéité, consultez Configuration de la simultanéité réservée.
Exemple Événements d'enregistrement Amazon MQ
Note
Dans l'exemple RabbitMQ, pizzaQueue
est le nom de la file d'attente RabbitMQ, et /
est le nom de l'hôte virtuel. Lors de la réception de messages, la source d'événement répertorie les messages sous pizzaQueue::/
.
Autorisations du rôle d'exécution
Pour lire les enregistrements d'un agent Amazon MQ, votre fonction a besoin que les autorisations suivantes soient ajoutées à son rôle d'exécution :
Note
Lorsque vous utilisez une clé gérée par le client chiffrée, ajoutez également l'autorisation kms:Decrypt
.
Configuration d'un agent en tant que source d'événement
Créez un mappage de source d’événement pour indiquer à Lambda d'envoyer des enregistrements d'un agent Amazon MQ à une fonction Lambda. Vous pouvez créer plusieurs mappages de source d'événement pour traiter les mêmes données avec plusieurs fonctions, ou pour traiter des éléments à partir de plusieurs sources avec une seule fonction.
Pour configurer votre fonction afin qu'elle lise à partir d'Amazon MQ, créez un déclencheur MQ dans la console Lambda.
Pour créer un déclencheur
Ouvrez la page Functions
(Fonctions) de la console Lambda. -
Choisissez le nom d'une fonction.
-
Sous Function overview (Présentation de la fonction), choisissez Add trigger (Ajouter un déclencheur).
-
Choisissez un type de déclencheur.
-
Configurez les options requises, puis choisissez Add (Ajouter).
Lambda prend en charge les options suivantes pour les sources d'événement Amazon MQ.
-
MQ broker (Agent MQ) – Sélectionnez un agent Amazon MQ.
-
Batch size (Taille de lot) – Définissez le nombre maximum de messages à extraire dans un lot.
-
Queue name (Nom de file d'attente) – Entrez la file d'attente Amazon MQ à consommer.
-
Source access configuration (Configuration de l'accès source) – Entrez les informations d'hôte virtuel et le secret Secrets Manager qui stocke vos informations d'identification d'agent.
-
Enable trigger (Activer le déclencheur) – Désactivez le déclencheur pour arrêter le traitement des enregistrements.
Pour activer ou désactiver le déclencheur (ou le supprimer), choisissez le déclencheur MQ dans le concepteur. Pour reconfigurer le déclencheur, utilisez les opérations d'API de mappage de source d'événement.
API de mappage de la source d'événement
Pour gérer une source d'événement à l'aide de la AWS Command Line Interface (AWS CLI) ou d'un AWS SDK
Note
Lorsque vous mettez à jour, désactivez ou supprimez un mappage des sources d'événements pour Amazon MQ, la prise en compte de vos modifications peut prendre jusqu'à 15 minutes. Avant la fin de cette période, votre mappage des sources d'événements peut continuer à traiter les événements et à invoquer votre fonction à l'aide de vos paramètres précédents. Cela est vrai même lorsque l'état du mappage des sources d'événements affiché dans la console indique que vos modifications ont été appliquées.
Pour créer le mappage de la source d'événement avec AWS Command Line Interface (AWS CLI), utilisez la commande create-event-source-mapping
.
Par défaut, les agents Amazon MQ sont créés avec l'indicateur PubliclyAccessible
défini sur false. Ce n'est que lorsque PubliclyAccessible
est défini sur true que l’agent reçoit une adresse IP publique.
Pour un accès complet avec votre mappage de source d'événements, votre agent doit utiliser un point de terminaison public ou fournir l'accès au VPC. Notez que lorsque vous ajoutez Amazon MQ en tant que déclencheur, Lambda prend en compte les paramètres VPC de l'agent Amazon MQ, et non les paramètres VPC de la fonction Lambda. Pour répondre aux exigences d'accès d'Amazon Virtual Private Cloud (Amazon VPC), vous pouvez effectuer l'une des opérations suivantes :
Configurez une passerelle NAT par sous-réseau public. Pour de plus amples informations, veuillez consulter Accès à Internet et aux services pour des fonctions connectées à un VPC.
Créez une connexion entre votre Amazon VPC et Lambda. Votre Amazon VPC doit également se connecter à AWS Security Token Service (AWS STS) et au points de terminaison Secrets Manager. Pour de plus amples informations, veuillez consulter Configuration de points de terminaison de VPC d'interface pour Lambda.
Les règles de groupe de sécurité Amazon VPC que vous configurez doivent avoir au minimum les paramètres suivants :
-
Règles entrantes – Pour un agent sans accès public, autorisez tout le trafic sur tous les ports pour le groupe de sécurité spécifié comme source. Pour un agent avec accès public, autorisez tout le trafic sur tous les ports pour toutes les destinations.
-
Règles sortantes – Autorisent tout le trafic sur tous les ports pour toutes les destinations.
La configuration d'Amazon VPC est détectable via l'API Amazon MQ et n'a pas besoin d'être configurée dans le paramétrage create-event-source-mapping
.
L'exemple de commande AWS CLI suivant crée une source d'événement qui mappe une fonction Lambda nommée MQ-Example-Function
à un agent RabbitMQ Amazon MQ nommé ExampleMQBroker
. La commande fournit également le nom d'hôte virtuel et un ARN de secret Secrets Manager qui stocke les informations d'identification de l'agent.
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
\
Vous devriez voir la sortie suivante:
{ "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" } ] }
La commande update-event-source-mapping
vous permet de configurer des options supplémentaires, telle la façon dont Lambda traite les lots, ainsi que de spécifier quand éliminer des enregistrements qui ne peuvent pas être traités. L'exemple de commande suivant met à jour un mappage de source d'événement pour qu'il ait une taille de lot de 2.
aws lambda update-event-source-mapping \
--uuid 91eaeb7e-c976-1234-9451-8709db01f137
\
--batch-size 2
Vous devriez voir la sortie suivante:
{ "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 met à jour ces paramètres de manière asynchrone. La sortie ne reflète pas les modifications tant que ce processus n'est pas terminé. Utilisez la commande get-event-source-mapping
pour afficher le statut actuel de votre ressource.
aws lambda get-event-source-mapping \
--uuid 91eaeb7e-c976-4939-9451-8709db01f137
Vous devriez voir la sortie suivante:
{ "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" }
API de mappage de la source d'événement
Quand une fonction Lambda rencontre une erreur irrécupérable, votre consommateur Amazon MQ arrête le traitement des enregistrements. D'autres consommateurs peuvent continuer le traitement, à condition qu'ils ne rencontrent pas la même erreur. Pour déterminer la cause potentielle d'un consommateur arrêté, vérifiez le champ StateTransitionReason
dans les détails de retour de votre EventSourceMapping
pour l'un des codes suivants :
ESM_CONFIG_NOT_VALID
-
La configuration de mappage de source d'événement n'est pas valide.
EVENT_SOURCE_AUTHN_ERROR
-
Lambda n'a pas réussi à authentifier la source de l'événement.
EVENT_SOURCE_AUTHZ_ERROR
-
Lambda ne dispose pas des autorisations requises pour accéder à la source d'événement.
FUNCTION_CONFIG_NOT_VALID
-
La configuration de la fonction n'est pas valide.
Les enregistrements ne sont pas non plus traités si Lambda les abandonne en raison de leur taille. La taille limite pour les enregistrements Lambda est de 6 Mo. Pour relivrer des messages en cas d'erreur de fonction, vous pouvez utiliser une file d'attente de lettres mortes (DLQ). Pour plus d'informations, consultez Message Redelivery and DLQ Handling (Relivraison des messages et gestion des DLQ)
Note
Lambda ne prend pas en charge les stratégies de relivraison personnalisées. Au lieu de cela, Lambda utilise une stratégie avec les valeurs par défaut de la page Stratégie de relivraisonmaximumRedeliveries
défini sur 5.
Paramètres de configuration Amazon MQ et RabbitMQ
Tous les types de sources d'événement Lambda partagent les mêmes opérations d'API CreateEventSourceMapping et UpdateEventSourceMapping. Cependant, seuls certains paramètres s'appliquent à Amazon MQ et à RabbitMQ.
Paramètres de la source d'événement qui s'appliquent à Amazon MQ et à RabbitMQ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Paramètre | Obligatoire | Par défaut | Remarques | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
BatchSize |
N |
100 |
Maximum : 10 000. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Activé |
N |
VRAI |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FunctionName |
Y |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FilterCriteria |
N |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MaximumBatchingWindowInSeconds |
N |
500 ms |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Files d'attente |
N |
Le nom de la file d'attente de destination de l'agent Amazon MQ à consommer. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SourceAccessConfigurations |
N |
Pour ActiveMQ, informations d'identification BASIC_AUTH. Pour RabbitMQ, il peut contenir à la fois des informations d'identification BASIC_AUTH et des informations VIRTUAL_HOST. |