Не удается подключиться к RabbitMQ на Amazon MQ

#php #amazon-web-services #rabbitmq #amazon-mq

#php #amazon-веб-сервисы #rabbitmq #amazon-mq

Вопрос:

Я создал брокера Amazon MQ:

  • Выберите механизм брокера: RabbitMQ 3.8.6
  • Брокер с одним экземпляром
  • Сеть и безопасность: общедоступный доступ
  • VPC и подсети: используйте VPC и подсети по умолчанию

Я пробовал две библиотеки: из RabbitMQ manual и Enqueue AmqpExt

Ни один из них не может подключиться к Amazon (с контейнером docker все работает нормально. Но я хочу попробовать AMAZON MQ.

Я использовал приведенный ниже код:

     use EnqueueAmqpExtAmqpConnectionFactory;
    use PhpAmqpLibConnectionAMQPSSLConnection;

    $connectionFactory = new AmqpConnectionFactory([
        'host'      => 'b-da219bXXXXXXXXXXXX86a.mq.us-east-1.amazonaws.com',
        'port'      => 5671,
        'vhost'     => '/',
        'user'      => 'xxxx',    
        'pass'      => 'xxxx', // I can login with this to rabbit admin panel
        'persisted' => false,
        'ssl_on' => false,
        'ssl_verify' => false,
    ]);

    $c = $connectionFactory->createContext();

    $queue = $c->createQueue('emails');
    $c->declareQueue($queue);
  

Результат:

   Library error: connection closed unexpectedly - Potential login failure.
  

С ‘ssl_on’ => true та же ошибка.

Я не знаю, может ли это произойти, потому что я не предоставил ssl-сертификат Amazon.

Если да, то как это исправить?

Ответ №1:

У меня был успех с php-amqplib, и я на самом деле не использую новейшую версию (я на версии v2.12.3). Я могу подключиться, используя это:

 $connection = new AMQPSSLConnection($host, $port, $user, $pass, $vhost, ['verify_peer_name' => false], [], 'ssl');
  

Я обнаружил, что мне нужно было установить 'verify_peer_name' => false , иначе я просто получил unable to connect to ssl://localhost:5671 (Unknown error) ошибку, но я также перенаправлял порты localhost .

Ответ №2:

Брокер Amazon MQ (в частности, RabbitMQ) по умолчанию использует SSL (вы можете заметить, что строка подключения начинается с amqps , а не amqp

В вашем случае вы должны установить значение true ssl_on и ssl_verify параметры

Комментарии:

1. Это была моя первая конфигурация (без ssl).

2. Вы пытались установить 'dsn' => 'amqps:' параметры?

3. Нет. Можете ли вы порекомендовать библиотеку PHP, которая работает? Я думаю, что это проблема с ними: Enqueue AmqpExt AmqpConnectionFactory amp;amp; PhpAmqpLib Connection AMQPSSLConnection

4. @EugeneK Вы нашли какую-нибудь библиотеку PHP, которая может работать с протоколом «amqps», я получаю эту ошибку Unable to find the socket transport "amqp" - did you forget to enable it when you configured PHP?

Ответ №3:

Я вижу, что вы установили amqp-ext и используете его ConnectionFactory

use EnqueueAmqpExtAmqpConnectionFactory; но

Если вы используете php-enqueue и хотите подключиться к AWS AMQ RabbitMQ, вам следует установить и использовать enqueue/amqp-lib вместо enqueue / amqp-ext

и сведения о подключении

 use EnqueueAmqpLibAmqpConnectionFactory;

new AmqpConnectionFactory([

    'host' => env('RABBITMQ_HOST'),
    'port' => env('RABBITMQ_PORT', 5672),
    'vhost' => env('RABBITMQ_DEFAULT_VHOST'),
    'user' => env('RABBITMQ_USERNAME'),
    'pass' => env('RABBITMQ_PASSWORD'),
    'persisted' => false,
    'ssl_on' => true,
    'ssl_verify' => true,

]);
  

Ответ №4:

Ответил @Eugene K в комментарии:

Вам нужно добавить DSN в массив SSLOptions, и вам нужно использовать AMQPSSLConnection вместо AMQPStreamConnection

         $this->connection = new AMQPSSLConnection(
        'myhost.mq.eu-west-1.amazonaws.com',
        '5671',
        'username',
        'xxx',
        '/',
        [
            'dsn' => 'amqps:'
        ]
    );
  

Комментарии:

1. Попробовав десятки решений, найденных в Интернете, это единственное решение, которое мне помогло.