RabbitMQ 브로커 생성 및 연결 - Amazon MQ

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

RabbitMQ 브로커 생성 및 연결

브로커는 Amazon MQ에서 실행하는 메시지 브로커 환경입니다. 이 인스턴스는 Amazon MQ의 기본 빌딩 블록입니다. 브로커 인스턴스 클래스(m5, t3) 및 크기(large, micro)의 설명 조합은 브로커 인스턴스 유형(예: mq.m5.large)입니다.

1단계: RabbitMQ 브로커 생성

가장 먼저 이루어지고 가장 흔한 Amazon MQ 태스크는 브로커를 생성하는 것입니다. 다음 예제는 를 사용하여 기본 브로커를 만드는 AWS Management Console 방법을 보여줍니다.

  1. Amazon MQ 콘솔에 로그인합니다.

  2. Select broker engine(브로커 엔진 선택) 페이지에서 RabbitMQ를 선택한 후 Next(다음)를 선택합니다.

  3. Select deployment mode(배포 모드 선택) 페이지에서 Deployment mode(배포 모드)(예: Cluster deployment(클러스터 배포))를 선택한 후 Next(다음)를 선택합니다.

    • 단일 인스턴스 브로커는 Network Load Balancer (NLB) 뒤에서 하나의 가용 영역에 있는 하나의 브로커로 구성됩니다. 브로커는 애플리케이션 및 Amazon EBS 스토리지 볼륨과 통신합니다. 자세한 정보는 단일 인스턴스 브로커을 참조하세요.

    • 고가용성을 위한 RabbitMQ 클러스터 배포는 Network Load Balancer 뒤에 있는 3개의 RabbitMQ 브로커 노드(각각 사용자, 대기열 및 여러 가용 영역(AZ) 간에 분산된 상태 공유)로 이루어진 논리적 그룹입니다. 자세한 정보는 고가용성을 위한 클러스터 배포을 참조하세요.

  4. Configure settings(설정 구성) 페이지의 Details(세부 정보) 섹션에서 다음을 수행합니다.

    1. Broker name(브로커 이름)을 입력합니다.

      중요

      개인 식별 정보(PII)나 기타 기밀 정보 또는 민감한 정보를 브로커 이름에 추가하지 마십시오. 브로커 이름은 CloudWatch 로그를 포함한 다른 AWS 서비스에서 액세스할 수 있습니다. 브로커 이름은 개인 데이터나 민감한 데이터에 사용하기 위한 것이 아닙니다.

    2. Broker instance type(브로커 인스턴스 유형)을 선택합니다(예: mq.m5.large). 자세한 설명은 Broker instance types 섹션을 참조하세요.

    참고

    추가 설정 섹션에서는 CloudWatch 로그를 활성화하고 브로커에 대한 네트워크 액세스를 구성하는 옵션을 제공합니다. 퍼블릭 액세스 가능성이 없는 프라이빗 RabbitMQ 브로커를 생성하는 경우 Virtual Private Cloud(VPC)를 선택하고 브로커에 액세스하도록 보안 그룹을 구성해야 합니다.

  5. Configure settings(설정 구성) 페이지의 RabbitMQ access(RabbitMQ 액세스) 섹션에서 Username(사용자 이름)Password(암호)를 입력합니다. 브로커 로그인 보안 인증 정보에 다음 제한이 적용됩니다.

    • 사용자 이름은 영숫자, 대시, 마침표 및 밑줄(- . _)만 포함할 수 있습니다. 이 값에 물결표(~) 문자를 포함하면 안 됩니다. Amazon MQ에서는 guest를 사용자 이름으로 사용할 수 없습니다.

    • 암호는 최소 12자 길이이고 최소 4개의 고유 문자가 있어야 하며 쉼표, 콜론 또는 등호(,:=)는 포함할 수 없습니다.

    중요

    개인 식별 정보(PII)나 기타 기밀 정보 또는 민감한 정보를 브로커 사용자 이름에 추가하지 마십시오. 브로커 사용자 이름은 CloudWatch 로그를 포함한 다른 AWS 서비스에서 액세스할 수 있습니다. 브로커 사용자 이름은 개인 데이터나 민감한 데이터에 사용하기 위한 것이 아닙니다.

  6. 다음을 선택합니다.

  7. Review and create(검토 및 생성) 페이지에서 선택 항목을 확인하고 필요한 경우 편집합니다.

  8. Create broker(브로커 생성)를 선택합니다.

    Amazon MQ에서 브로커를 생성하는 동안 Creation in progress(생성 진행 중) 상태가 표시됩니다.

    브로커 생성은 약 15분 정도 소요됩니다.

    브로커가 생성되면 Amazon MQ에서 Running(실행 중) 상태가 표시됩니다.

  9. 선택하세요 MyBroker.

    MyBroker페이지의 Connect 섹션에서 브로커의 RabbitMQ 웹 콘솔 URL을 기록해 둡니다. 예를 들면 다음과 같습니다.

    https://b-c8349341-ec91-4a78-ad9c-a57f23f235bb.mq.us-west-2.amazonaws.com

    또한 브로커의 보안 AMQP 엔드포인트도 기록합니다. 다음은 리스너 포트 5671을 노출하는 amqps 엔드포인트 예제입니다.

    amqps://b-c8349341-ec91-4a78-ad9c-a57f23f235bb.mq.us-west-2.amazonaws.com:5671

2단계: 브로커에 Java 기반 애플리케이션 연결

RabbitMQ 브로커를 생성한 후 애플리케이션을 브로커에 연결할 수 있습니다. 다음 예제에서는 RabbitMQ Java 클라이언트 라이브러리를 사용하여 브로커에 대한 연결을 생성하고, 대기열을 생성하고, 메시지를 전송하는 방법을 보여줍니다. 다양한 언어로 지원되는 RabbitMQ 클라이언트 라이브러리를 사용하여 RabbitMQ 브로커에 연결할 수 있습니다. 지원되는 RabbitMQ 클라이언트 라이브러리에 대한 자세한 내용은 RabbitMQ 클라이언트 라이브러리 및 개발자 도구를 참조하세요.

필수 조건

참고

다음의 사전 필수 단계는 퍼블릭 액세스 가능성 없이 생성된 RabbitMQ 브로커에만 적용됩니다. 퍼블릭 액세스 가능성이 있는 브로커를 생성하는 경우에는 건너뛸 수 있습니다.

VPC 속성 활성화

VPC 내에서 브로커에 액세스할 수 있도록 하려면 enableDnsHostnamesenableDnsSupport VPC 속성을 활성화해야 합니다. 자세한 내용은 Amazon VPC 사용 설명서VPC에서 DNS 지원을 참조하세요.

인바운드 연결 활성화

  1. Amazon MQ 콘솔에 로그인합니다.

  2. 브로커 목록에서 브로커 이름 (예:) 을 선택합니다. MyBroker

  3. MyBroker페이지의 연결 섹션에서 브로커 웹 콘솔 URL 및 유선 수준 프로토콜의 주소와 포트를 기록해 둡니다.

  4. 세부 정보 섹션의 보안 및 네트워크에서 보안 그룹의 이름 또는 을 선택합니다.

    EC2 Dashboard의 보안 그룹 페이지가 표시됩니다.

  5. 보안 그룹 목록에서 보안 그룹을 선택합니다.

  6. 페이지 하단에서 인바운드를 선택한 후 편집을 선택합니다.

  7. Edit inbound rules(인바운드 규칙 편집) 대화 상자에서 공개적으로 액세스하고자 하는 모든 URL 또는 엔드포인트에 대한 규칙을 추가합니다. 다음 예제에서는 브로커 웹 콘솔에 대해 이 작업을 수행하는 방법을 보여줍니다.

    1. 규칙 추가(Add Rule)를 선택합니다.

    2. 유형에서 Custom TCP(사용자 지정 TCP)를 선택합니다.

    3. Source(소스)에서 Custom(사용자 지정)을 선택한 상태에서 웹 콘솔에 액세스하는 데 사용할 시스템의 IP 주소(예: 192.0.2.1)를 입력합니다.

    4. 저장을 선택합니다.

      이제 브로커가 인바운드 연결을 허용할 수 있습니다.

Java 종속성 추가

빌드 자동화를 위해 Apache Maven을 사용하는 경우 pom.xml 파일에 다음 종속성을 추가합니다. Apache Maven의 Project Object Model 파일에 대한 자세한 내용은 POM 소개를 참조하세요.

<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.9.0</version> </dependency>

빌드 자동화에 Gradle을 사용하는 경우 다음 종속성을 선언합니다.

dependencies { compile 'com.rabbitmq:amqp-client:5.9.0' }

ConnectionChannel 클래스 가져오기

RabbitMQ Java 클라이언트는 각각 AMQP 0-9-1 연결 및 채널을 나타내는 ConnectionChannel API 클래스가 포함된 com.rabbitmq.client를 최상위 패키지로 사용합니다. ConnectionChannel 클래스를 사용하려면 다음 예제와 같이 먼저 가져옵니다.

import com.rabbitmq.client.Connection; import com.rabbitmq.client.Channel;

ConnectionFactory 생성 및 브로커에 연결

다음 예제에 따라 지정된 파라미터를 사용하여 ConnectionFactory 클래스의 인스턴스를 생성합니다. setHost 메서드를 사용하여 앞서 기록한 브로커 엔드포인트를 구성합니다. AMQPS 와이어 레벨 연결에는 포트 5671을 사용합니다.

ConnectionFactory factory = new ConnectionFactory(); factory.setUsername(username); factory.setPassword(password); //Replace the URL with your information factory.setHost("b-c8352341-ec91-4a78-ad9c-a43f23d325bb.mq.us-west-2.amazonaws.com"); factory.setPort(5671); // Allows client to establish a connection over TLS factory.useSslProtocol(); // Create a connection Connection conn = factory.newConnection(); // Create a channel Channel channel = conn.createChannel();

교환에 메시지 게시

Channel.basicPublish를 사용하여 메시지를 교환에 게시할 수 있습니다. 다음 예제에서는 AMQP Builder 클래스를 사용하여 콘텐츠 유형이 plain/text인 메시지 속성 객체를 빌드합니다.

byte[] messageBodyBytes = "Hello, world!".getBytes(); channel.basicPublish(exchangeName, routingKey, new AMQP.BasicProperties.Builder() .contentType("text/plain") .userId("userId") .build(), messageBodyBytes);
참고

BasicProperties는 자동 생성된 소유자 클래스의 내부 클래스인 AMQP입니다.

대기열 구독 및 메시지 수신

Consumer 인터페이스를 통해 대기열을 구독하여 메시지를 수신할 수 있습니다. 구독하면 도착하는 메시지가 자동으로 배달됩니다.

Consumer를 구현하는 가장 쉬운 방법은 하위 클래스 DefaultConsumer를 사용하는 것입니다. 다음 예제와 같이 DefaultConsumer 객체를 basicConsume 호출의 일부로 전달하여 구독을 설정할 수 있습니다.

boolean autoAck = false; channel.basicConsume(queueName, autoAck, "myConsumerTag", new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String routingKey = envelope.getRoutingKey(); String contentType = properties.getContentType(); long deliveryTag = envelope.getDeliveryTag(); // (process the message components here ...) channel.basicAck(deliveryTag, false); } });
참고

autoAck = false를 지정했으므로 Consumer에 배달된 메시지를 승인해야 하며, 예제와 같이 handleDelivery 메서드에서 수행하면 가장 간편합니다.

연결 닫기 및 브로커와 연결 끊기

RabbitMQ 브로커와 연결을 끊으려면 다음과 같이 채널과 연결을 모두 닫습니다.

channel.close(); conn.close();
참고

RabbitMQ Java 클라이언트 라이브러리를 사용하는 방법에 대한 자세한 내용은 RabbitMQ Java 클라이언트 API 가이드를 참조하세요.

3단계: (선택 사항) 함수에 연결 AWS Lambda

AWS Lambda Amazon MQ 브로커에 연결하여 메시지를 사용할 수 있습니다. 브로커를 Lambda에 연결할 때는 대기열에서 메시지를 읽고 함수를 동기식으로 호출하는 이벤트 소스 매핑을 생성합니다. 생성하는 이벤트 소스 매핑은 메시지를 브로커에서 배치로 읽고 JSON 객체 형식의 Lambda 페이로드로 변환합니다.

브로커를 Lambda 함수에 연결하려면
  1. Lambda 함수 실행 역할에 다음 IAM 역할 권한을 추가합니다.

    참고

    필요한 IAM 권한이 없으면 함수가 Amazon MQ 리소스의 레코드를 성공적으로 읽을 수 없습니다.

  2. (선택 사항) 퍼블릭 액세스 가능성이 없는 브로커를 생성한 경우 다음 중 하나를 수행하여 Lambda가 브로커에 연결하도록 허용해야 합니다.

    • 퍼블릭 서브넷당 하나의 NAT 게이트웨이를 구성합니다. 자세한 내용은 AWS Lambda 개발자 안내서에서 VPC 연결 함수의 인터넷 및 서비스 액세스를 참조하세요.

    • VPC 엔드포인트를 사용하여 Amazon Virtual Private Cloud(Amazon VPC)와 Lambda 간의 연결을 생성합니다. 또한 Amazon VPC는 AWS Security Token Service (AWS STS) 및 Secrets Manager 엔드포인트에 연결해야 합니다. 자세한 내용은 AWS Lambda 개발자 안내서에서 Lambda에 대한 인터페이스 VPC 엔드포인트 구성을 참조하세요.

  3. AWS Management Console을 사용하여 Lambda 함수에 대해 브로커를 이벤트 소스로 구성합니다. 명령을 사용할 수도 있습니다. create-event-source-mapping AWS Command Line Interface

  4. 브로커에서 소비한 메시지를 Lambda 함수가 처리하는 코드를 작성합니다. 이벤트 소스 매핑에서 검색되는 Lambda 페이로드는 브로커의 엔진 유형에 따라 다릅니다. 다음은 RabbitMQ용 Amazon MQ 대기열의 Lambda 페이로드 예제입니다.

    참고

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

    { "eventSource": "aws:rmq", "eventSourceArn": "arn:aws:mq:us-west-2:112556298976:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8", "rmqMessagesByQueue": { "test::/": [ { "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==" } ] } }

Amazon MQ를 Lambda에 연결하는 방법, Amazon MQ 이벤트 소스에 대해 Lambda가 지원하는 옵션 및 이벤트 소스 매핑 오류에 대한 자세한 내용은 AWS Lambda 개발자 안내서에서 Amazon MQ에서 Lambda 사용을 참조하세요.

4단계: 브로커 삭제

Amazon MQ 브로커를 사용하지 않는 경우 (그리고 가까운 장래에 사용할 것으로 예상되지 않는 경우) Amazon MQ에서 브로커를 삭제하여 비용을 절감하는 것이 가장 좋습니다. AWS

다음 예제에서는 AWS Management Console을 사용하여 브로커를 삭제하는 방법을 보여줍니다.

  1. Amazon MQ 콘솔에 로그인합니다.

  2. 브로커 목록에서 브로커 (예: MyBroker) 를 선택한 다음 삭제를 선택합니다.

  3. 삭제 시 MyBroker? 대화 상자에서 delete 를 입력한 다음 삭제를 선택합니다.

    브로커 삭제는 약 5분 정도 소요됩니다.

다음 단계

이제 브로커를 만들고, 애플리케이션을 브로커에 연결하고, 메시지를 보내고 받았으므로 다음과 같이 할 수 있습니다.

또한 Amazon MQ 모범 사례Amazon MQ REST API를 자세히 알아본 다음, Amazon MQ로 마이그레이션하기 위한 계획을 세울 수 있습니다.