0

我创建了一个 Amazon MQ 代理:

  • 选择代理引擎:RabbitMQ 3.8.6
  • 单实例代理
  • 网络和安全:公共访问
  • VPC 和子网:使用默认 VPC 和子网

我尝试了两个库:来自 RabbitMQ 手册和 Enqueue\AmqpExt

他们中的任何一个都无法连接到亚马逊(使用 docker 容器一切正常。但我想尝试 AMAZON MQ。

我使用了下面的代码:

    use Enqueue\AmqpExt\AmqpConnectionFactory;
    use PhpAmqpLib\Connection\AMQPSSLConnection;

    $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 证书。

如果是这样,如何解决?

4

4 回答 4

2

我在 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.

于 2021-03-26T08:51:06.833 回答
0

@Eugene K 在子评论中回答:

您需要将 DSN 添加到 SSLOptions 数组,并且您需要使用 AMQPSSLConnection 而不是 AMQPStreamConnection

        $this->connection = new AMQPSSLConnection(
        'myhost.mq.eu-west-1.amazonaws.com',
        '5671',
        'username',
        'xxx',
        '/',
        [
            'dsn' => 'amqps:'
        ]
    );
于 2021-09-21T09:25:54.757 回答
0

我看到你安装了 amqp-ext 并使用它的 ConnectionFactory

use Enqueue\AmqpExt\AmqpConnectionFactory;

如果您使用 php-enqueue 并想连接到 AWS AMQ RabbitMQ,您应该安装并使用enqueue/amqp-lib而不是enqueue/amqp-ext

和连接细节

use Enqueue\AmqpLib\AmqpConnectionFactory;

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,

]);
于 2021-03-18T22:24:16.847 回答
0

Amazon MQ 代理(特别是 RabbitMQ)默认使用 SSL(您可以注意到连接字符串以 开头amqps,而不是amqp

在您的情况下,您应该设置为 truessl_onssl_verifyoptions

于 2020-11-19T11:37:30.370 回答