

# Amazon MQ에서 Lambda 사용
<a name="with-mq"></a>

**참고**  
Lambda 함수 이외의 대상으로 데이터를 전송하거나 데이터를 전송하기 전에 데이터를 보강하려는 경우 [Amazon EventBridge 파이프](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html)를 참조하세요.

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

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

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

**주의**  
Lambda 이벤트 소스 매핑은 각 이벤트를 한 번 이상 처리하므로 레코드가 중복될 수 있습니다. 중복 이벤트와 관련된 잠재적 문제를 방지하려면 함수 코드를 멱등성으로 만드는 것이 좋습니다. 자세한 내용은 AWS 지식 센터의 [함수를 멱등성 Lambda 함수로 만들려면 어떻게 해야 하나요?](https://repost.aws/knowledge-center/lambda-function-idempotent)를 참조하세요.

Amazon MQ 이벤트 소스 매핑에는 다음과 같은 구성 제한 사항이 있습니다.
+ 동시성 — Amazon MQ 이벤트 소스 매핑을 사용하는 Lambda 함수에는 기본 최대 [동시성](lambda-concurrency.md) 설정이 있습니다. ActiveMQ의 경우, Lambda 서비스는 동시 실행 환경 수를 Amazon MQ 이벤트 소스 매핑당 5개로 제한합니다. RabbitMQ의 경우, 동시 실행 환경 수는 Amazon MQ 이벤트 소스 매핑당 1개로 제한됩니다. 함수의 예약되거나 프로비저닝된 동시성 설정을 변경하더라도 Lambda 서비스가 더 많은 실행 환경을 사용할 수 있게 해 주지는 않습니다. 단일 Amazon MQ 이벤트 소스 매핑에 대한 기본 최대 동시성의 증가를 요청하려면, 이벤트 소스 매핑 UUID 및 리전을 가지고 지원에 문의하세요. 증가는 계정 또는 리전 수준이 아닌 특정 이벤트 소스 매핑 수준에서 적용되므로, 각 이벤트 소스 매핑에 대한 규모 조정 증가를 수동으로 요청해야 합니다.
+ 교차 계정 - Lambda는 교차 계정 처리를 지원하지 않습니다. Lambda를 사용하여 다른 AWS 계정에 있는 Amazon MQ 메시지 브로커의 레코드를 처리할 수 없습니다.
+ 인증 - ActiveMQ의 경우 ActiveMQ [SimpleAuthenticationPlugin](https://activemq.apache.org/security#simple-authentication-plugin)만 지원됩니다. RabbitMQ의 경우 [PLAIN](https://www.rabbitmq.com/access-control.html#mechanisms) 인증 메커니즘만 지원됩니다. 사용자는 AWS Secrets Manager를 사용해 자신의 자격 증명을 관리해야 합니다. ActiveMQ 인증에 대한 자세한 내용은 *Amazon MQ 개발자 안내서*의 [ActiveMQ 브로커와 LDAP 통합](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/security-authentication-authorization.html)을 참조하세요.
+ 연결 할당량 - 브로커에는 와이어 레벨 프로토콜당 허용되는 최대 연결 수가 있습니다. 이 할당량은 브로커 인스턴스 유형에 따라 결정됩니다. 자세한 내용은 *Amazon MQ 개발자 안내서*에서 **Amazon MQ의 할당량**의 [브로커](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/amazon-mq-limits.html#broker-limits) 단원을 참조하세요.
+ 연결성 - 퍼블릭 또는 프라이빗 Virtual Private Cloud(VPC)에서 브로커를 생성할 수 있습니다. 프라이빗 VPC의 경우 레코드와 상호 작용하려면 Lambda 함수에게 메시지를 수신하는 VPC에 대한 액세스 권한이 있어야 합니다. 자세한 내용은 이 [네트워크 보안 구성](process-mq-messages-with-lambda.md#process-mq-messages-with-lambda-networkconfiguration) 단원의 뒷부분을 참조하세요.
+ 이벤트 대상 - 대기열 대상만 지원됩니다. 그러나 Lambda와 상호 작용하는 동안 내부적으로 토픽으로 동작하는 가상 토픽을 대기열로 사용할 수 있습니다. 자세한 내용은 Apache ActiveMQ 웹사이트의 [가상 대상](https://activemq.apache.org/virtual-destinations)과 RabbitMQ의 [가상 호스트](https://www.rabbitmq.com/vhosts.html)를 참조하세요.
+ 네트워크 토폴로지 - ActiveMQ의 경우 이벤트 소스 매핑당 하나의 단일 인스턴스 또는 대기 브로커만 지원됩니다. RabbitMQ의 경우 이벤트 소스 매핑당 하나의 단일 인스턴스 브로커 또는 클러스터 배포만 지원됩니다. 단일 인스턴스 브로커에는 장애 조치 엔드포인트가 필요합니다. 이러한 브로커 배포 모드에 대한 자세한 내용은 *Amazon MQ 개발자 안내서*에서 [Active MQ 브로커 아키텍쳐](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/amazon-mq-broker-architecture.html) 및 [Rabbit MQ 브로커 아키텍쳐](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/rabbitmq-broker-architecture.html)를 참조하세요.
+ 프로토콜 - 지원되는 프로토콜은 Amazon MQ 통합 유형에 따라 다릅니다.
  + ActiveMQ 통합의 경우 Lambda는 OpenWire/Java Message Service(JMS) 프로토콜을 사용하여 메시지를 소비합니다. 메시지 소비를 위한 다른 프로토콜은 지원되지 않습니다. JMS 프로토콜 내에서 [https://activemq.apache.org/components/cms/api_docs/activemqcpp-3.6.0/html/classactivemq_1_1commands_1_1_active_m_q_text_message.html](https://activemq.apache.org/components/cms/api_docs/activemqcpp-3.6.0/html/classactivemq_1_1commands_1_1_active_m_q_text_message.html) 및 [https://activemq.apache.org/components/cms/api_docs/activemqcpp-3.9.0/html/classactivemq_1_1commands_1_1_active_m_q_bytes_message.html](https://activemq.apache.org/components/cms/api_docs/activemqcpp-3.9.0/html/classactivemq_1_1commands_1_1_active_m_q_bytes_message.html)만 지원됩니다. Lambda는 JMS 사용자 지정 속성도 지원합니다. OpenWire 프로토콜에 대한 자세한 내용은 Apache ActiveMQ 웹 사이트에서 [OpenWire](https://activemq.apache.org/openwire.html)를 참조하세요.
  + RabbitMQ 통합의 경우 Lambda는 AMQP 0-9-1 프로토콜을 사용하여 메시지를 소비합니다. 메시지 소비를 위한 다른 프로토콜은 지원되지 않습니다. RabbitMQ의 AMQP 0-9-1 프로토콜 구현에 대한 자세한 내용은 RabbitMQ 웹사이트의 [AMQP 0-9-1 전체 참조 가이드](https://www.rabbitmq.com/amqp-0-9-1-reference.html)를 참조하세요.

Lambda는 Amazon MQ가 지원하는 최신 버전의 ActiveMQ 및 RabbitMQ를 자동으로 지원합니다. 지원되는 최신 버전은 *Amazon MQ 개발자 가이드*의 [Amazon MQ 릴리스 노트](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/amazon-mq-release-notes.html)를 참조하세요 

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

**Topics**
+ [Amazon MQ의 Lambda 소비자 그룹에 대한 이해](#services-mq-configure)
+ [Lambda용 Amazon MQ 이벤트 소스 구성](process-mq-messages-with-lambda.md)
+ [이벤트 소스 매핑 파라미터](services-mq-params.md)
+ [Amazon MQ 이벤트 소스에서 이벤트 필터링](with-mq-filtering.md)
+ [Amazon MQ 이벤트 소스 매핑 오류에 대한 문제 해결](services-mq-errors.md)

## Amazon MQ의 Lambda 소비자 그룹에 대한 이해
<a name="services-mq-configure"></a>

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

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

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

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

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

**Example Amazon MQ 레코드 이벤트**  

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

```
{
  "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::/`에 메시지를 나열합니다.

# Lambda용 Amazon MQ 이벤트 소스 구성
<a name="process-mq-messages-with-lambda"></a>

**Topics**
+ [네트워크 보안 구성](#process-mq-messages-with-lambda-networkconfiguration)
+ [이벤트 소스 매핑 생성](#services-mq-eventsourcemapping)

## 네트워크 보안 구성
<a name="process-mq-messages-with-lambda-networkconfiguration"></a>

이벤트 소스 매핑을 통해 Lambda에 Amazon MQ에 대한 전체 액세스 권한을 부여하려면 브로커가 퍼블릭 엔드포인트(퍼블릭 IP 주소)를 사용하거나 브로커를 생성한 Amazon VPC에 대한 액세스 권한을 제공해야 합니다.

Lambda에서 Amazon MQ를 사용하는 경우 Amazon VPC의 리소스에 대한 액세스 권한을 제공하는 [AWS PrivateLink VPC 엔드포인트](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)를 생성합니다.

**참고**  
이벤트 폴러에 기본(온디맨드) 모드를 사용하는 이벤트 소스 매핑을 포함하는 함수에 대해 AWS PrivateLink VPC 엔드포인트가 필요합니다. 이벤트 소스 매핑에서 [프로비저닝된 모드](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode)를 사용하는 경우 AWS PrivateLink VPC 엔드포인트를 구성하지 않아도 됩니다.

다음 리소스에 대한 액세스를 제공하는 엔드포인트를 생성합니다.
+  Lambda - Lambda 서비스 위탁자에 대한 엔드포인트를 생성합니다.
+  AWS STS - 서비스 위탁자가 사용자를 대신하여 역할을 맡을 수 있도록 AWS STS에 대한 엔드포인트를 생성합니다.
+  Secrets Manager - 브로커에서 Secrets Manager를 사용하여 자격 증명을 저장하는 경우 Secrets Manager를 위한 엔드포인트를 생성합니다.

또는 Amazon VPC의 각 퍼블릭 서브넷에 NAT 게이트웨이를 구성합니다. 자세한 내용은 [VPC 연결 Lambda 함수에 대한 인터넷 액세스 활성화](configuration-vpc-internet.md) 섹션을 참조하세요.

Amazon MQ에 대한 이벤트 소스 매핑을 생성하면 Lambda는 Amazon VPC에 대해 구성된 서브넷과 보안 그룹을 위한 탄력적 네트워크 인터페이스(ENI)가 이미 존재하는지 확인합니다. Lambda가 기존 ENI를 찾으면 이를 재사용하려고 시도합니다. 그렇지 않으면 Lambda가 이벤트 소스에 연결하고 함수를 간접 호출하기 위해 새 ENI를 생성합니다.

**참고**  
Lambda 함수는 항상 Lambda 서비스가 소유한 VPC 내에서 실행됩니다. 함수의 VPC 구성은 이벤트 소스 매핑에 영향을 미치지 않습니다. 이벤트 소스의 네트워킹 구성에 따라 Lambda가 이벤트 소스에 연결하는 방식이 결정됩니다.

브로커가 포함된 Amazon VPC에 대한 보안 그룹을 구성합니다. 기본적으로 Amazon MQ는 `61617`(ActiveMQ용 Amazon MQ) 및 `5671`(RabbitMQ용 Amazon MQ) 포트를 사용합니다.
+ 인바운드 규칙 – 이벤트 소스와 연결된 보안 그룹에 대한 기본 브로커 포트의 모든 트래픽을 허용합니다. 또는 자체 참조 보안 그룹 규칙을 사용하여 동일한 보안 그룹 내의 인스턴스에서 액세스를 허용할 수 있습니다.
+ 아웃바운드 규칙 - 함수가 AWS 서비스와 통신해야 하는 경우 외부 대상에 대한 포트 `443`의 모든 트래픽을 허용합니다. 다른 AWS 서비스와 통신할 필요가 없는 경우 자체 참조 보안 그룹 규칙을 사용하여 브로커에 대한 액세스를 제한할 수도 있습니다.
+ Amazon VPC 엔드포인트 인바운드 규칙 - Amazon VPC 엔드포인트를 사용하는 경우 Amazon VPC 엔드포인트와 연결된 보안 그룹이 브로커 보안 그룹에서 `443` 포트의 인바운드 트래픽을 허용해야 합니다.

브로커가 인증을 사용하는 경우 Secrets Manager 엔드포인트에 대한 엔드포인트 정책을 제한할 수도 있습니다. Secrets Manager API를 직접 호출하기 위해 Lambda는 Lambda 서비스 위탁자가 아닌 함수 역할을 사용합니다.

**Example VPC 엔드포인트 정책 — Secrets Manager 엔드포인트**  

```
{
      "Statement": [
          {
              "Action": "secretsmanager:GetSecretValue",
              "Effect": "Allow",
              "Principal": {
                  "AWS": [
                      "arn:aws::iam::123456789012:role/my-role"
                  ]
              },
              "Resource": "arn:aws::secretsmanager:us-west-2:123456789012:secret:my-secret"
          }
      ]
  }
```

Amazon VPC 엔드포인트를 사용하는 경우 AWS에서는 엔드포인트의 탄력적 네트워크 인터페이스(ENI)를 사용하여 함수를 간접 호출하도록 API 직접 호출을 라우팅합니다. Lambda 서비스 위탁자는 해당 ENI를 사용하는 모든 역할과 함수에서 `lambda:InvokeFunction`을 직접 호출해야 합니다.

기본적으로 Amazon VPC 엔드포인트에는 리소스에 대한 광범위한 액세스를 허용하는 개방형 IAM 정책이 있습니다. 모범 사례는 해당 엔드포인트를 사용하여 필요한 작업을 수행하도록 이러한 정책을 제한하는 것입니다. 이벤트 소스 매핑이 Lambda 함수를 간접 호출할 수 있도록 하려면 VPC 엔드포인트 정책에서 Lambda 서비스 위탁자가 `sts:AssumeRole` 및 `lambda:InvokeFunction`을 직접 호출할 수 있도록 허용해야 합니다. 조직 내에서 발생하는 API 직접 호출만 허용하도록 VPC 엔드포인트 정책을 제한하면 이벤트 소스 매핑이 제대로 작동하지 않으므로 이 정책에는 `"Resource": "*"`가 필요합니다.

다음 예제 VPC 엔드포인트 정책은 AWS STS 및 Lambda 엔드포인트에 대해 Lambda 서비스 위탁자에 필요한 액세스 권한을 부여하는 방법을 안내합니다.

**Example VPC 엔드포인트 정책 - AWS STS 엔드포인트**  

```
{
      "Statement": [
          {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
    }
```

**Example VPC 엔드포인트 정책 - Lambda 엔드포인트**  

```
{
      "Statement": [
          {
              "Action": "lambda:InvokeFunction",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
  }
```

## 이벤트 소스 매핑 생성
<a name="services-mq-eventsourcemapping"></a>

[이벤트 소스 매핑](invocation-eventsourcemapping.md)을 생성하여 Lambda가 Amazon MQ 브로커의 레코드를 Lambda 함수로 전송하도록 지시합니다. 여러 이벤트 소스 매핑을 생성하여 여러 함수로 동일한 데이터를 처리하거나, 단일 함수로 여러 소스의 항목을 처리할 수 있습니다.

Amazon MQ에서 읽도록 함수를 구성하려면 필요한 권한을 추가하고 Lambda 콘솔에서 **MQ** 트리거를 생성합니다.

Amazon MQ 브로커에서 레코드를 읽으려면, Lambda 함수에는 다음 권한이 필요합니다. 함수 [실행 역할](lambda-intro-execution-role.md)에 권한 문을 추가함으로써 Amazon MQ 브로커 및 기본 리소스와 상호 작용할 수 있는 권한을 Lambda에 부여합니다.
+ [mq:DescribeBroker](https://docs.aws.amazon.com/amazon-mq/latest/api-reference/brokers-broker-id.html#brokers-broker-id-http-methods)
+ [secretsmanager:GetSecretValue](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html)
+ [ec2:CreateNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html)
+ [ec2:DeleteNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInterface.html)
+ [ec2:DescribeNetworkInterfaces](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html)
+ [ec2:DescribeSecurityGroups](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html)
+ [ec2:DescribeSubnets](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.html)
+ [ec2:DescribeVpcs](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html)
+ [logs:CreateLogGroup](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html)
+ [logs:CreateLogStream](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogStream.html)
+ [logs:PutLogEvents](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html)

**참고**  
암호화된 고객 관리형 키를 사용하는 경우 `[kms:Decrypt](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn-bootstrap-brokers.html#clusters-clusterarn-bootstrap-brokersget)` 권한도 추가합니다.

**권한 추가 및 트리거 생성**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수의 이름을 선택합니다.

1. **구성(Configuration)** 탭을 선택한 다음, **권한(Permissions)**을 선택합니다.

1. **역할 이름**에서 실행 역할에 대한 링크를 선택합니다. 이 링크를 클릭하면 IAM 콘솔에서 역할이 열립니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/execution-role.png)

1. **권한 추가**를 선택하고 **인라인 정책 생성**을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/inline-policy.png)

1. **정책 편집기** 섹션에서 **JSON**을 선택합니다. 다음 정책을 입력합니다. 함수가 Amazon MQ 브로커에서 읽으려면 이러한 권한이 필요합니다.

------
#### [ JSON ]

****  

   ```
   {
       "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": "*"
         }
       ]
     }
   ```

------
**참고**  
암호화된 고객 관리형 키를 사용하는 경우 `kms:Decrypt` 권한도 추가해야 합니다.

1. **다음**을 선택합니다. 정책 이름을 입력한 후 **정책 생성**을 선택합니다.

1. Lambda 콘솔에서 함수로 돌아갑니다. **함수 개요(Function overview)**에서 **트리거 추가(Add trigger)**를 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/add-trigger.png)

1. **MQ** 트리거 유형을 선택합니다.

1. 필요한 옵션을 구성한 다음 **추가**를 선택합니다.

Lambda는 Amazon MQ 이벤트 소스에 대해 다음과 같은 옵션을 지원합니다.
+ **브로커** - Amazon MQ 브로커를 선택합니다.
+ **배치 크기(Batch size)** - 단일 배치에서 검색할 최대 메시지 수를 설정합니다.
+ **대기열 이름(Queue name)** - 사용할 Amazon MQ 대기열을 입력합니다.
+ **소스 액세스 구성** - 가상 호스트 정보 및 브로커 자격 증명을 저장하는 Secrets Manager 암호를 입력합니다.
+ **트리거 활성화** - 레코드 처리를 중지하려면 트리거를 비활성화합니다.

트리거를 활성화하거나 비활성화(또는 삭제)하려면 디자이너에서 **MQ** 트리거를 선택합니다. 트리거를 재구성하려면 이벤트 소스 매핑 API 작업을 사용합니다.

# 이벤트 소스 매핑 파라미터
<a name="services-mq-params"></a>

모든 Lambda 이벤트 소스 유형은 동일한 [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) 및 [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) API 작업을 공유합니다. 그러나 일부 파라미터만 Amazon MQ 및 RabbitMQ에 적용됩니다.


| 파라미터 | 필수 | 기본값 | 참고 | 
| --- | --- | --- | --- | 
|  BatchSize  |  N  |  100  |  최대값: 10,000  | 
|  활성  |  N  |  true  | 없음 | 
|  FunctionName  |  Y  | N/A  | 없음 | 
|  FilterCriteria  |  N  |  N/A   |  [Lambda가 함수로 보내는 이벤트에 대한 제어](invocation-eventfiltering.md)  | 
|  MaximumBatchingWindowInSeconds  |  N  |  500ms  |  [일괄 처리 동작](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching)  | 
|  대기열  |  N  | N/A |  소비할 Amazon MQ 브로커 대상 대기열의 이름입니다.  | 
|  SourceAccessConfigurations  |  N  | N/A  |  ActiveMQ의 BASIC\$1AUTH 자격 증명입니다. RabbitMQ는 BASIC\$1AUTH 자격 증명과 VIRTUAL\$1HOST 정보를 모두 포함할 수 있습니다.  | 

# Amazon MQ 이벤트 소스에서 이벤트 필터링
<a name="with-mq-filtering"></a>

이벤트 필터링을 사용하여 Lambda가 함수로 전송하는 스트림 또는 대기열의 레코드를 제어할 수 있습니다. 이벤트 필터링의 작동 방식에 대한 일반적인 내용은 [Lambda가 함수로 보내는 이벤트에 대한 제어](invocation-eventfiltering.md)을 참조하세요.

이 섹션에서는 Amazon MQ 이벤트 소스에 대한 이벤트 필터링에 중점을 둡니다.

**참고**  
Amazon MQ 이벤트 소스 매핑은 `data` 키에 대한 필터링만 지원합니다.

**Topics**
+ [Amazon MQ 이벤트 필터링 기본 사항](#filtering-AMQ)

## Amazon MQ 이벤트 필터링 기본 사항
<a name="filtering-AMQ"></a>

Amazon MQ 메시지 대기열에 유효한 JSON 형식 또는 일반 문자열의 메시지가 포함되어 있다고 가정해 보겠습니다. 예제 레코드는 다음과 같으며, 데이터는 `data` 필드에서 Base64로 인코딩된 문자열로 변환됩니다.

------
#### [ ActiveMQ ]

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

------
#### [ RabbitMQ ]

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

------

Active MQ 및 Rabbit MQ 브로커 모두에 이벤트 필터링을 사용하여 `data` 키로 레코드를 필터링할 수 있습니다. Amazon MQ 대기열에 다음 JSON 형식의 메시지가 포함되어 있다고 가정해 보겠습니다.

```
{
    "timeout": 0,
    "IPAddress": "203.0.113.254"
}
```

`timeout` 필드가 0보다 큰 레코드만 필터링하려는 경우 `FilterCriteria` 객체는 다음과 같습니다.

```
{
    "Filters": [
        {
            "Pattern": "{ \"data\" : { \"timeout\" : [ { \"numeric\": [ \">\", 0] } } ] } }"
        }
    ]
}
```

명확성을 더하기 위해 일반 JSON으로 확장된 필터의 `Pattern` 값은 다음과 같습니다.

```
{
    "data": {
        "timeout": [ { "numeric": [ ">", 0 ] } ]
        }
}
```

콘솔, AWS CLI 또는 AWS SAM 템플릿을 사용하여 필터를 추가할 수 있습니다.

------
#### [ Console ]

콘솔을 사용하여 이 필터를 추가하려면 [이벤트 소스 매핑에 필터 기준 연결(콘솔)](invocation-eventfiltering.md#filtering-console)의 지침을 따르고 **필터 기준**에 대해 다음 문자열을 입력합니다.

```
{ "data" : { "timeout" : [ { "numeric": [ ">", 0 ] } ] } }
```

------
#### [ AWS CLI ]

AWS Command Line Interface(AWS CLI)를 사용하여 이러한 필터 기준으로 새 이벤트 소스 매핑을 생성하려면 다음 명령을 실행합니다.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:mq:us-east-2:123456789012:broker:my-broker:b-8ac7cc01-5898-482d-be2f-a6b596050ea8 \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"timeout\" : [ { \"numeric\": [ \">\", 0 ] } ] } }"}]}'
```

이러한 필터 기준을 기존 이벤트 소스 매핑에 추가하려면 다음 명령을 실행합니다.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"timeout\" : [ { \"numeric\": [ \">\", 0 ] } ] } }"}]}'
```

이러한 필터 기준을 기존 이벤트 소스 매핑에 추가하려면 다음 명령을 실행합니다.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"timeout\" : [ { \"numeric\": [ \">\", 0 ] } ] } }"}]}'
```

------
#### [ AWS SAM ]

AWS SAM을 사용하여 이 필터를 추가하려면 이벤트 소스의 YAML 템플릿에 다음 코드 조각을 추가합니다.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "data" : { "timeout" : [ { "numeric": [ ">", 0 ] } ] } }'
```

------

Amazon MQ를 사용하면 메시지가 일반 문자열인 레코드를 필터링할 수도 있습니다. 메시지가 'Result:'로 시작하는 레코드만 처리하려고 한다고 가정해 보겠습니다. `FilterCriteria` 객체는 다음과 같습니다.

```
{
    "Filters": [
        {
            "Pattern": "{ \"data\" : [ { \"prefix\": \"Result: \" } ] }"
        }
    ]
}
```

명확성을 더하기 위해 일반 JSON으로 확장된 필터의 `Pattern` 값은 다음과 같습니다.

```
{
    "data": [
        {
        "prefix": "Result: "
        }
    ]
}
```

콘솔, AWS CLI 또는 AWS SAM 템플릿을 사용하여 필터를 추가할 수 있습니다.

------
#### [ Console ]

콘솔을 사용하여 이 필터를 추가하려면 [이벤트 소스 매핑에 필터 기준 연결(콘솔)](invocation-eventfiltering.md#filtering-console)의 지침을 따르고 **필터 기준**에 대해 다음 문자열을 입력합니다.

```
{ "data" : [ { "prefix": "Result: " } ] }
```

------
#### [ AWS CLI ]

AWS Command Line Interface(AWS CLI)를 사용하여 이러한 필터 기준으로 새 이벤트 소스 매핑을 생성하려면 다음 명령을 실행합니다.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:mq:us-east-2:123456789012:broker:my-broker:b-8ac7cc01-5898-482d-be2f-a6b596050ea8 \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : [ { \"prefix\": \"Result: \" } ] }"}]}'
```

이러한 필터 기준을 기존 이벤트 소스 매핑에 추가하려면 다음 명령을 실행합니다.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : [ { \"prefix\": \"Result: \" } ] }"}]}'
```

------
#### [ AWS SAM ]

AWS SAM을 사용하여 이 필터를 추가하려면 이벤트 소스의 YAML 템플릿에 다음 코드 조각을 추가합니다.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "data" : [ { "prefix": "Result " } ] }'
```

------

Amazon MQ 메시지는 UTF-8 인코딩 문자열이어야 하며, 일반 문자열이거나 JSON 형식이어야 합니다. 이는 Lambda가 필터 기준을 적용하기 전에 Amazon MQ 바이트 배열을 UTF-8로 디코딩하기 때문입니다. 메시지가 UTF-16 또는 ASCII와 같은 다른 인코딩을 사용하거나 메시지 형식이 `FilterCriteria` 형식과 일치하지 않는 경우 Lambda는 메타데이터 필터만 처리합니다. 다음 표에는 특정 동작이 요약되어 있습니다.


| 수신 메시지 형식 | 메시지 속성에 대한 필터 패턴 형식 | 결과적 작업 | 
| --- | --- | --- | 
|  일반 문자열  |  일반 문자열  |  Lambda는 필터 기준에 따라 필터링합니다.  | 
|  일반 문자열  |  데이터 속성에 대한 필터 패턴 없음  |  Lambda는 필터 기준에 따라(다른 메타데이터 속성에만 해당) 필터링합니다.  | 
|  일반 문자열  |  유효한 JSON  |  Lambda는 필터 기준에 따라(다른 메타데이터 속성에만 해당) 필터링합니다.  | 
|  유효한 JSON  |  일반 문자열  |  Lambda는 필터 기준에 따라(다른 메타데이터 속성에만 해당) 필터링합니다.  | 
|  유효한 JSON  |  데이터 속성에 대한 필터 패턴 없음  |  Lambda는 필터 기준에 따라(다른 메타데이터 속성에만 해당) 필터링합니다.  | 
|  유효한 JSON  |  유효한 JSON  |  Lambda는 필터 기준에 따라 필터링합니다.  | 
|  UTF-8이 아닌 인코딩 문자열  |  JSON, 일반 문자열 또는 패턴 없음  |  Lambda는 필터 기준에 따라(다른 메타데이터 속성에만 해당) 필터링합니다.  | 

# Amazon MQ 이벤트 소스 매핑 오류에 대한 문제 해결
<a name="services-mq-errors"></a>

Lambda 함수에 복구할 수 없는 오류가 발생하면 Amazon MQ 소비자가 레코드 처리를 중지합니다. 다른 소비자는 동일한 오류가 발생하지 않는 한 처리를 계속할 수 있습니다. 중지된 소비자의 잠재적 원인을 확인하려면 `StateTransitionReason`의 반환 세부 정보에서 다음 코드 중 하나에 대한 `EventSourceMapping` 필드를 확인하세요.

**`ESM_CONFIG_NOT_VALID`**  
이벤트 소스 매핑 구성이 잘못되었습니다.

**`EVENT_SOURCE_AUTHN_ERROR`**  
Lambda가 이벤트 소스를 인증하지 못했습니다.

**`EVENT_SOURCE_AUTHZ_ERROR`**  
Lambda에게 이벤트 소스에 액세스하는 데 필요한 권한이 없습니다.

**`FUNCTION_CONFIG_NOT_VALID`**  
함수의 구성이 유효하지 않습니다.

Lambda가 크기 때문에 레코드를 버리는 경우에도 레코드가 처리되지 않습니다. Lambda 레코드의 크기 제한은 6MB입니다. 함수 오류 시 메시지를 다시 전달하려면 배달 못한 편지 대기열(DLQ)을 사용할 수 있습니다. 자세한 내용은 Apache ActiveMQ 웹 사이트에서 [Message Redelivery and DLQ Handling](https://activemq.apache.org/message-redelivery-and-dlq-handling)을, RabbitMQ에서 [Reliability Guide](https://www.rabbitmq.com/reliability.html)를 참조하세요.

**참고**  
Lambda는 사용자 정의 재전달 정책을 지원하지 않습니다. 그 대신 Lambda는 Apache ActiveMQ 웹사이트의 [정책 재전달](https://activemq.apache.org/redelivery-policy) 페이지에 있는 기본값(`maximumRedeliveries`를 6으로 설정)을 사용한 정책을 사용합니다.