Amazon MQ에서 Lambda 사용 - AWS Lambda

Amazon MQ에서 Lambda 사용

참고

Lambda 함수 이외의 대상으로 데이터를 전송하거나 데이터를 전송하기 전에 데이터를 보강하려는 경우 Amazon EventBridge 파이프를 참조하세요.

Amazon MQ는 Apache ActiveMQRabbitMQ를 위한 관리형 메시지 브로커 서비스입니다. 메시지 브로커를 사용하면 소프트웨어 애플리케이션 및 구성 요소가 토픽 또는 대기열 이벤트 대상을 통해 다양한 프로그래밍 언어, 운영 체제 및 공식 메시징 프로토콜을 사용하여 통신할 수 있습니다.

Amazon MQ는 ActiveMQ 또는 RabbitMQ 브로커를 설치하고 다른 네트워크 토폴로지 및 기타 인프라 요구 사항을 제공하여 사용자 대신 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 관리할 수도 있습니다.

Lambda 함수를 사용하여 Amazon MQ 메시지 브로커의 레코드를 처리할 수 있습니다. Lambda는 이벤트 소스 매핑을 통해 함수를 호출합니다. 이 매핑은 브로커로부터 메시지를 읽고 함수를 동기식으로 호출하는 Lambda 리소스입니다.

주의

Lambda 이벤트 소스 매핑은 각 이벤트를 한 번 이상 처리하므로 레코드가 중복될 수 있습니다. 중복 이벤트와 관련된 잠재적 문제를 방지하려면 함수 코드를 멱등성으로 만드는 것이 좋습니다. 자세한 내용은 AWS 지식 센터의 멱등성 Lambda 함수를 만들려면 어떻게 해야 합니까?를 참조하세요.

Amazon MQ 이벤트 소스 매핑에는 다음과 같은 구성 제한 사항이 있습니다.

  • 동시성 — Amazon MQ 이벤트 소스 매핑을 사용하는 Lambda 함수에는 기본 최대 동시성 설정이 있습니다. ActiveMQ의 경우, Lambda 서비스는 동시 실행 환경 수를 Amazon MQ 이벤트 소스 매핑당 5개로 제한합니다. RabbitMQ의 경우, 동시 실행 환경 수는 Amazon MQ 이벤트 소스 매핑당 1개로 제한됩니다. 함수의 예약되거나 프로비저닝된 동시성 설정을 변경하더라도 Lambda 서비스가 더 많은 실행 환경을 사용할 수 있게 해 주지는 않습니다. 단일 Amazon MQ 이벤트 소스 매핑에 대한 기본 최대 동시성의 증가를 요청하려면, 이벤트 소스 매핑 UUID 및 리전을 가지고 지원에 문의하세요. 증가는 계정 또는 리전 수준이 아닌 특정 이벤트 소스 매핑 수준에서 적용되므로, 각 이벤트 소스 매핑에 대한 규모 조정 증가를 수동으로 요청해야 합니다.

  • 교차 계정 - Lambda는 교차 계정 처리를 지원하지 않습니다. Lambda를 사용하여 다른 AWS 계정에 있는 Amazon MQ 메시지 브로커의 레코드를 처리할 수 없습니다.

  • 인증 - ActiveMQ의 경우 ActiveMQ SimpleAuthenticationPlugin만 지원됩니다. RabbitMQ의 경우 PLAIN 인증 메커니즘만 지원됩니다. 사용자는 AWS Secrets Manager를 사용해 자신의 자격 증명을 관리해야 합니다. ActiveMQ 인증에 대한 자세한 내용은 Amazon MQ 개발자 안내서ActiveMQ 브로커와 LDAP 통합을 참조하세요.

  • 연결 할당량 - 브로커에는 와이어 레벨 프로토콜당 허용되는 최대 연결 수가 있습니다. 이 할당량은 브로커 인스턴스 유형에 따라 결정됩니다. 자세한 내용은 Amazon MQ 개발자 안내서에서 Amazon MQ의 할당량브로커 단원을 참조하세요.

  • 연결성 - 퍼블릭 또는 프라이빗 Virtual Private Cloud(VPC)에서 브로커를 생성할 수 있습니다. 프라이빗 VPC의 경우 레코드와 상호 작용하려면 Lambda 함수에게 메시지를 수신하는 VPC에 대한 액세스 권한이 있어야 합니다. 자세한 내용은 이 네트워크 보안 구성 단원의 뒷부분을 참조하세요.

  • 이벤트 대상 - 대기열 대상만 지원됩니다. 그러나 Lambda와 상호 작용하는 동안 내부적으로 토픽으로 동작하는 가상 토픽을 대기열로 사용할 수 있습니다. 자세한 내용은 Apache ActiveMQ 웹사이트의 가상 대상과 RabbitMQ의 가상 호스트를 참조하세요.

  • 네트워크 토폴로지 - ActiveMQ의 경우 이벤트 소스 매핑당 하나의 단일 인스턴스 또는 대기 브로커만 지원됩니다. RabbitMQ의 경우 이벤트 소스 매핑당 하나의 단일 인스턴스 브로커 또는 클러스터 배포만 지원됩니다. 단일 인스턴스 브로커에는 장애 조치 엔드포인트가 필요합니다. 이러한 브로커 배포 모드에 대한 자세한 내용은 Amazon MQ 개발자 안내서에서 Active MQ 브로커 아키텍쳐Rabbit MQ 브로커 아키텍쳐를 참조하세요.

  • 프로토콜 - 지원되는 프로토콜은 Amazon MQ 통합 유형에 따라 다릅니다.

    • ActiveMQ 통합의 경우 Lambda는 OpenWire/Java Message Service(JMS) 프로토콜을 사용하여 메시지를 소비합니다. 메시지 소비를 위한 다른 프로토콜은 지원되지 않습니다. JMS 프로토콜 내에서 TextMessageBytesMessage만 지원됩니다. Lambda는 JMS 사용자 지정 속성도 지원합니다. OpenWire 프로토콜에 대한 자세한 내용은 Apache ActiveMQ 웹 사이트에서 OpenWire를 참조하세요.

    • RabbitMQ 통합의 경우 Lambda는 AMQP 0-9-1 프로토콜을 사용하여 메시지를 소비합니다. 메시지 소비를 위한 다른 프로토콜은 지원되지 않습니다. RabbitMQ의 AMQP 0-9-1 프로토콜 구현에 대한 자세한 내용은 RabbitMQ 웹사이트의 AMQP 0-9-1 전체 참조 가이드를 참조하세요.

Lambda는 Amazon MQ가 지원하는 최신 버전의 ActiveMQ 및 RabbitMQ를 자동으로 지원합니다. 지원되는 최신 버전은 Amazon MQ 개발자 가이드Amazon MQ 릴리스 노트를 참조하세요

참고

기본적으로 Amazon MQ에는 브로커에 대한 주별 유지 관리 기간이 있습니다. 해당 기간 동안에는 브로커를 사용할 수 없습니다. 예비 인스턴스가 없는 브로커의 경우 Lambda가 해당 기간 동안 메시지를 처리할 수 없습니다.

Amazon MQ의 Lambda 소비자 그룹에 대한 이해

Amazon MQ와 상호 작용하기 위해 Lambda는 Amazon MQ 브로커에서 읽을 수 있는 소비자 그룹을 생성합니다. 소비자 그룹은 이벤트 소스 매핑 UUID와 동일한 ID를 사용하여 생성됩니다.

Amazon MQ 이벤트 소스의 경우 Lambda에서 레코드를 일괄 처리하여 단일 페이로드로 함수에 전송합니다. 동작을 제어하려면 일괄 처리 기간 및 배치 크기를 구성할 수 있습니다. Lambda는 페이로드 크기 최댓값인 6MB이 처리되거나 일괄 처리 기간이 만료되거나 레코드 수가 전체 배치 크기에 도달할 때까지 메시지를 가져옵니다. 자세한 내용은 일괄 처리 동작 단원을 참조하십시오.

소비자 그룹은 메시지를 바이트의 BLOB로 검색하고 단일 JSON 페이로드에 base64로 인코딩한 다음, 함수를 호출합니다. 함수가 배치의 어떤 메시지에 대해 오류를 반환하면 Lambda는 처리가 성공하거나 메시지가 만료될 때까지 전체 메시지 배치를 다시 시도합니다.

참고

Lambda 함수의 최대 제한 시간은 일반적으로 15분이지만 Amazon MSK, 자체 관리형 Apache Kafka, Amazon DocumentDB, ActiveMQ 및 RabbitMQ용 Amazon MQ에 대한 이벤트 소스 매핑은 최대 제한 시간이 14분인 함수만 지원합니다. 이 제약 조건에 따라 이벤트 소스 매핑에서 함수 오류 및 재시도를 적절히 처리할 수 있습니다.

Amazon CloudWatch의 ConcurrentExecutions 지표를 사용하여 지정된 함수의 동시성 사용량을 모니터링할 수 있습니다. 동시성에 대한 자세한 내용은 함수에 대해 예약된 동시성 구성 단원을 참조하세요.

예 Amazon MQ 레코드 이벤트
ActiveMQ
{ "eventSource": "aws:mq", "eventSourceArn": "arn:aws:mq:us-east-2:111122223333:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8", "messages": [ { "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1---mq---us-east-2.amazonaws.com.rproxy.goskope.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-east-2.amazonaws.com.rproxy.goskope.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-east-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==" } ] } }
참고

RabbitMQ 예제에서 pizzaQueue는 RabbitMQ 대기열의 이름이고 /는 가상 호스트의 이름입니다. 메시지를 받을 때 이벤트 소스는 pizzaQueue::/에 메시지를 나열합니다.