Utilisation de Lambda avec Amazon MQ - AWS Lambda

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation de Lambda avec Amazon MQ

Note

Si vous souhaitez 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 et RabbitMQ. Un agent de messages permet à des applications et composants logiciels de communiquer à l'aide de divers langages de programmation, systèmes d'exploitation et autres protocoles de messagerie formels par le biais de rubriques ou d'événements en file d'attente.

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 invoque votre fonction via un mappage de source d'événement, une ressource Lambda qui lit les messages de votre agent et invoque la fonction de manière synchrone.

Avertissement

Les mappages de sources d'événements Lambda traitent chaque événement au moins une fois, et le traitement des enregistrements peut être dupliqué. Pour éviter les problèmes potentiels liés à des événements dupliqués, nous vous recommandons vivement de rendre votre code de fonction idempotent. Pour en savoir plus, consultez Comment rendre ma fonction Lambda idempotente dans le Knowledge Center. AWS

Le mappage de source d'événement Amazon MQ est sujet aux restrictions de configuration suivantes :

  • Simultanéité : les fonctions Lambda qui utilisent un mappage des sources d'événements Amazon MQ disposent d'un paramètre de simultanéité maximale par défaut. Pour ActiveMQ, le service Lambda limite le nombre d'environnements d'exécution simultanés à cinq. Pour RabbitMQ, le nombre d'environnements d'exécution simultanés est limité à 1. Même si vous modifiez les paramètres de simultanéité réservés ou fournis de votre fonction, le service Lambda ne mettra pas plus d'environnements d'exécution à disposition. Pour demander une augmentation de la simultanéité maximale par défaut, contactez AWS Support.

  • 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 — Pour ActiveMQ, seul le plug-in ActiveMQ est pris en chargeSimpleAuthentication. 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 Configuration réseau 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 /Java Message Service ( OpenWireJMS). 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 OpenWire protocole, consultez OpenWirele site Web d'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.

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 plus d’informations, consultez 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 des sources d’événement pour Amazon MSK, Apache Kafka autogéré, Amazon DocumentDB 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 des sources d’événements peut gérer correctement les erreurs de fonction et effectuer de nouvelles tentatives.

Vous pouvez surveiller l'utilisation simultanée d'une fonction donnée à l'aide de la ConcurrentExecutions métrique d'Amazon CloudWatch. Pour de plus amples informations sur la simultanéité, consultez Configuration de la simultanéité réservée pour une fonction.

Exemple Événements d'enregistrement 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==" } ] } }
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 réseau

Pour donner à Lambda un accès complet à votre agent via votre mappage des sources d'événements, soit votre agent doit utiliser un point de terminaison public (adresse IP publique), soit vous devez fournir un accès au VPC Amazon dans lequel vous avez créé l'agent.

Par défaut, lorsque vous créez un agent Amazon MQ, l'indicateur PubliclyAccessible défini sur false. Pour que votre agent reçoive une adresse IP publique, vous devez définir l'indicateur PubliclyAccessible sur true.

La meilleure pratique pour utiliser Amazon MQ avec Lambda consiste à utiliser des points de terminaison AWS PrivateLink VPC et à donner à votre fonction Lambda l'accès au VPC de votre courtier. Déployez un point de terminaison pour Lambda et, pour ActiveMQ uniquement, un point de terminaison pour (). AWS Security Token Service AWS STS Si votre courtier utilise l'authentification, déployez également un point de terminaison pour AWS Secrets Manager. Pour en savoir plus, veuillez consulter la section Utilisation des points de terminaison d'un VPC.

Vous pouvez également configurer une passerelle NAT sur chaque sous-réseau public du VPC contenant votre courtier Amazon MQ. Pour plus d’informations, consultez Activer l'accès à Internet pour les fonctions Lambda connectées au VPC.

Lorsque vous créez un mappage de source d'événements pour un courtier Amazon MQ, Lambda vérifie si des interfaces réseau élastiques (ENI) sont déjà présentes pour les sous-réseaux et les groupes de sécurité du VPC de votre courtier. Si Lambda trouve des ENI existants, il tente de les réutiliser. Sinon, Lambda crée de nouveaux ENI pour se connecter à la source de l'événement et appeler votre fonction.

Note

Les fonctions Lambda s'exécutent toujours dans des VPC appartenant au service Lambda. Ces VPC sont gérés automatiquement par le service et ne sont pas visibles pour les clients. Vous pouvez également connecter votre fonction à un Amazon VPC. Dans les deux cas, la configuration VPC de votre fonction n'affecte pas le mappage des sources d'événements. Seule la configuration du VPC de la source d'événements détermine la manière dont Lambda se connecte à votre source d'événements.

Règles du groupe de sécurité VPC

Configurez les groupes de sécurité pour l'Amazon VPC contenant votre cluster avec les règles suivantes (au minimum) :

  • Règles entrantes – Autorisent tout le trafic sur le port de l'agent pour le groupe de sécurité spécifié pour votre source d'événement à partir de son propre groupe de sécurité. ActiveMQ utilise le port 61617 par défaut et RabbitMQ utilise le port 5671 par défaut.

  • Règles sortantes : autorisent tout le trafic sur le port 443 pour toutes les destinations. Autorisez tout le trafic sur le port de l'agent au sein de son propre groupe de sécurité. ActiveMQ utilise le port 61617 par défaut et RabbitMQ utilise le port 5671 par défaut.

  • Si vous utilisez des points de terminaison d'un VPC au lieu de la passerelle NAT, les groupes de sécurité associés aux points de terminaison du VPC doivent autoriser tout le trafic entrant sur le port 443 à partir des groupes de sécurité des sources d'événement.

Utilisation des points de terminaison d'un VPC

Lorsque vous utilisez des points de terminaison VPC, les appels d'API pour appeler votre fonction sont acheminés via ces points de terminaison à l'aide des ENI. Le principal du service Lambda doit faire appel à toutes lambda:InvokeFunction les fonctions qui utilisent ces ENI. En outre, pour ActiveMQ, le principal du service Lambda doit faire sts:AssumeRole appel à des rôles utilisant les ENI.

Par défaut, les points de terminaison VPC ont des politiques IAM ouvertes. La meilleure pratique consiste à restreindre ces politiques afin de n'autoriser que des principaux spécifiques à effectuer les actions nécessaires à l'aide de ce point de terminaison. Pour garantir que le mappage de votre source d'événements puisse invoquer votre fonction Lambda, la politique de point de terminaison VPC doit autoriser le principe du service Lambda à appeler etlambda:InvokeFunction, pour ActiveMQ,. sts:AssumeRole Le fait de restreindre vos politiques de point de terminaison VPC pour n'autoriser que les appels d'API provenant de votre organisation empêche le mappage des sources d'événements de fonctionner correctement.

Les exemples de politiques de point de terminaison VPC suivants montrent comment accorder l'accès requis aux points de terminaison Lambda et aux points de terminaison AWS STS Lambda.

Exemple Politique de point de terminaison VPC - point de AWS STS terminaison (ActiveMQ uniquement)
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "*" } ] }
Exemple Politique de point de terminaison VPC - Point de terminaison Lambda
{ "Statement": [ { "Action": "lambda:InvokeFunction", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "*" } ] }

Si votre courtier Amazon MQ utilise l'authentification, vous pouvez également restreindre la politique de point de terminaison VPC pour le point de terminaison Secrets Manager. Pour appeler l'API Secrets Manager, Lambda utilise votre rôle de fonction, et non le principal du service Lambda. L'exemple suivant montre une politique de point de terminaison de Secrets Manager.

Exemple Politique relative aux points de terminaison VPC - Point de terminaison Secrets Manager
{ "Statement": [ { "Action": "secretsmanager:GetSecretValue", "Effect": "Allow", "Principal": { "AWS": [ "customer_function_execution_role_arn" ] }, "Resource": "customer_secret_arn" } ] }

Ajouter des autorisations et créer le mappage des sources d'événements

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 de manière à lire depuis Amazon MQ, ajoutez les autorisations requises et créez un déclencheur MQ dans la console Lambda.

Pour ajouter des autorisations et créer un déclencheur
  1. Ouvrez la page Functions (Fonctions) de la console Lambda.

  2. Choisissez le nom d’une fonction.

  3. Choisissez l'onglet Configuration, puis Permissions (Autorisations).

  4. Sous Nom du rôle, choisissez le lien vers votre rôle d'exécution. Ce lien ouvre le rôle dans la console IAM.

    Lien vers le rôle d'exécution
  5. Choisissez Ajouter des autorisations, puis choisissez Créer une politique intégrée.

    Création d'une politique intégrée dans la console IAM
  6. Dans l'éditeur de politiques, choisissez JSON. Saisissez la stratégie suivante. Votre fonction a besoin de ces autorisations pour lire depuis un courtier 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": "*" } ] }
    Note

    Lorsque vous utilisez une clé cryptée gérée par le client, vous devez également ajouter l'kms:Decryptautorisation.

  7. Choisissez Suivant. Entrez un nom de stratégie, puis choisissez Créer une politique.

  8. Retournez à votre fonction dans la console Lambda. Sous Function overview (Vue d’ensemble de la fonction), choisissez Add trigger (Ajouter un déclencheur).

    Section de présentation des fonctions de la console Lambda
  9. Choisissez le type de déclencheur MQ.

  10. 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.

Mettre à jour le mappage des sources d'événements

Utilisez la update-event-source-mapping commande pour mettre à jour le mappage d'une source d'événements. 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), et le Guide de fiabilité sur le site web RabbitMQ.

Note

Lambda ne prend pas en charge les stratégies de relivraison personnalisées. Lambda utilise plutôt une politique dont les valeurs par défaut sont celles de la page Politique de remise du site Web Apache ActiveMQ, définies sur 6. maximumRedeliveries

Paramètres de configuration Amazon MQ et RabbitMQ

Tous les types de sources d'événements Lambda partagent les mêmes opérations CreateEventSourceMappinget les mêmes opérations d'UpdateEventSourceMappingAPI. 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

Filtrage des événements Lambda

MaximumBatchingWindowInSecondes

N

500 ms

Comportement de traitement par lots

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.