AWS 中的 Symfony RabbitMQ Bundle(托管服务):有什么方法可以让它正常工作?

Symfony RabbitMQ Bundle in AWS (managed service): Any way to get this working?

我们确实尝试了很多,但它仍然无法在 AWS 中获取 Symfony RabbitMQ 包 (https://github.com/php-amqplib/RabbitMqBundle) 运行(使用 Docker)。 AWS只允许在AWS托管服务中打开AMQPS和端口5671。

这是我们当前的详细配置:

old_sound_rabbit_mq:
    connections:
        default:
            # nevermind
        secure:
            url: 'amqps://%env(RABBITMQ_USER)%:%env(RABBITMQ_PASSWORD)%@%env(RABBITMQ_HOST)%:%env(RABBITMQ_PORT)%'
            vhost: '%env(RABBITMQ_VHOST)%'
            lazy: true
            connection_timeout: 6
            read_write_timeout: 6
            ssl_context:
                verify_peer: false
            keepalive: true
            heartbeat: 60
            use_socket: true # default false
    producers:
        # use 'old_sound_rabbit_mq.[my-producer-name]_producer' service to send data.
        article_create:
            connection: secure
            exchange_options: { name: pimcore.article.create, type: topic }
            queue_options:
                name: article_create

请注意,我们使用“url”配置值,因为它似乎是为捆绑包设置 AMQPS 的唯一方法。

docker-compose.yml的相关部分:

    php-fpm:
        container_name: php-fpm
        environment:
            - RABBITMQ_HOST=my-rabbitmq # usually the docker container (otherwise localhost or server address)
            - RABBITMQ_PORT=5671 # locally it seems to work with 5672
            - RABBITMQ_USER=user
            - RABBITMQ_PASSWORD=password
            - RABBITMQ_VHOST=/
    rabbitmq:
        container_name: my-rabbitmq
        image: rabbitmq:3.8-management
        ports:
            - 127.0.0.1:15672:15672
            - 127.0.0.1:5672:5672
            - 127.0.0.1:5671:5671
        environment:
            - RABBITMQ_DEFAULT_USER=pimcore
            - RABBITMQ_DEFAULT_PASS=pimcore
        volumes:
            - rabbitmq:/var/lib/rabbitmq

这是从 Symfony 事件监听器发送消息的方式:

            $this->appKernel->getContainer()->get('old_sound_rabbit_mq.article_create_producer')->publish(
                serialize($objToSend),
                "article_create",
                [
                    'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT,
                    'message_id' => md5(uniqid("prefix", true))
                ]
            );

这一切似乎都在本地运行,没有任何问题。在 AWS 中,我们收到以下错误:

不带插座:

Broken pipe or closed connection

带插座:

[2021-06-08 15:59:45] request.CRITICAL: Uncaught PHP Exception ErrorException: "Warning: socket_recv(): unable to read from socket [104]: Connection reset by peer" at /var/www/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Wire/IO/SocketIO.php line 121 {"exception":"[object] (ErrorException(code: 0): Warning: socket_recv(): unable to read from socket [104]: Connection reset by peer at /var/www/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Wire/IO/SocketIO.php:121)"} []

终于解决了 - 您必须使用带有 SSL 选项的自定义 AMQPConnection 定义自定义 AMQPChannel,然后将此 AMQPChannel 设置为生产者:

// SSL
if ($port === 5671) {
    $sslOptions = array(
        'cafile' => CERTS_PATH . '/ca_certificate.pem',
        'local_cert' => CERTS_PATH . '/client_certificate.pem',
        'local_pk' => CERTS_PATH . '/client_key.pem',
        'verify_peer' => true,
        'verify_peer_name' => false,
    );
    $amqpSslConnection = new AMQPSSLConnection(
        getenv('RABBITMQ_HOST'),
        $port,
        getenv('RABBITMQ_USER'),
        getenv('RABBITMQ_PASSWORD'),
        getenv('RABBITMQ_VHOST'),
        $sslOptions
    );
    $amqpChannel = new AMQPChannel($amqpSslConnection);
    $producer->setChannel($amqpChannel);
    return $producer;
}

可能晚了但是。

对于与 Aws MQ (Rabbit) 的 SSL 连接,您需要在路径中添加 .perm。

'%env(MESSENGER_TRANSPORT_DSN)%cacert=%env(resolve:MESSENGER_TRANSPORT_CERT)%'

你可以在这个 aws 烫发 url: AmazonRootCA1.pem

希望对您有所帮助。