Lambda와 Amazon MQ 사용
Lambda와 Amazon MQ 사용
Lambda 함수가 아닌 다른 대상으로 데이터를 보내거나, 보내기 전에 데이터를 보강하려면 Amazon EventBridge Pipes를 참고하세요.
본문
Amazon MQ는 Apache ActiveMQ와 RabbitMQ용 관리형 메시지 브로커 서비스입니다. 메시지 브로커는 소프트웨어 애플리케이션과 구성 요소가 다양한 프로그래밍 언어, 운영 체제, 공식 메시징 프로토콜을 사용해 토픽 또는 큐 이벤트 대상을 통해 통신할 수 있게 합니다.
Amazon MQ는 사용자를 대신해 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 관리하며 ActiveMQ 또는 RabbitMQ 브로커를 설치하고 다양한 네트워크 토폴로지와 기타 인프라 요구 사항을 제공할 수도 있습니다.
Lambda 함수를 사용해 Amazon MQ 메시지 브로커의 레코드를 처리할 수 있습니다. Lambda는 이벤트 소스 매핑을 통해 함수를 호출합니다. 이벤트 소스 매핑은 브로커에서 메시지를 읽고 함수를 동기적으로 호출하는 Lambda 리소스입니다. 구성 옵션은 '이벤트 소스 매핑 파라미터'를, 일반적인 오류는 'Amazon MQ 이벤트 소스 매핑 오류 문제 해결'을 참고하세요.
Lambda 이벤트 소스 매핑은 각 이벤트를 최소 한 번 처리하며 레코드의 중복 처리가 발생할 수 있습니다. 중복 이벤트로 인한 잠재적 문제를 피하려면 함수 코드를 멱등(idempotent)하게 만드는 것을 강력히 권장합니다. 자세한 내용은 AWS Knowledge Center의 'How do I make my Lambda function idempotent'을 참고하세요.
Amazon MQ 이벤트 소스 매핑에는 다음 구성 제한이 있습니다.
- 동시성(Concurrency) – Amazon MQ 이벤트 소스 매핑을 사용하는 Lambda 함수에는 기본 최대 동시성 설정이 있습니다. ActiveMQ의 경우 Lambda 서비스는 Amazon MQ 이벤트 소스 매핑당 최대 5개의 동시 실행 환경으로 제한합니다. RabbitMQ의 경우 동시 실행 환경 수는 Amazon MQ 이벤트 소스 매핑당 1로 제한됩니다.
- 함수의 예약·프로비저닝된 동시성 설정을 변경해도 Lambda 서비스는 더 많은 실행 환경을 제공하지 않습니다. 단일 Amazon MQ 이벤트 소스 매핑의 기본 최대 동시성 증가를 요청하려면 이벤트 소스 매핑 UUID와 리전을 포함해 Support에 문의하세요. 증가는 계정이나 리전 수준이 아니라 특정 이벤트 소스 매핑 수준에 적용되므로 각 이벤트 소스 매핑에 대해 확장 증가를 수동으로 요청해야 합니다.
- 크로스 계정(Cross account) – Lambda는 크로스 계정 처리를 지원하지 않습니다. 다른 AWS 계정에 있는 Amazon MQ 메시지 브로커의 레코드를 Lambda로 처리할 수 없습니다.
- 인증(Authentication) – ActiveMQ의 경우 ActiveMQ
SimpleAuthenticationPlugin만 지원됩니다. RabbitMQ의 경우PLAIN인증 메커니즘만 지원됩니다. 사용자는 AWS Secrets Manager로 자격 증명을 관리해야 합니다. ActiveMQ 인증에 대한 자세한 내용은 Amazon MQ Developer Guide의 'Integrating ActiveMQ brokers with LDAP'을 참고하세요. - 연결 할당량(Connection quota) – 브로커에는 와이어 레벨 프로토콜당 허용되는 최대 연결 수가 있습니다. 이 할당량은 브로커 인스턴스 유형에 기반합니다. 자세한 내용은 Amazon MQ Developer Guide의 'Quotas in Amazon MQ'의 Brokers 섹션을 참고하세요.
- 연결성(Connectivity) – 공용 또는 프라이빗 가상 프라이빗 클라우드(VPC)에 브로커를 만들 수 있습니다. 프라이빗 VPC의 경우 Lambda 함수가 메시지를 받으려면 VPC에 접근해야 합니다. 자세한 내용은 이 섹션 뒷부분의 '네트워크 보안 구성'을 참고하세요.
- 이벤트 대상(Event destinations) – 큐 대상만 지원됩니다. 다만 내부적으로는 토픽처럼 동작하면서 Lambda와는 큐로 상호작용하는 가상 토픽(virtual topic)을 사용할 수 있습니다. 자세한 내용은 Apache ActiveMQ 웹사이트의 'Virtual Destinations'와 RabbitMQ 웹사이트의 'Virtual Hosts'를 참고하세요.
- 네트워크 토폴로지(Network topology) – ActiveMQ의 경우 이벤트 소스 매핑당 단일 인스턴스 또는 대기(standby) 브로커 하나만 지원됩니다. RabbitMQ의 경우 이벤트 소스 매핑당 단일 인스턴스 브로커 또는 클러스터 배포 하나만 지원됩니다. 단일 인스턴스 브로커는 장애 조치(failover) 엔드포인트가 필요합니다. 이러한 브로커 배포 모드에 대한 자세한 내용은 Amazon MQ Developer Guide의 'Active MQ Broker Architecture'와 'Rabbit MQ Broker Architecture'를 참고하세요.
- 프로토콜(Protocols) – 지원 프로토콜은 Amazon MQ 통합 유형에 따라 달라집니다.
- ActiveMQ 통합의 경우 Lambda는 OpenWire/Java Message Service(JMS) 프로토콜을 사용해 메시지를 소비합니다. 메시지 소비에 다른 프로토콜은 지원되지 않습니다. JMS 프로토콜 내에서는
TextMessage와BytesMessage만 지원됩니다. Lambda는 JMS 사용자 지정 속성도 지원합니다. OpenWire 프로토콜에 대한 자세한 내용은 Apache ActiveMQ 웹사이트의 'OpenWire'을 참고하세요. - RabbitMQ 통합의 경우 Lambda는 AMQP 0-9-1 프로토콜을 사용해 메시지를 소비합니다. 메시지 소비에 다른 프로토콜은 지원되지 않습니다. RabbitMQ의 AMQP 0-9-1 프로토콜 구현에 대한 자세한 내용은 RabbitMQ 웹사이트의 'AMQP 0-9-1 Complete Reference Guide'를 참고하세요.
- ActiveMQ 통합의 경우 Lambda는 OpenWire/Java Message Service(JMS) 프로토콜을 사용해 메시지를 소비합니다. 메시지 소비에 다른 프로토콜은 지원되지 않습니다. JMS 프로토콜 내에서는
Lambda는 Amazon MQ가 지원하는 최신 버전의 ActiveMQ와 RabbitMQ를 자동으로 지원합니다. 최신 지원 버전은 Amazon MQ Developer Guide의 'Amazon MQ release notes'를 참고하세요.
기본적으로 Amazon MQ에는 브로커용 주간 유지보수 창이 있습니다. 이 창 동안 브로커는 사용할 수 없습니다. 대기가 없는 브로커의 경우 Lambda는 그 창 동안 어떤 메시지도 처리할 수 없습니다.
이 페이지의 내용:
- Amazon MQ용 Lambda 소비자 그룹 이해
- Lambda용 Amazon MQ 이벤트 소스 구성
- 이벤트 소스 매핑 파라미터
- Amazon MQ 이벤트 소스에서 이벤트 필터링
- Amazon MQ 이벤트 소스 매핑 오류 문제 해결
Amazon MQ용 Lambda 소비자 그룹 이해
Amazon MQ와 상호작용하기 위해 Lambda는 Amazon MQ 브로커에서 읽을 수 있는 소비자 그룹을 만듭니다. 소비자 그룹은 이벤트 소스 매핑 UUID와 같은 ID로 만들어집니다.
Amazon MQ 이벤트 소스의 경우 Lambda는 레코드를 배치로 모아 단일 페이로드로 함수에 보냅니다. 동작을 제어하려면 배칭 창(batching window)과 배치 크기를 구성할 수 있습니다. Lambda는 페이로드 크기 최대값(6MB)을 처리하거나, 배칭 창이 만료되거나, 레코드 수가 전체 배치 크기에 도달할 때까지 메시지를 가져옵니다. 자세한 내용은 '배칭 동작'을 참고하세요.
소비자 그룹은 메시지를 바이트의 BLOB로 검색해 단일 JSON 페이로드로 base64 인코딩한 뒤 함수를 호출합니다. 배치의 어떤 메시지에 대해서든 함수가 오류를 반환하면 Lambda는 처리가 성공하거나 메시지가 만료될 때까지 메시지 전체 배치를 재시도합니다.
Lambda 함수는 일반적으로 최대 타임아웃 한도가 15분이지만, Amazon MSK, 자체 관리형 Apache Kafka, Amazon DocumentDB, Amazon MQ(for ActiveMQ and RabbitMQ)의 이벤트 소스 매핑은 최대 타임아웃 한도가 14분인 함수만 지원합니다. 이 제약은 이벤트 소스 매핑이 함수 오류와 재시도를 적절히 처리할 수 있도록 보장합니다.
Amazon CloudWatch의 ConcurrentExecutions 지표로 특정 함수의 동시성 사용을 모니터링할 수 있습니다. 동시성에 대한 자세한 내용은 '함수의 예약 동시성 구성'을 참고하세요.
다음은 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-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-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": "eyJ0aW...UifQ=="
}
]
}
}
RabbitMQ 예제에서 pizzaQueue는 RabbitMQ 큐 이름이고 /는 가상 호스트 이름입니다. 메시지를 받을 때 이벤트 소스는 pizzaQueue::/ 아래에 메시지를 나열합니다.